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


10

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

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

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

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

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

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

澄清“更智能的算法”:正如我所看到的那样,“更智能的算法”会引起混乱,在这里我最终决定添加一些内容。亲爱的读者,请考虑将文件系统视为数据结构。为简化起见,让我们想象一下自平衡的红黑树保存图,它用作关联键->值数组,其中值是整数。目标是清除所有带有零的负值。“非智能”算法将对其进行迭代,并将key:value对添加到新映射(最终将负数更改为零)。智能算法将仅检测存储负值的位置并就地清除它们。


2
您是否尝试过该sfill建议?看起来它不需要extX。
凯文

1.我知道您可以用零填充零填充现有文件,但这可能不是吗?2.您如何制作这些图像?也许您可以在其中进行截断?
Zlatko

@kevin:这就是为什么我在原始问题中发布了答案。我自己很少使用ext2,3,4文件系统,所以我发现仅在ext *上工作的实用程序无用。
cas 2012年

我需要“智能”的东西。只会用零填充空白空间而不接触其他位置的东西-我的意思是不影响内部数据结构,例如B树(如果您很好奇,我已经写了问题“压缩”,但出于其他目的,我也需要它,像fs图片的重复数据删除,分析和研究)
Grzegorz Wierzowiecki 2012年

只需使用truncate和/或fallocate
mikeserv 2014年

Answers:


4

这是我对上一个问题的回答的修改后且扩展范围更大的转发:

sfillsecure-delete包中可以做您想要的。

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

例如

sfill -l -l -z /mnt/X

现在,sfill / secure-delete主页似乎已消失,但已将其打包为debian和ubuntu。可能还有其他发行版。如果您需要源代码,可以在debian档案库中找到(如果在其他任何地方都找不到)。

注意:sfill仅适用于已挂载的文件系统。如果要从主机系统而不是从VM内部填充映像文件,请在主机上挂载fs映像。确切的方法取决于图像文件的类型(例如qcow2或原始)。

挂载“原始”图像非常简单明了。只需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"

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

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

如果您的图像是qcow,则可以使用软件包中的qemu-nbd工具,该工具qemu-utils会将图像文件及其分区显示为网络块设备-例如/ dev / nbd0 / dev / ndb0p1-可以以与/类似的方式使用上面的dev / mapper设备。

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


1
我的意思是,它认为“聪明”用零填充未使用的空间的方式。这是最明显的典型方法。我不是在问类似的事情。
Grzegorz Wierzowiecki 2012年

1
请描述一种不特定于特定文件系统系列的“智能”算法(例如,zerofill用于ext2 / 3/4)。您想要一个可以完成此任务的程序。您没有说它也必须具有魔力。
cas 2012年

1
而且,实际上,如果文件系统未使用(例如,由于将其安装在主机上以进行零填充),算法的智能程度有什么关系?遍历fs元数据寻找空扇区并不会比只写大量的NUL快或好。文件系统本身已经足够聪明,可以找出空白空间。
cas 2012年

2
一方面,对于您的需求就足够了-因此我的问题已经包含此解决方案的代码段-因此您的答案没有提供任何新内容。另一方面,我的需求需要我指定的内容,因为我想用零擦除未使用的空间而不修改内部结构(例如,重新平衡“跳舞B树”或其他类型的数据结构(例如,用于分析和重复数据删除)目的)
Grzegorz Wierzowiecki,2012年

2
@cas-我认为您错过了以下事实:在VM中压缩虚拟硬盘之前,零填充是必不可少的步骤。如果您有一个500 GB的扩展磁盘,10 GB的文件和10 GB的“空”空间(即已删除的文件),则运行朴素的“巨大的零文件”方法将花费更长的FAR,并且需要VHD膨胀到完整的500 GB。我敢打赌,OP 假设该实用程序也必须是FS特定的。
假名称

3

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

fstrim /mountpoint

在已挂载的文件系统上使用它。

重要的是要注意,这没有安全性优势。如果您想清除磁盘的安全性,请备份文件,使用“ shred”之类的命令将整个磁盘清零,然后还原文件。

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

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.