将未使用的空间清零

将未使用的空间清零

如何用零清除未使用的空间? (外部3,外部4)

我正在寻找比

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

喜欢FS存档器正在寻找“已使用的空间”并忽略未使用但相反的站点。

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

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

答案1

这样的实用程序是zerofree.

从它的描述来看:

Zerofree 查找 ext2 或 ext3 文件系统中未分配、非置零的块,并用零填充它们。如果该文件系统所在的设备是磁盘映像,则这非常有用。在这种情况下,根据磁盘映像的类型,辅助实用程序可能能够在运行 Zerofree 后减小磁盘映像的大小。 Zerofree 要求文件系统以只读方式卸载或安装。

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

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

Zerofree 已编写为可以在作为虚拟机内的来宾操作系统安装的 GNU/Linux 系统上运行。如果这不是您的情况,那么您几乎肯定不需要这个包。

更新#1

.deb 包的描述现在包含以下段落,这意味着这也适用于 ext4。

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

其他用途

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

答案2

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

将未使用的空间清零

文件系统未挂载

  • 如果您的文件系统所在的“磁盘”是精简配置的(例如支持 TRIM 的现代 SSD、格式支持稀疏性的 VM 文件等)并且您的内核表示块设备可以理解它,则您可以使用e2fsck -E discard src_fs丢弃未使用的空间(需要 e2fsprogs 1.42.2 或更高版本)。
  • 使用零自由(例如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来自 secure-delete 使用此技术)。这种方法效率低下,Ted Ts'o(ext4 的作者)不推荐,可能不会将某些事情清零,并且会减慢 future 的fsck速度。

卸载文件系统比安装文件系统会产生更好的结果。当大量先前使用的空间需要清零时,丢弃往往是最快的方法,但zerofree在丢弃过程之后使用有时可以将一点额外的清零(取决于在“磁盘”上如何实现丢弃)。

缩小图像文件

镜像采用专用VM格式

您将需要使用适当的磁盘映像工具(例如qemu-img convert src_image dst_image)来回收归零的空间并允许代表映像的文件变得更小。

图像是原始文件

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

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

如今,使用像这样的工具可能会更容易虚拟稀疏化一次性完成这些步骤以及更多步骤。

 来源

答案3

sfill安全删除可以做这个和其他几个相关的工作。

例如

sfill -l -l -z /mnt/X

更新#1

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

sfill手册页的副本也在这里:

答案4

如果您不想求助于其他工具,则此方法应该比以下方法更快cat /dev/zero > /mnt/fs/zeros

dd if=/dev/zero of="/mnt/fs/filler" bs=1048576
dd if=/dev/zero of="/mnt/fs/filler1" bs=1
sync
rm /mnt/fs/filler
rm /mnt/fs/filler1

相关内容