这是我对上一个问题的回答的修改后且扩展范围更大的转发:
sfill
从secure-delete
包中可以做您想要的。
与zerofree(仅适用于ext2,ext3和ext4文件系统)不同,sfill将适用于任何文件系统。
例如
sfill -l -l -z /mnt/X
现在,sfill / secure-delete主页似乎已消失,但已将其打包为debian和ubuntu。可能还有其他发行版。如果您需要源代码,可以在debian档案库中找到(如果在其他任何地方都找不到)。
注意:sfill仅适用于已挂载的文件系统。如果要从主机系统而不是从VM内部填充映像文件,请在主机上挂载fs映像。确切的方法取决于图像文件的类型(例如qcow2或原始)。
挂载“原始”图像非常简单明了。只需kpartx
在映像文件上使用即可创建回送设备,然后可以分别安装每个分区的/ dev / mapper /条目。
以下是部分脚本的一部分,该脚本是从我用来安装可网络启动的Freedos硬盘映像的脚本片段中修改的(用于Flashrom无法正常运行的计算机上的BIOS更新):
image="myrawimagefile.img"
# use kpartx to build /dev/mapper device nodes
KP=$(kpartx -a -v "$image")
# now mount each partition under ./hd/
for p in $(echo "$KP" | awk '/^add map/ {print $3}') ; do
dm="/dev/mapper/$p"
fp=$(echo "$p" | sed -r -e 's/^loop[0-9]+//')
mkdir -p "./hd/$fp"
mount "$dm" "./hd/$fp"
sfill -l -l -v "./hd/$fp"
umount "$dm"
done
# now remove the loopback device and /dev/mapper entries
kpartx -d "$image"
注意:它假定映像中的每个分区都是可装入的。在我的用例中为true(带有一个分区的freedos高清图像)。如果分区之一是交换空间,则不正确。检测此类分区并将dd设为零,将交换分区留给读者练习:)
此方法或其变体也应适用于LVM卷。
如果您的图像是qcow,则可以使用软件包中的qemu-nbd
工具,该工具qemu-utils
会将图像文件及其分区显示为网络块设备-例如/ dev / nbd0 / dev / ndb0p1-可以以与/类似的方式使用上面的dev / mapper设备。
qemu-img
从qcow转换为原始,使用上面的raw方法,然后将修改后的原始图像转换回压缩的qcow2,可能更容易且省事(但更耗时)。与使用qemu-nbd相比,这可能会导致图像更小,因为您将在创建新的qcow2图像时对其进行压缩。
sfill
建议?看起来它不需要extX。