我正在尝试swapfile
通过以下方式添加新的以增加交换空间本教程。
创建swapfile
成功,但是swapon
命令不会接受它:说“跳过——好像有洞。”。
我正在 root 上运行带有 ZFS 的 Xubuntu 19.10。
以下是我迄今为止尝试过的:
创建交换文件
使用fallocate
- 失败
sudo fallocate -l 8G /swapfile
fallocate: fallocate failed: Operation not supported
目前看来 fallocate不支持 ZFS。
替代方法 - 使用dd
- 成功
sudo dd if=/dev/zero of=/swapfile bs=1MiB count=$((8*1024))
8192+0 records in
8192+0 records out
8589934592 bytes (8.6 GB, 8.0 GiB) copied, 2.68284 s, 3.2 GB/s
准备交换文件 - 成功
sudo chmod 600 /swapfile
ls -lah /swapfile
-rw------- 1 root root 8.0G Dec 27 14:15 /swapfile
sudo mkswap /swapfile
Setting up swapspace version 1, size = 8 GiB (8589930496 bytes)
no label, UUID=db8aa64c-734c-4eba-a803-72db681ec1a1
启用交换文件 - 失败
sudo swapon /swapfile
swapon: /swapfile: skipping - it appears to have holes.
有孔的锉刀
内核中的交换文件实现需要能够直接写入文件,而无需文件系统的协助。这对于有漏洞的文件或 Btrfs 等文件系统上的写时复制文件来说是一个问题。
cp(1) 或 truncate(1) 等命令会创建有漏洞的文件。这些文件将被 swapon 拒绝。
根据文件系统的不同,fallocate(1) 创建的预分配文件也可能被解释为有洞的文件。自 Linux 4.18 起,XFS 支持预分配交换文件。
创建交换文件最可移植的解决方案是使用 dd(1) 和 /dev/zero。
如何在 ZFS 上创建该swapon
命令可以接受的交换文件?
系统信息:
sudo parted -l
Model: WDC PC SN520 SDAPNUW-512G-1002 (nvme)
Disk /dev/nvme0n1: 512GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 538MB 537MB fat32 EFI System Partition boot, esp
2 538MB 590MB 52.4MB ext4
3 590MB 2738MB 2147MB linux-swap(v1)
4 2738MB 4885MB 2147MB zfs
5 4885MB 512GB 507GB zfs
sudo zpool list -v
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
bpool 1.88G 131M 1.75G - - 0% 6% 1.00x ONLINE -
nvme0n1p4 1.88G 131M 1.75G - - 0% 6.82% - ONLINE
rpool 472G 112G 360G - - 9% 23% 1.00x ONLINE -
nvme0n1p5 472G 112G 360G - - 9% 23.8% - ONLINE
sudo zfs list
# https://pastebin.ubuntu.com/p/6jDVwbhfCT/
sudo lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 19.10
Release: 19.10
Codename: eoan
sudo uname -a
Linux iCyberRoze 5.3.0-24-generic #26-Ubuntu SMP Thu Nov 14 01:33:18 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
答案1
我认为你想要的实际上是在linux上的ZFS页
TLDR;
# To set swap on a zfs drive:
zfs create -V 8G -b $(getconf PAGESIZE) -o logbias=throughput -o sync=always -o primarycache=metadata -o com.sun:auto-snapshot=false VMs/swap
mkswap -f /dev/zvol/VMs/swap
swapon /dev/zvol/VMs/swap
# IN FSTAB
/dev/zvol/VMs/swap none swap discard 0 0
答案2
您链接的教程并未假设您的根文件系统是 ZFS。ZFS 手册页表示:
ZFS 卷作为交换
ZFS 卷可用作交换设备。使用命令创建卷后,
zfs create -V
使用 mkswap(8) 和 swapon(8) 命令设置并启用交换区域。不要交换到 ZFS 文件系统上的文件。不支持 ZFS 交换文件配置。
您可以按照其他答案从 stratus 获取从 zvol 工作的交换空间,该 zvol 可用作 ZFS 池一部分的交换空间。
然而,如果你真的想违背建议使用掉期文件存储在 ZFS 文件系统中:
fallocate
在 ZFS 文件系统中不起作用,正如您从之前发布的 zfsonlinux github bug 中知道的那样。与其使用dd
速度较慢的命令(因为它必须写入输出文件的每个部分),您可能希望快速创建一个可以在 ZFS 文件系统上创建的大型稀疏文件,请尝试执行truncate
相同操作但在 ZFS 上有效的命令。
sudo truncate -s 8G /swapfile
sudo chmod 600 /swapfile
sudo swapon /swapfile
它仍然显示:swapon: /swapfile: skipping - it appears to have holes.
ls -lsh /swapfile
报告512 -rw------- 1 root root 8.0G Jan 17 18:27 /swapfile
显示创建的文件仅占用 512 字节而不是 8 GB。
包含此文件的 ZFS 文件系统的压缩设置很可能会导致输出dd
稀疏(占用的磁盘空间比报告的文件大小少得多)。
sudo dd if=/dev/zero of=/swapfile bs=1M count=8k status=progress
ls -lsh /swapfile
报告512 -rw-rw-r-- 1 root root 8.0G Jan 17 18:39 /swapfile
显示 ZFS 文件系统压缩设置使完整的 8 GB 文件适合 512 字节。
您可以使用不可压缩的输入,而不是使用高度可压缩的输入dd
,这样它实际上会占用 8 GB 的硬盘空间。但是从我的测试来看,swapon 仍然拒绝它:/dev/zero
/dev/urandom
sudo dd if=/dev/urandom of=/swapfile bs=1M count=8k status=progress
sudo chmod 600 /swapfile
sudo swapon /swapfile
它仍然显示:swapon: /swapfile: skipping - it appears to have holes.
另一个实验是在已关闭压缩的 ZFS 文件系统中尝试它。
sudo zfs create rpool/swap -o compression=off -o mountpoint=/swap/
sudo dd if=/dev/zero of=/swap/swapfile bs=1M count=8k status=progress
这次它确实将所有 0 写入磁盘。
ls -lsh /swap/swapfile
这报告8.0G -rw-r--r-- 1 root root 8.0G Jan 17 18:52 /swap/swapfile
sudo chmod 600 /swap/swapfile
sudo swapon /swap/swapfile
它仍然显示:swapon: /swapfile: skipping - it appears to have holes.
我的结论是,我无法判断是否有办法绕过它拒绝使用位于 ZFS 文件系统中的文件作为交换文件。
在本问题的范围之外,在此系统上使用交换空间的替代方法是使用交换分区(我看到您已经有一个590MB
交换分区,或者将交换文件放在非 ZFS 文件系统上,例如 ext4 分区上,或者如果磁盘空间不可用,请使用扎斯瓦普(将压缩的 RAM 块用作交换空间)或虚拟内存文件系统(位于显卡 RAM 上的交换空间)。
答案3
目前(至少 5 年内)绝对不推荐这样做,请参阅此错误:https://github.com/openzfs/zfs/issues/7734 任何类型的交换:交换文件或 ZVOL 作为交换都有可能导致操作系统崩溃。
您的命令不起作用,因为您正在 ZFS 上创建交换文件。