用零清除未使用的空间 (btrfs)

用零清除未使用的空间 (btrfs)

如何用零清除未使用的空间? (我正在寻求工具BTFS文件系统)

我正在寻找比

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

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

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

顺便提一句。对于 ext3、ext4 :用零清除未使用的空间(ext3、ext4)。这里我要求btrfs

“更智能的算法”的澄清:由于我看到“更智能的算法”会导致混乱,所以我最终决定在这里添加有关它的内容。亲爱的读者,请将文件系统视为数据结构。为了简化起见,让我们想象一下自平衡红黑树持有映射,它用作关联键->值数组,其中值是整数。目标是将所有负值清除为零。 “不聪明”算法将迭代它并将键:值对添加到新映射(最终将负值更改为零)。智能算法只会检测存储负值的位置并将其清除到位

答案1

清除可用空间的正确且“智能”的方法是使用:

fstrim /mountpoint

在已安装的文件系统上使用它。

值得注意的是,这样做没有任何安全优势。如果您希望清除磁盘以确保安全,请备份文件,使用“shred”等命令将整个磁盘清零,然后恢复文件。

但是,如果您的磁盘是稀疏文件系统上的精简配置并且您希望恢复未使用的空间,则该解决方案可以正常工作。

答案2

这是我对您上一个问题的回答的修改和扩展的重新发布:

sfillsecure-delete包装中可以做你想做的事。

与 Zerofree(仅适用于 ext2、ext3 和 ext4 文件系统)不同,sfill 可适用于任何文件系统。

例如

sfill -l -l -z /mnt/X

sfill/secure-delete 主页现在似乎已经消失了,但是它是为 debian 和 ubuntu 打包的。可能其他发行版也是如此。如果您需要源代码,可以在 debian 档案中找到,如果您在其他地方找不到它。

注意:sfill 仅适用于已安装的文件系统。如果您从主机系统而不是虚拟机内对映像文件进行零填充,则需要在主机上挂载 fs 映像。确切的方法取决于图像文件的类型(例如 qcow2 或 raw)。

安装“原始”图像既简单又直接。只需在映像文件上使用kpartx即可创建环回设备,然后可以单独安装每个分区的 /dev/mapper/ 条目。

这是根据我用来挂载网络可引导 freedos 硬盘映像的脚本片段修改的部分脚本(用于 flashrom 无法工作的机器上的 BIOS 更新):

image="myrawimagefile.img"

# use kpartx to build /dev/mapper device nodes
KP=$(kpartx -a -v "$image")

# now mount each partition under ./hd/
for p in $(echo "$KP" | awk '/^add map/ {print $3}') ; do
  dm="/dev/mapper/$p"
  fp=$(echo "$p" | sed -r -e 's/^loop[0-9]+//')
  mkdir -p "./hd/$fp"
  mount "$dm" "./hd/$fp"
  sfill -l -l -v "./hd/$fp"
  umount "$dm"
done

# now remove the loopback device and /dev/mapper entries
kpartx -d "$image"

注意:它假设映像中的每个分区都是可安装的。在我的用例中是正确的(带有一个分区的 freedos 高清图像)。如果其中一个分区是交换空间,则不正确。检测此类分区并使用 dd 将交换分区归零作为读者的练习:)

此方法或其变体也应该适用于 LVM 卷。

如果您的映像是 qcow,那么您可以使用包qemu-nbd中的工具qemu-utils,它将映像文件及其分区呈现为网络块设备 - 例如 /dev/nbd0 /dev/ndb0p1 - 可以以与 / 类似的方式使用上面的开发/映射器设备。

使用从 qcow 转换为 raw 可能更容易、更少麻烦(但更耗时)qemu-img,使用上面的 raw 方法,然后将修改后的原始图像转换回压缩的 qcow2。这可能会导致图像比使用 qemu-nbd 稍小,因为您将在创建新的 qcow2 图像时对其进行压缩。

答案3

cat /dev/zero如果您先关闭压缩,则适用于 btrfs:

btrfs 属性设置 PATH 压缩 none

例如:

mkdir -p btrfs-zero
btrfs property set btrfs-zero compression none
cat /dev/zero > btrfs-zero/zero
rm btrfs-zero/zero

在虚拟机映像中执行此操作后,您可以按照通常的方式“缩小”虚拟磁盘。

以 VMware Fusion 为例:

/Applications/VMware\ Fusion.app/Contents/Library/vmware-vdiskmanager -k DISK.vmdk

相关内容