build立原始磁盘映像:删除文件进行压缩的最佳方法?

我正在build立原始磁盘映像(即dd,chroot来安装linux)。 在定制过程中,我可能会删除文件,使用临时文件等。

删除这些文件以确保图像最可压缩的最佳方法是什么?

我假设如果我只是rm文件,它只是从FAT删除logging标记块可用。 这留下的数据,所以当我gzip或bzip2的形象,它仍然要打包数据了。 我认为如果我能告诉FS把零写入块,情况将会变得更加严格。

有一点细节:这些CentOS 6.4安装在ext4上,但我希望这个答案适用于大多数使用大多数文件系统的Linux发行版。 我生成的基础文件系统是通过像dd if=/dev/zero of=filesystem.image bs=1M count=10240 。 从香草安装的典型的10GB磁盘映像将压缩到大约500MB。 我敢打赌,如果我对临时文件进行了更积极的清理,那么我可以把它变得更紧密。

谢谢!

Zoredache的评论让我走上了正轨(请参阅如何在Windows上填充虚拟磁盘的可用空间以获得更好的压缩? )。

据我所知,zerofree主页是http://intgat.tigress.co.uk/rmy/uml/index.html 。 这里有两个东西:zerofree工具和一个内核补丁。 内核补丁不支持ext4,但增加了设置挂载标志的function,以删除文件。 zerofree程序可以在ext4上运行。

没有可用的CentOS 6 RPM版本,但是我可以在CentOS6上使用CentOS5 srpm进行编译。

您可以创build一个仅包含零的文件/文件,以填充文件系统的可用空间。 标记为空闲的块将被零覆盖。 之后,删除这些文件。

更新:由于这个答案已经被低估,我决定testing这是真的还是我的知识是错误的。 到目前为止,它看起来像我所期望的那样工作。

我使用与OP相同的命令创build了两个图像,除了我做了1G的大小,因为这是testing紫外线的:

 dd if=/dev/zero of=img1.im bs=1M count=1024 dd if=/dev/zero of=img2.im bs=1M count=1024 

然后,我开始将这些图像文件格式化为ext4格式,将它们安装在不同的目录中,并在两个图像上复制包含图片的两个目录。 一个目录是71M,另一个是461M。 之后,我从两个挂载点中删除了461M目录。 到目前为止,所有的行动是相同的。 然后,我独自留下了第一张图片,并创build了一个zerofile,占用了第二张图片上的所有可用空间,之后将其删除:

 dd if=/dev/zero of=img2/zerofile bs=1K count=884644 rm img2/zerofile 

df再一次显示了文件系统被完全填满(为清楚起见,删除了系统分区):

 $ df Filesystem 1K-blocks Used Available Use% Mounted on /dev/loop0 999320 62248 884644 7% /home/black/temp/img/img1 /dev/loop1 999320 62248 884644 7% /home/black/temp/img/img2 

在用bzip2卸载和压缩两个图像之后, ls的输出自己说明:

 $ ls -lh total 604M -rw-r--r-- 1 black users 523M apr 19 11:56 fs1.im.bz2 -rw-r--r-- 1 black users 81M apr 19 11:56 fs2.im.bz2 

虽然这可能需要更长的更大的图像,而不是只是清空实际用于文件的空间,但这种方法简单,有效,只使用dd因此不需要额外的工具。