现代 Ubuntu 版本默认使用交换文件而不是交换分区。
在 Linux 内核 5.0 之前,无法将交换文件放置在分区上btrfs
,否则btrfs
文件系统可能会被损坏。
现在内核支持 btrfs 分区上的交换文件。我可以在安装的 Ubuntu 上使用交换文件吗btrfs
?可能存在哪些问题?
答案1
可以使用交换文件btrfs
,但需要注意一些事项。
btrfs
如果子卷上有可用的交换文件,则文件系统不允许创建快照。这意味着强烈建议将交换文件放在单独的子卷上。
我们假设当前交换已关闭,已/
打开/dev/sda1
且 Ubuntu 安装/
在@
子卷上且/home
在@home
子卷上。
安装
/dev/sda1
至/mnt
。sudo mount /dev/sda1 /mnt
如果您运行
ls /mnt
,您将看到@
,@home
以及可能存在的其他子卷。创建一个新的
@swap
子卷。sudo btrfs sub create /mnt/@swap
/dev/sda1
从卸载/mnt
。sudo umount /mnt
创建
/swap
我们计划挂载@swap
子卷的目录。sudo mkdir /swap
将
@swap
子卷挂载到/swap
。sudo mount -o subvol=@swap /dev/sda1 /swap
创建交换文件。
sudo touch /swap/swapfile
为文件设置 600 权限。
sudo chmod 600 /swap/swapfile
对此文件禁用 COW。
sudo chattr +C /swap/swapfile
以设置交换文件大小为4G为例。
sudo dd if=/dev/zero of=/swap/swapfile bs=1M count=4096
格式化交换文件。
sudo mkswap /swap/swapfile
打开交换文件。
sudo swapon /swap/swapfile
现在新的交换应该可以正常工作了。
您还需要更新/etc/fstab
以在启动时安装所有这些。添加两行:
UUID=XXXXXXXXXXXXXXX /swap btrfs subvol=@swap 0 0
/swap/swapfile none swap sw 0 0
这UUID
是你的一个/dev/sda1
。
交换文件不能位于任何类型的 btrfs raid 上。
欢迎提出意见和建议。
答案2
请注意,对于具有 NVME SSD 的现代系统/笔记本电脑,您/dev/nvme0n1p2
应该/dev/sda1
忽略 /dev/nvme0n1p1,因为这是您的操作系统在安装时创建的 efi 启动盘。
此外,建议添加两个挂载选项“defaults”和“noatime”。默认值将自动加载驱动器(SSD、HDD)的挂载选项。如果仅打开以下文件,Noatime 将阻止写入文件:
UUID=XXXXXXXXXXXXXXX /swap btrfs defaults,noatime,subvol=@swap 0 0
/swap/swapfile none swap sw 0 0
答案3
流行的答案是正确的,但你应该不是使用 fallocate(1) 为交换文件分配空间。它可以创建与交换文件使用不兼容的文件系统“漏洞”(交换需要 100% 连续的空间,因为文件系统不在交换空间内使用)。您应该改用“dd if=/dev/zero ...”。请参阅此线程中的答案: fallocate 与 dd 用于交换文件吗? mkswap(8) 和 swapon(8) 手册页都明确不鼓励使用 fallocate(1) 在文件系统上实例化交换文件。
答案4
你可以在 btrfs 上进行交换,如果你留意 btrfs doku 对此的说明:
filesystem - must be only single device
filesystem - must have only single data profile
swapfile - the containing subvolume cannot be snapshotted
swapfile - must be preallocated (i.e. no holes)
swapfile - must be NODATACOW (i.e. also NODATASUM, no compression)
更多信息请参见来源: