Grz*_*cki 10 storage backup compression btrfs
如何用零清除未使用的空间?(我要求用于btrfs文件系统的工具)
我正在寻找比它更聪明的东西
cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero
Run Code Online (Sandbox Code Playgroud)
就像FSArchiver正在寻找“已用空间”并忽略未使用但相反的站点。
目的:我想压缩分区图像,因此强烈建议用零填充未使用的空间。
顺便提一句。对于 ext3,ext4 :用零 (ext3,ext4) 清除未使用的空间。我在这里要求 btrfs
澄清“更智能的算法”:我看到“更智能的算法”会导致混淆,在这里我终于决定添加一行。亲爱的读者,请将文件系统视为数据结构。为简单起见,让我们想象一下自平衡红黑树持有映射,用作关联键->值数组,其中值是整数。目标是用零清除所有负值。“不智能”算法将迭代它并将键:值对添加到新映射(最终将负值更改为零)。智能算法只会检测存储负值的位置并就地清除它们。
清除可用空间的正确和“智能”方法是使用:
fstrim /mountpoint
Run Code Online (Sandbox Code Playgroud)
在挂载的文件系统上使用它。
重要的是要注意这没有安全优势。如果您希望清除磁盘以确保安全,请备份您的文件,使用“shred”之类的命令将整个磁盘清零,然后恢复您的文件。
但是,如果您的磁盘是稀疏文件系统上的精简配置,并且您希望恢复未使用的空间,则该解决方案可以正常工作。
这是我对您上一个问题的回答的修改和扩展的重新发布:
sfill
从secure-delete
包装中可以做你想做的事。
与 Zerofree(仅适用于 ext2、ext3 和 ext4 文件系统)不同,sfill 可适用于任何文件系统。
例如
sfill -l -l -z /mnt/X
Run Code Online (Sandbox Code Playgroud)
sfill/secure-delete 主页现在似乎已经消失了,但它是为 debian 和 ubuntu 打包的。可能还有其他发行版。如果您需要源代码,如果您在其他地方找不到,可以在 debian 档案中找到。
注意:sfill 仅适用于已安装的文件系统。如果您从主机系统而不是虚拟机内对映像文件进行零填充,则需要在主机上挂载 fs 映像。确切的方法取决于图像文件的类型(例如 qcow2 或 raw)。
安装“原始”图像既简单又直接。只需kpartx
在映像文件上使用即可创建环回设备,然后可以单独安装每个分区的 /dev/mapper/ 条目。
这是根据我用来挂载网络可引导 freedos 硬盘映像的脚本片段修改的部分脚本(用于 flashrom 无法工作的机器上的 BIOS 更新):
sfill -l -l -z /mnt/X
Run Code Online (Sandbox Code Playgroud)
注意:它假设映像中的每个分区都是可安装的。在我的用例中是正确的(带有一个分区的 freedos 高清图像)。如果其中一个分区是交换空间,则不正确。检测此类分区并使用 dd 将交换分区归零作为读者的练习:)
此方法或其变体也应该适用于 LVM 卷。
如果您的映像是 qcow,那么您可以使用包qemu-nbd
中的工具qemu-utils
,它将映像文件及其分区呈现为网络块设备 - 例如 /dev/nbd0 /dev/ndb0p1 - 可以以与 / 类似的方式使用上面的开发/映射器设备。
使用从 qcow 转换为 raw 可能更容易、更少麻烦(但更耗时)qemu-img
,使用上面的 raw 方法,然后将修改后的原始图像转换回压缩的 qcow2。这可能会导致图像比使用 qemu-nbd 稍小,因为您将在创建新的 qcow2 图像时对其进行压缩。