如何将 Linux 磁盘映像转换为稀疏文件?

end*_*ith 14 linux compression mount filesystems

我在 EXT 分区上有一堆用 ddrescue 制作的磁盘映像,我想在不丢失数据的情况下减小它们的大小,同时仍然可以安装。

如何用零填充图像文件系统中的空白空间,然后将文件转换为稀疏文件,这样这个空白空间实际上并不存储在磁盘上?

例如:

> du -s --si --apparent-size Jimage.image 
120G Jimage.image
> du -s --si Jimage.image 
121G Jimage.image
Run Code Online (Sandbox Code Playgroud)

不过,这实际上只有 50G 的真实数据,所以第二次测量应该小得多。

这应该会用零填充空白空间:

cat /dev/zero > zero.file
rm zero.file
Run Code Online (Sandbox Code Playgroud)

但是如果稀疏文件被透明处理,它实际上可能会创建一个稀疏文件而不向虚拟磁盘写入任何内容,具有讽刺意味的是阻止我将虚拟磁盘映像本身转换为稀疏文件。:) 可以?

注意:出于某种原因,sudo dd if=/dev/zero of=./zero.filecat不在已安装的磁盘映像上时有效。

mih*_*ihi 19

首先,稀疏文件只有在您查找时才会透明处理,如果您写零则不会。

为了更清楚,维基百科的例子

dd if=/dev/zero of=sparse-file bs=1k count=0 seek=5120
Run Code Online (Sandbox Code Playgroud)

没有写任何零,它会打开输出文件,寻求(跳过)5MB,然后写零(即什么都没有)。这个命令(不是来自维基百科)

dd if=/dev/zero of=sparse-file bs=1k count=5120
Run Code Online (Sandbox Code Playgroud)

将写入 5MB 的零并且不会创建稀疏文件!

因此,已经是非稀疏的文件以后不会神奇地变得稀疏。

其次,要与许多零稀疏的文件,你必须CP

cp --sparse=always original sparsefile
Run Code Online (Sandbox Code Playgroud)

或者您也可以使用tarrsync的 --sparse 选项。

  • @endolith:更新了我的答案,以明确使用 `dd` 来写零或寻找的区别。 (2认同)
  • @Ludwig Weinzierl:是的,`cat` 命令将用“真实”零填充您的整个磁盘(或至少不是为 root 或配额保留的数量),并且不创建稀疏文件。 (2认同)

Onl*_*job 12

也许在适当位置稀疏文件的最简单方法是使用fallocate实用程序,如下所示:

fallocate -v --dig-holes {file_name}
Run Code Online (Sandbox Code Playgroud)

fallocate(1)Debian上的util-linux包提供。

  • 出于某种原因,`fallocate --dig-holes` 产生了 299GiB 原始文件中的 103GiB 文件,而 `cp --sparse=always` 给了我 93GiB——所有文件都具有相同的 SHA1 总和(大小通过 `du -B1G` 与 ` du --apparent-size -B1G`)。所以“fallocate”似乎给出了较差的结果。 (2认同)