用零清除未使用的空间(ext3,ext4)


73

如何用零清除未使用的空间?(ext3,ext4)

我在寻找比...更聪明的东西

cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero

FSArchiver一样,正在寻找“已用空间”,而忽略未使用但相对的站点。

目的:我想压缩分区映像,因此强烈建议使用零填充未使用的空间。

顺便说一句。对于btrfs:用零清除未使用的空间(btrfs)


4
:检查了这一点superuser.com/questions/19326/...

1
两种不同的答案是可能的。您想达到什么目的?要么1)的安全性,通过禁止别人看那些数据,或者2)优化整个分区的压缩或[SSD性能](en.wikipedia.org/wiki/Trim_(computing)
Totor

Answers:


77

这样的工具是zerofree

从其描述:

Zerofree在ext2或ext3文件系统中找到未分配的,未清零的块,并用零填充它们。如果此文件系统所在的设备是磁盘映像,这将很有用。在这种情况下,取决于磁盘映像的类型,在运行Zerofree之后,辅助实用程序可能能够减小磁盘映像的大小。Zerofree要求将文件系统卸载或以只读方式装载。

获得相同结果(将未使用的块清零)的通常方法是运行“ dd”,以创建一个充满零的文件,该文件占用驱动器上的所有可用空间,然后删除该文件。这有很多缺点,这些零缺点可以缓解:

  • 很慢
  • 它使磁盘映像(临时)增长到最大程度
  • 它(临时)使用了磁盘上的所有可用空间,因此其他并发写入操作可能会失败。

Zerofree已编写为从在虚拟机内作为来宾OS安装的GNU / Linux系统中运行。如果您的情况并非如此,则几乎可以肯定不需要此软件包。

更新#1

.deb软件包的描述现在包含下面的段落,这意味着这对于ext4也可以正常工作。

说明:来自ext2,ext3和ext4文件系统的零空闲块Zerofree在ext2,ext3或ext4文件系统中查找具有非零值内容的未分配块,并用零填充...

其他用途

该实用程序的另一个应用程序是压缩作为真实磁盘备份的磁盘映像。一个典型的例子是将SD卡转储到BeagleBone或Raspberry Pi中。将空白空间清零后,可以更有效地压缩备用映像。


1
它是intgat.tigress.co.uk/rmy/uml/index.html工具的官方页面吗?您认为与ext4一起使用安全吗?
2012年

2
@GrzegorzWierzowiecki:是的,那是页面,但是对于debian和朋友来说,它已经在仓库中了。我在虚拟磁盘上的ext4分区上使用,以连续缩小磁盘文件映像,并且没有问题。
enzotib 2012年

1
这不等于dd原始问题中的粗略方法,因为它不适用于已挂载的文件系统。
jlh

zerofree页面讨论了一个补丁,该补丁可让您执行“使用zerofree选项挂载文件系统”,以便始终将被删除的文件归零。这是否需要重新编译内核?有没有更简单的方法来完成相同的事情?
endolith '16

2
小心-我丢失了zerofree在Astralinux上使用的ext4文件系统(基于Debian)…
Hubbitus

33

清除ext2 / ext3 / ext4上未使用空间的方法摘要(如本问题和其他地方所述):

归零未使用空间

文件系统未挂载

  • 如果您的文件系统所在的“磁盘”是精简配置的(例如,支持TRIM的现代SSD,格式支持稀疏性的VM文件等),并且您的内核说该块设备可以理解它,则可以使用它e2fsck -E discard src_fs来丢弃未使用的空间(需要e2fsprogs 1.42.2或更高版本)。
  • 使用zerofree(例如zerofree src_fs)在未使用的块上显式写入零。
  • 使用e2image -rap src_fs dest_fs只复制使用块(新的文件系统应该是一个零,否则“盘”上,需要的e2fsprogs 1.42.9或更高)。

文件系统已挂载

  • 如果您的文件系统所在的“磁盘”是精简配置的(例如,支持TRIM的现代SSD,格式支持稀疏性的VM文件等),您的内核会说块设备可以理解它,最后ext文件系统驱动程序就可以支持它了fstrim /mnt/fs/要求文件系统丢弃未使用的空间。
  • 使用cat /dev/zero > /mnt/fs/zeros; sync; rm /mnt/fs/zerossfill从安全删除中使用此技术)。这种方法效率低下,不是Ted Ts'o(ext4的作者)推荐的,它可能不会使某些事物归零,并且会减慢将来的fscks。

与卸载相比,卸载文件系统将提供更好的结果。当需要将许多先前使用的空间清零时zerofree,丢弃往往是最快的方法,但是在丢弃过程之后使用有时会额外增加一点零位(取决于“磁盘”上实现丢弃的方式)。

缩小图像文件

映像为专用VM格式

您将需要使用适当的磁盘映像工具(例如qemu-img convert src_image dst_image)来回收已调零的空间,并使表示映像的文件变小。

图像是原始文件

可以使用以下技术之一使文件稀疏(因此零运行将停止占用空间):

  • cp --sparse=always src_image dst_image
  • fallocate -d src_image (需要util-linux v2.25或更高版本)。

如今,使用virt-sparsify之类的工具来完成这些步骤可能更容易,而且一劳永逸

 资料来源


15

sfill安全删除可以做到这一点和其他一些相关的工作。

例如

sfill -l -l -z /mnt/X

更新#1

github上的ArchLinux项目似乎使用了一个源代码树,其中包含源代码,sfill该源代码是包含在Secure-Delete包中的工具。

sfill的手册页副本也位于此处:


该网址已过时。不知道它的主页现在在哪里(或者即使它仍然有主页),但是它是为debian和ubuntu打包的。可能还有其他发行版。如果您需要源代码,可以在debian档案库中找到(如果您在其他任何地方都找不到)。
cas

过时的联机帮助URL已得到修复。看起来“ Digipedia”不再是一回事。
mwfearnley'7

8

如果您具有e2fsprogs 1.42.9,则可以首先使用e2image创建分区映像而没有可用空间,因此可以跳过调零步骤。


我无法(轻松地)在线找到有关这些参数的任何信息,但确实在1.42.9发行说明中提供了它们:e2fsprogs.sf.net/e2fsprogs-release.html#1.42.9
mwfearnley,2017年

1
那是很有价值的工具!但是,如果它也解释了如何使用它,您的答案会更好。是e2image -ar /dev/foo1 | gzip > fs.img.gz或其一些变体。包括-f在已安装的fs上使用它。
marcelm


0

如果您不想使用其他工具,则此方法应比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无济于事)
marcelm


2
是的,但这并不能使dd速度更快。实际上,它可能使cat速度更快。块大小仅对最大程度地减少系统调用的开销并优化CPU缓存使用率很重要。通过系统调用开销,您可以输入收益递减的区域。高速缓存开始受到损害,例如1MiB。而且,当在实际磁盘上进行操作时,无论如何,您都将受到I / O的束缚,关键是要解决的问题。尝试自己进行基准测试。
marcelm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.