Swapon 失败:具有 Btrfs 文件系统的 Linux 系统上的无效参数

mal*_*lat 17 linux filesystems swap btrfs

这个操作序列有什么问题,在带有 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
Run Code Online (Sandbox Code Playgroud)

我的文件系统是:

$ 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)
Run Code Online (Sandbox Code Playgroud)

Sat*_*hat 18

这个错误报告导致了这个讨论

所以“无效参数”应该读作“你的文件系统不支持交换文件”

作为发布马拉特

  • 不错的收获!`btrfs` 文件系统不支持交换文件,因为它会移动文件数据并且 Linux 交换代码只获取交换文件的映射一次。如果允许,将会发生灾难——随机文件数据使用了交换文件曾经使用过的块会被破坏。 (9认同)

rec*_*lic 11

在 Linux 内核 5.0.0 中,btrfs 现在原生支持交换文件。(您必须将其设置为 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 上使用交换文件,但这将导致交换性能严重下降。


Phi*_*ßen 10

在不正常的关闭之后,我现在收到了神秘的错误。唯一的解决方案是删除旧的交换文件并重新创建它。

与 btrfs 一样,有一定的限制(例如必须禁用写入时复制),我建议按照 Arch Wiki上的步骤进行操作(我复制了创建 512M 交换的步骤,但请在执行之前阅读他们的文档) :

# truncate -s 0 /swapfile
# chattr +C /swapfile
# btrfs property set /swapfile compression none
# fallocate -l 512M /swapfile
# chmod 600 /swapfile
# mkswap /swapfile
Run Code Online (Sandbox Code Playgroud)

现在swapon /swapfile应该成功了。

如果不是,请确保内核至少为 5.0,与早期版本一样 btrfs 不支持内核交换文件(来源:btrfs FAQ):

从内核 5.0+ 开始,btrfs 具有本机交换文件支持,但有一些限制。交换文件 - 必须完全分配为 NOCOW,在一台设备上不进行压缩。

对于 5.0 之前的内核,不支持交换文件。仅仅创建一个文件 NOCOW 并没有帮助,交换文件支持依赖于 btrfs 由于潜在损坏而故意不实现的一项功能。交换实现过去依赖于一些在 btrfs 中可能不成立的假设,例如交换文件中的块号,而 btrfs 在多个设备的情况下具有不同的块号映射。有一个新的 API 可用于将 swap 移植到 btrfs;有关更多详细信息,请查看项目创意#交换文件支持。