如何用零清除未使用的空间?(ext3,ext4)
我在寻找比...更聪明的东西
cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero
像FSArchiver一样,它正在寻找“已用空间”,而忽略未使用但相对的站点。
目的:我想压缩分区映像,因此强烈建议使用零填充未使用的空间。
顺便说一句。对于btrfs:用零清除未使用的空间(btrfs)
如何用零清除未使用的空间?(ext3,ext4)
我在寻找比...更聪明的东西
cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero
像FSArchiver一样,它正在寻找“已用空间”,而忽略未使用但相对的站点。
目的:我想压缩分区映像,因此强烈建议使用零填充未使用的空间。
顺便说一句。对于btrfs:用零清除未使用的空间(btrfs)
Answers:
这样的工具是zerofree
。
从其描述:
Zerofree在ext2或ext3文件系统中找到未分配的,未清零的块,并用零填充它们。如果此文件系统所在的设备是磁盘映像,这将很有用。在这种情况下,取决于磁盘映像的类型,在运行Zerofree之后,辅助实用程序可能能够减小磁盘映像的大小。Zerofree要求将文件系统卸载或以只读方式装载。
获得相同结果(将未使用的块清零)的通常方法是运行“ dd”,以创建一个充满零的文件,该文件占用驱动器上的所有可用空间,然后删除该文件。这有很多缺点,这些零缺点可以缓解:
- 很慢
- 它使磁盘映像(临时)增长到最大程度
- 它(临时)使用了磁盘上的所有可用空间,因此其他并发写入操作可能会失败。
Zerofree已编写为从在虚拟机内作为来宾OS安装的GNU / Linux系统中运行。如果您的情况并非如此,则几乎可以肯定不需要此软件包。
.deb软件包的描述现在包含下面的段落,这意味着这对于ext4也可以正常工作。
说明:来自ext2,ext3和ext4文件系统的零空闲块Zerofree在ext2,ext3或ext4文件系统中查找具有非零值内容的未分配块,并用零填充...
该实用程序的另一个应用程序是压缩作为真实磁盘备份的磁盘映像。一个典型的例子是将SD卡转储到BeagleBone或Raspberry Pi中。将空白空间清零后,可以更有效地压缩备用映像。
dd
原始问题中的粗略方法,因为它不适用于已挂载的文件系统。
zerofree
在Astralinux上使用的ext4文件系统(基于Debian)…
清除ext2 / ext3 / ext4上未使用空间的方法摘要(如本问题和其他地方所述):
e2fsck -E discard src_fs
来丢弃未使用的空间(需要e2fsprogs 1.42.2或更高版本)。zerofree src_fs
)在未使用的块上显式写入零。e2image -rap src_fs dest_fs
只复制使用块(新的文件系统应该是一个零,否则“盘”上,需要的e2fsprogs 1.42.9或更高)。fstrim /mnt/fs/
要求文件系统丢弃未使用的空间。cat /dev/zero > /mnt/fs/zeros; sync; rm /mnt/fs/zeros
(sfill
从安全删除中使用此技术)。这种方法效率低下,不是Ted Ts'o(ext4的作者)推荐的,它可能不会使某些事物归零,并且会减慢将来的fsck
s。与卸载相比,卸载文件系统将提供更好的结果。当需要将许多先前使用的空间清零时zerofree
,丢弃往往是最快的方法,但是在丢弃过程之后使用有时会额外增加一点零位(取决于“磁盘”上实现丢弃的方式)。
您将需要使用适当的磁盘映像工具(例如qemu-img convert src_image dst_image
)来回收已调零的空间,并使表示映像的文件变小。
可以使用以下技术之一使文件稀疏(因此零运行将停止占用空间):
cp --sparse=always src_image dst_image
。fallocate -d src_image
(需要util-linux v2.25或更高版本)。 如今,使用virt-sparsify之类的工具来完成这些步骤可能更容易,而且一劳永逸。
zerofree
sfill
从安全删除可以做到这一点和其他一些相关的工作。
例如
sfill -l -l -z /mnt/X
github上的ArchLinux项目似乎使用了一个源代码树,其中包含源代码,sfill
该源代码是包含在Secure-Delete包中的工具。
sfill
的手册页副本也位于此处:
如果您具有e2fsprogs 1.42.9,则可以首先使用e2image
创建分区映像而没有可用空间,因此可以跳过调零步骤。
e2image -ar /dev/foo1 | gzip > fs.img.gz
或其一些变体。包括-f
在已安装的fs上使用它。
如果您不想使用其他工具,则此方法应比cat /dev/zero > /mnt/fs/zeros
:
dd if=/dev/zero of="/mnt/fs/filler" bs=10485760
dd if=/dev/zero of="/mnt/fs/filler1" bs=1
rm /mnt/fs/filler
rm /mnt/fs/filler1
cat
呢?(不,“块大小”参数dd
无济于事)
dd
速度更快。实际上,它可能使cat
速度更快。块大小仅对最大程度地减少系统调用的开销并优化CPU缓存使用率很重要。通过系统调用开销,您可以输入收益递减的区域。高速缓存开始受到损害,例如1MiB。而且,当在实际磁盘上进行操作时,无论如何,您都将受到I / O的束缚,关键是要解决的问题。尝试自己进行基准测试。