我使用了 dphys-swapfile,默认路径为/var/swap
2048M 交换文件。
但是,由于/var/swap
位于 SD 卡上,我想将交换文件移动到磁盘上。所以我跑了sudo dphys-swapfile swapoff
,编辑路径,然后跑:
sudo dphys-swapfile setup
sudo dphys-swapfile swapon
后者失败了:
swapon: /srv/file/swap: swapon failed: Invalid argument
sudo journalctl -xe
给我:
kernel: swapon: swapfile has holes
为了确定,我尝试了以下方法,但均无济于事:
- 删除新的交换文件并重新创建它
sudo dphys-swapfile setup
- 将旧的交换文件复制到新位置
sudo dd if=/dev/zero of=/srv/file/swap bs=1024 count=2097152 status=progress
(将整个交换文件清零,bs * count
等于交换文件的大小 - 这次我得到的错误是交换文件有一个无效的标头dd
旧的交换文件覆盖清零的文件 - 再次导致对文件中的漏洞的投诉
交换文件的新旧路径之间的唯一区别是旧路径位于 ext4 文件系统上,而新路径位于 btrfs 上。(除了旧路径位于 SD 卡上和新路径位于磁盘上之外,尽管我怀疑这会产生任何影响。)
由于某种原因,ext4 上的交换文件要么看起来是在没有漏洞的情况下创建的,要么dphys-swapfile
接受 ext4 上的漏洞。如何在 btrfs 上获得相同的结果?(或者我遇到的问题与我想象的不同?)
操作系统是 Raspbian Linux 9(我知道,它很旧),dphys-swapfile 是版本 20100506-3。
围绕 btrfs 构建的一些概念不适用于交换文件(想象一下创建交换文件的只读快照)。解决这个问题需要一些额外的逻辑,这些逻辑是在内核 5.0 中才添加的。对于与所讨论的操作系统一样古老的操作系统,有两个基本选项:
选项 1:升级到内核 5.0 或更高版本的较新操作系统,然后按照https://superuser.com/a/1442752/432690中的操作进行操作。虽然通常建议运行最新的操作系统,但需要计划更新,并且可能不会快速获胜。
选项 2:对硬盘重新分区,为交换分区腾出空间,然后使用它。这比操作系统升级更容易,同时从长远来看也更干净、更少麻烦。
安装 btrfs 文件系统后,执行以下操作:
(这会将文件系统大小减少 512 GB,根据需要进行调整。您希望将 FS 缩小到比新分区所需的空间多一点,然后调整分区大小并重新增长 btrfs 以再次填充调整大小的分区.)
调整 btrfs 分区的大小(例如使用parted)并在其后创建一个交换分区。然后,
添加以下行
/etc/fstab
(假设/dev/sda2
是您的交换分区):然后做:
free -h
通过运行和验证交换空间是否可用以及交换分区是否已使用sudo swapon --show
。free
应显示大于零的总交换空间,并且swapon
应仅显示交换分区,不再显示交换文件。重新启动并重新运行free -h
,sudo swapon --show
以确保在启动时启用交换空间。这是对我有用的选项。