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

Grz*_*cki 86 storage filesystems partition backup compression

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

我正在寻找比它更聪明的东西

cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero
Run Code Online (Sandbox Code Playgroud)

就像FSArchiver正在寻找“已用空间”并忽略未使用但相反的站点。

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

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

enz*_*tib 93

这样的实用程序是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 卡的转储。一旦空白空间被清零,备份映像就可以更有效地压缩。

  • 小心 - 我在 Astralinux(基于 Debian)上使用 `zerofree` 丢失了 ext4 文件系统...... (3认同)
  • 它是该工具的官方页面http://intgat.tigress.co.uk/rmy/uml/index.html吗?您认为与 ext4 一起使用安全吗? (2认同)
  • @GrzegorzWierzowiecki:是的,这就是页面,但对于 debian 和朋友来说,它已经在存储库中了。我在虚拟盘上的ext4分区上使用,依次收缩磁盘文件镜像,没有问题。 (2认同)
  • 这不等同于原始问题中粗略的 `dd` 方法,因为它不适用于已安装的文件系统。 (2认同)
  • 2019 年 6 月 - 我已成功在以只读方式安装的 ext4 文件系统上使用“zerofree”。(我的 Debian 版本拒绝尝试以读写方式挂载的文件系统进行任何操作。) (2认同)

Ano*_*non 38

清除 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 的作者)不推荐,可能不会将某些东西归零并且会减慢未来的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 或更高版本)。

如今,使用像virt-sparsify这样的工具一次性完成这些步骤可能会更容易。

 来源

  • 如今,您可能希望以 virt-sparsify 为主导!我尝试了所有这些步骤,其中一个是真正的交易 - 将 ubuntu 虚拟机切成两半,非常适合我们的工作流程。 (3认同)

cas*_*cas 16

sfillfrom secure-delete可以做到这一点和其他几个相关的工作。

例如

sfill -l -l -z /mnt/X
Run Code Online (Sandbox Code Playgroud)

更新 #1

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

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


psu*_*usi 8

如果您有 e2fsprogs 1.42.9,那么您可以使用e2image首先创建没有可用空间的分区映像,因此您可以跳过归零步骤。