在具有 Btrfs 文件系统的 Debian Squeeze 系统上运行时,此操作序列有什么问题?
$ dd if=/dev/zero of=swapfile2 bs=1024 count=524288
$ sudo mkswap swapfile2
$ sudo chown root:root swapfile2
$ sudo chmod 0600 swapfile2
$ sudo swapon -v -f swapfile2
swapon on swapfile2
swapon: /home/mathieu/swapfile2: found swap signature: version 1, page-size 4, same byte order
swapon: /home/mathieu/swapfile2: pagesize=4096, swapsize=536870912, devsize=536870912
swapon: swapfile2: swapon failed: Invalid argument
我的文件系统是:
$ mount
/dev/mapper/voxbox-root on / type btrfs (rw)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/mapper/voxbox-boot on /boot type ext2 (rw)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
答案1
答案2
在 Linux 内核 5.0.0 中,btrfs 现在原生支持 swapfile。(必须将其设置为 no-COW)
以下是来自 kernel.org 的一些信息:https://btrfs.wiki.kernel.org/index.php/FAQ#Does_btrfs_support_swap_files.3F
从内核 5.0 开始,btrfs 具有原生交换文件支持,但有一些限制。交换文件 - 必须完全分配为 NOCOW,且在一个设备上不进行压缩。
此链接显示了如何操作: https://wiki.archlinux.org/index.php/swap#Swap_file。
请勿在 Linux <4.21 中尝试此操作!
警告:Linux 内核 5.0 之前的 Btrfs 不支持交换文件。不遵守此警告可能会导致文件系统损坏。虽然通过循环设备安装时可以在 Btrfs 上使用交换文件,但这会导致交换性能严重下降。
答案3
不正常关机后,我得到了神秘的错误。唯一的解决办法是删除旧的交换文件并重新创建它。
与 btrfs 一样,也存在某些限制(例如必须禁用写时复制),我建议按照建筑维基(我复制了创建 512M 交换的步骤,但请在执行之前阅读其文档):
# truncate -s 0 /swapfile
# chattr +C /swapfile
# btrfs property set /swapfile compression none
# fallocate -l 512M /swapfile
# chmod 600 /swapfile
# mkswap /swapfile
现在swapon /swapfile
应该成功了。
如果没有,请确保内核至少为 5.0,因为早期的内核交换文件在 btrfs 中不受支持(来源:btrfs 常见问题解答):
从内核 5.0 开始,btrfs 具有原生交换文件支持,但有一些限制。交换文件 - 必须完全分配为 NOCOW,且在一个设备上不进行压缩。
对于 5.0 之前的内核,不支持交换文件。仅仅将文件设为 NOCOW 是没有用的,交换文件支持依赖于 btrfs 故意不实现的一个功能,因为可能会损坏。交换实现过去依赖于一些可能不适用于 btrfs 的假设,例如交换文件中的块号,而 btrfs 在多个设备的情况下具有不同的块号映射。有一个新的 API 可用于将交换移植到 btrfs;有关更多详细信息,请查看项目想法#交换文件支持。
答案4
从 6.1 版本开始,在 btrfs 中创建交换文件变得更加容易:
# btrfs filesystem mkswapfile --size 2G swapfile
# swapon swapfile
更多内容btrfs 文档。