Tim's Web Home

Btrfs Swapfile on the T website

Btrfs Swapfile:

在 Btrfs 中使用 swap 文件,并设置休眠.

  • 为交换文件创建一个专用的 Btrfs 子卷,以便从快照中排除交换文件
      root # btrfs subvolume create /btrfs-root/@swap
    
  • 在交换子卷上设置适当的权限,以便只有所有者(在本例中为 root 用户)才能访问该子卷
      root # chmod 700 /btrfs-root/@swap
    
  • 创建一个目录,用于挂载交换子卷
      root # mkdir /.swap
    
  • 将子卷添加到/etc/fstab
      root # vim /etc/fstab
    
     file     /etc/fstab
      UUID=xxxxxx-xxxxxx-xxxxxx  /.swap  btrfs  defaults,noatime,nospace_cache,nodatacow,subvolid=xxx,subvol=/@swap 0 0
    
  • 现在根据 fstab 中添加的规则挂载交换子卷
      root # mount /.swap
    
  • 在交换子卷中创建一个空的交换文件
      root # truncate -s 0 /.swap/swapfile
    
  • 禁用交换文件的写时复制
      root # chattr +C /.swap/swapfile
    
  • 确保禁用对交换文件的压缩
      root # btrfs property set /.swap/swapfile compression none
    
  • 给交换文件分配与系统上的 RAM 一样多的空间
      root # fallocate -l 16G /.swap/swapfile
    
  • 只允许交换文件的所有者,root 用户访问,以防止窥探
      root # chmod 0600 /.swap/swapfile
    
  • 初始化交换文件
      root # mkswap -L BTRFSSWAP /.swap/swapfile
    
  • 启用交换文件
      root # swapon /.swap/swapfile
    
  • 将交换文件添加到 /etc/fstab ,以便在启动系统时自动初始化它
      root # echo "/.swap/swapfile none swap defaults 0 0" | sudo tee -a /etc/fstab
    
  • 验证 /etc/fstab 中没有错误
      root # findmnt --verify --verbose
    
  • 配置休眠
  • 配置 initramfs
      #修改/etc/mkinitcpio.conf ,增加 resume 钩子
      root # vim /etc/mkinitcpio.conf
      #重新生成initramfs
      root # mkinitcpio -p linux-lts
      root # mkinitcpio -p linux
    
     file     /etc/mkinitcpio.conf
      HOOKS=(base udev autodetect modconf block filesystems keyboard btrfs shutdown resume)
    
  • 添加内核参数, btrfs_map_physical.c 下载地址 : https://github.com/osandov/osandov-linux/raw/master/scripts/btrfs_map_physical.c
      #可用此命令获取 swap_device_uuid
      root # findmnt -no UUID -T /.swap/swapfile
    
      #可用此命令获取 swap_file_offset
      root # filefrag -v /.swap/swapfile | awk '$1=="0:" {print substr($4, 1, length($4)-2)}'
      #如果是btrfs的swapfile,则使用以下方式
      #下载编译 btrfs_map_physical.c
      root # gcc -O2 -o btrfs_map_physical btrfs_map_physical.c
      root # ./btrfs_map_physical /.swap/swapfile
      #用此公式计算: resume_offset = physical offset / PAGESIZE
      #内核是6.1以上的,可用此命令直接获取swap_file_offset
      root # btrfs inspect-internal map-swapfile -r /.swap/swapfile
      #修改/etc/default/grub,添加resume=UUID=swap_device_uuid,resume_offset=swap_file_offset
      #更新启动配置文件
      root # grub-mkconfig -o /boot/grub/grub.cfg
    
     file     /etc/mkinitcpio.conf
      GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 resume=UUID=xxxxxx-xxxxxx-xxxxxx resume_offset=xxxxxx"
    

版权声明

本文作者是一位开源理念的坚定支持者,所以本文内容遵照开源的精神发布。
无担保:本文作者不保证此文内容准确无误,亦不承担任何由于使用此文档所导致的损失。
自由使用:任何人都可以自由的阅读/链接/打印此文档,无需任何附加条件。
名誉权:任何人都可以自由的转载/引用/再创作此文档,但必须保留作者署名并注明出处。
其他作品
本文作者十分愿意与他人分享劳动成果,如果你对我的其他作品有兴趣,可以在如下位置查看现有的作品集:
Tim 作品集 [ https://tiimmm.com/ ]
联系方式
由于作者水平有限,因此不能保证此文内容准确无误。如果你发现了此文中的错误(哪怕是错别字也好),请来信指出,任何提高此文质量的建议我都将虚心接纳。
Email: tiimmm dot chen at gmail dot com



网站制作者:Author:tiimmm dot chen at gmail dot com, Welcome to email for discussion!



T站勉强运行341天2时0分18秒
多伦多时间:2024-05-20 Monday 00:33:33 AM