Ubuntu zfs文件系统挂载swap报错:swapon: /swapfile: skipping - it appears to have holes.

Ubuntu22.04系统之下,用传统的方式【mkswap ,swapon】时报错:swapon: /swapfile: skipping - it appears to have holes.。
这是因为 ZFS 文件系统默认使用 稀疏(sparse)文件,而 Linux 内核的 swapon 命令不支持稀疏文件。
稀疏文件在磁盘上没有连续的分配,包含“空洞”(holes),而 ZFS 会根据需要动态分配存储。
由于交换文件要求物理磁盘空间必须是连续的,所以无法直接使用稀疏文件作为交换空间。
可以在ubuntu系统上的zpool创建swap,解决此问题。命令如下

1
2
3
4
5
6
7
8
9
10
11
12
# zpool list
明确存储所用的pool,一般是rpool:存储根文件系统和用户数据
# zfs create -V 【swap的大小(单位:G)】G rpool/swap
# mkswap /dev/zvol/rpool/swap
Setting up swapspace version 1, size = 6 GiB (6442450688 bytes)
no label, UUID=xxxxx-xxxxx-xxxxx-xxxxx-xxxxx
记录此处返回的UUID,编辑自动加载文件时使用
# swapon /dev/zvol/rpool/swap
# free -h
# vi /etc/fstab
使用刚才得到UUID配置自动加载
UUID=xxxxx-xxxxx-xxxxx-xxxxx-xxxxx none swap sw 0 0

补充

如何删除zfs create创建的数据集

1
2
3
zfs destroy <pool>/<dataset>
例如:
zfs destroy rpool/swap