我使用了 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。
答案1
btrfs 所围绕的一些概念与交换文件不兼容(想象一下创建交换文件的只读快照)。解决这个问题需要一些额外的逻辑,这些逻辑仅在内核 5.0 中添加。对于像所讨论的操作系统一样老旧的操作系统,有两个基本选项:
选项 1:升级到内核为 5.0 或更高版本的操作系统,然后按如下步骤操作https://superuser.com/a/1442752/432690。虽然通常建议运行最新的操作系统,但更新需要有计划,而且可能不会很快见效。
选项 2:重新对硬盘进行分区,腾出空间用于交换分区,然后使用它。这比操作系统升级更容易,而且从长远来看也更干净、更省事。
安装 btrfs 文件系统后,执行以下操作:
sudo btrfs filesystem resize -512g /mnt/btrfs
(这将使文件系统大小减少 512 GB,根据需要进行调整。您需要将 FS 缩小到比新分区所需的空间稍多一点,然后调整分区大小并重新增加 btrfs 以再次填充调整大小的分区。)
sudo umount /mnt/btrfs
调整 btrfs 分区的大小(例如使用 parted)并在其后创建交换分区。然后,
sudo mount /mnt/btrfs
sudo btrfs filesystem resize max /mnt/btrfs
添加以下行/etc/fstab
(假设/dev/sda2
是您的交换分区):
/dev/sda2 swap swap defaults 0 0
然后做:
sudo mkswap /dev/sda2
sudo dphys-swapfile swapoff
sudo dphys-swapfile uninstall
sudo update-rc.d dphys-swapfile remove
sudo apt purge dphys-swapfile -y
sudo swapon -a
free -h
运行和来验证交换空间是否可用以及交换分区是否被使用sudo swapon --show
。free
应显示总交换空间大于零,并且swapon
应仅显示交换分区,不再显示交换文件。重新启动并重新运行free -h
和sudo swapon --show
以确保启动时启用了交换空间。
这是对我有用的选项。