我需要在 zpool 上创建一个 ext4 fs。我想使用所有(或几乎所有)可用空间,如下所示。
# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
nat2012 1,81T 124K 1,81T - - 0% 0% 1.00x ONLINE -
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
nat2012 105K 1,76T 24K none
# zfs create -V 1.75T nat2012/backup
bad volume size '1.75T': invalid numeric suffix '.75T'
# zfs get avail nat2012
NAME PROPERTY VALUE SOURCE
nat2012 available 1,76T -
# zfs get -H avail nat2012
nat2012 available 1,76T -
我的问题是“1.75T”不被接受为卷大小。(但它显示为大小。)其值四舍五入为 0.01T,即 10G。我接下来尝试获取可用大小(以字节、兆字节、千兆字节或块为单位),或者几乎任何能告诉我确切大小的单位,并且可以与“zfs create -V”一起使用。当我看到没有“zfs get”选项时,我感到很惊讶。根据文档,“-H”选项应该“以更容易被脚本解析的形式显示输出”。它省略了标题并使用制表符分隔字段,但格式很糟糕。大小仍然以 TBytes 为单位显示,并以 +/- 10G 的精度四舍五入。问题较小,但它使用当前语言环境进行格式化(在我的情况下,小数点“。”被替换为“,”)。它将是 KB 中的整数。
请注意,在这种特殊情况下无法使用“df”命令,因为没有安装任何内容。我可以这样做以千字节为单位显示可用块:
# mkdir -p /nat2012
# zfs set mountpoint=/nat2012 nat2012
# df -k | grep nat2012
nat2012 1885339520 128 1885339392 1% /nat2012
但这会产生错误的结果。如您所见,它现在已安装为 zfs 文件系统,并且数据集已使用了 1% 的可用空间。这并没有告诉我可用于创建新 ext4 卷的确切大小。(-V 选项是必需的 - 如果您不指定它,则 ext4.mkfs 将无法格式化它。)
当然,我可以随时进行尝试,例如:
# zfs create -V 1760G nat2012/backup
cannot create 'nat2012/backup': out of space
# zfs create -V 1755G nat2012/backup
cannot create 'nat2012/backup': out of space
# zfs create -V 1750G nat2012/backup
cannot create 'nat2012/backup': out of space
# zfs create -V 1740G nat2012/backup
# zfs destroy nat2012/backup
# zfs create -V 1745G nat2012/backup
cannot create 'nat2012/backup': out of space
# zfs create -V 1744G nat2012/backup
cannot create 'nat2012/backup': out of space
# zfs create -V 1743G nat2012/backup
此时,我可以确定最多还有 1G 空间未使用。这是非常笨拙。我可以忍受这种情况,但在未来的多次驾驶中我必须做同样的事情。
有没有更好的方法来“利用所有可用空间”来创建一个固定大小体积?