我想将 FreeBSD 虚拟机内分区中的所有可用空间清零。
虚拟机包含一个 512K 引导freebsd-boot
类型切片(希望我在这里掌握了术语),后面是一个 2.0Gfreebsd-swap
切片和一个 254.0Gfreebsd-zfs
切片。
# gpart show da0
=> 34 536870845 da0 GPT (256G)
34 6 - free - (3.0K)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 532672512 3 freebsd-zfs (254G)
536868864 2015 - free - (1.0M)
这是 FreeBSD 10.2 安装程序在选择“root on ZFS”选项时默认创建的布局。
过去使用 UFS 时,我只是用来mount -t ufs
列出所有 UFS 标签,并在这些安装上创建一个零填充的文件,直到没有空间为止。
然而,对于 ZFS,我不再确定。现在我得到:
# mount -t zfs
zroot/ROOT/default on / (zfs, local, noatime, nfsv4acls)
zroot/tmp on /tmp (zfs, local, noatime, nosuid, nfsv4acls)
zroot/usr/home on /usr/home (zfs, local, noatime, nfsv4acls)
zroot/usr/ports on /usr/ports (zfs, local, noatime, nosuid, nfsv4acls)
zroot/usr/src on /usr/src (zfs, local, noatime, nfsv4acls)
zroot/var/audit on /var/audit (zfs, local, noatime, noexec, nosuid, nfsv4acls)
zroot/var/crash on /var/crash (zfs, local, noatime, noexec, nosuid, nfsv4acls)
zroot/var/log on /var/log (zfs, local, noatime, noexec, nosuid, nfsv4acls)
zroot/var/mail on /var/mail (zfs, local, nfsv4acls)
zroot/var/tmp on /var/tmp (zfs, local, noatime, nosuid, nfsv4acls)
zroot on /zroot (zfs, local, noatime, nfsv4acls)
除了名称之外,这没有给我任何线索,据我所知,这只是一种约定(不好的风格)依靠关于公约)。并重复零填充操作每个这些数据集似乎有点愚蠢。
那么找到所有 ZFS 池 ( zpool list -pH|cut -f 1
) 并查找列表中的那些就足够了吗mount -t zfs
?即忽略该 ZFS 池中的数据集。
简而言之,填充列出的挂载点上的可用空间是否足够(使用 Bash,但也可能适用于 Zsh):
mount -t zfs|awk '$1 ~ /^'$(zpool list -pH|cut -f 1)'$/ {print $3}'
或者 ZFS 拥有这些数据集这一事实是否会改变我在主机端压缩虚拟机磁盘之前需要清零的部分?
列出 ZFS 池和挂载时的输出:
# mount -t zfs
zroot/ROOT/default on / (zfs, local, noatime, nfsv4acls)
zroot/tmp on /tmp (zfs, local, noatime, nosuid, nfsv4acls)
zroot/usr/home on /usr/home (zfs, local, noatime, nfsv4acls)
zroot/usr/ports on /usr/ports (zfs, local, noatime, nosuid, nfsv4acls)
zroot/usr/src on /usr/src (zfs, local, noatime, nfsv4acls)
zroot/var/audit on /var/audit (zfs, local, noatime, noexec, nosuid, nfsv4acls)
zroot/var/crash on /var/crash (zfs, local, noatime, noexec, nosuid, nfsv4acls)
zroot/var/log on /var/log (zfs, local, noatime, noexec, nosuid, nfsv4acls)
zroot/var/mail on /var/mail (zfs, local, nfsv4acls)
zroot/var/tmp on /var/tmp (zfs, local, noatime, nosuid, nfsv4acls)
zroot on /zroot (zfs, local, noatime, nfsv4acls)
# zpool list -pH
zroot 270582939648 1668632576 268914307072 - 0% 0 1.00x ONLINE -
答案1
你想得太复杂了。
您只需要对每个池进行零填充,而不是对每个文件系统进行零填充! (后者在 ZFS 中没有多大意义。)
所以只需迭代所有池(通过zpool list
)。对于每个池,执行以下操作:
- 创建一个禁用(!)压缩的新 ZFS 文件系统
- 在该系统中创建一个用零填充的新文件
- 同步
- 销毁 ZFS 文件系统
请注意,即使在您有一些不包含任何文件系统的池的特殊情况下,上述算法也能正常工作。 (还没有文件系统,或者不再有文件系统)
答案2
zpool list
将为您提供 ZFS 池的列表,并将zfs list
为您提供所有 ZFS 数据集的列表。