如何将包含大量零的文件解压缩为稀疏文件?

jay*_*ica 18 compression sparse-files files disk-image

我有一个使用创建的非常大的硬盘的压缩原始图像cat /dev/sdx | xz > image.xz。但是,在此操作之前,驱动器中的可用空间已清零,并且图像大部分由零字节组成。将此图像提取为稀疏文件的最简单方法是什么,以使零块不占用任何空间?

Mar*_*ler 30

引用xz联机帮助页(您确实应该咨询此类问题),我在其中快速搜索了sparse

--no-sparse
禁用稀疏文件的创建。 默认情况下,如果解压缩为常规文件,如果解压缩的数据包含长序列的二进制零,则 xz 会尝试使文件稀疏。只要标准输出连接到常规文件并且满足某些附加条件以确保其安全,它也可以在写入标准输出时起作用。创建稀疏文件可以通过减少磁盘 I/O 量来节省磁盘空间并加快解压速度。

(强调我的)

因此,您无需执行任何操作;用默认xz工具解压即可。

  • 一项附录:您要解压缩到的文件系统必须支持稀疏文件。如今,流行的类 UNIX 系统上最广泛使用的文件系统都可以这样做,但如果提取到闪存驱动器或 SD 卡,则不能指望该文件系统具有适当的支持。 (7认同)

Ste*_*ris 15

dd命令的 GNU、NetBSD 和 FreeBSD 实现至少有一个conv=sparse. 引用GNUdd手册:

sparse
尝试寻找而不是写入 NUL 输出块。在支持稀疏文件的文件系统上,这将在扩展输出文件时创建稀疏输出。conv=notrunc将此转换与或 结合使用时要小心oflag=append。使用 时conv=notrunc,输出文件中与输入中的 NUL 块相对应的现有数据将保持不变。执行oflag=append的搜索将是无效的。类似地,当输出是设备而不是文件时,不会复制 NUL 输入块,因此此转换对于虚拟或预置零设备最有用。

所以我会尝试

xz -dc < image.xz | dd of=image conv=sparse
Run Code Online (Sandbox Code Playgroud)

以这种方式使用dd将适用于任何形式的输入(无论第一个命令本身是否可以生成稀疏文件)。

  • 这样做没有意义。`xz` 自己就可以做到这一点。 (4认同)
  • @JohnBollinger 我以另一种方式阅读了“man”摘录,因为它修改了“dd”写入输出的方式:如果“dd”获得“NUL”输入块,它不会“write()”,而只是“ lseek()` 到*下一个*块将被写入的位置。只要输出块与文件系统块正确对齐,无论输入类型如何,都应该创建一个稀疏文件。 (2认同)
  • @JohnBollinger:`dd` 的输出*没有*连接到这里的管道;这个答案建议将解压缩的“xz”输出(带有文字零)传输到“dd of=image”中,以便 dd 找到零并在它创建的输出“image”文件中查找。这通常是有效的,只是在这种情况下不需要,因为“xz”在写入可查找文件时会自行执行此操作。(呃,我猜是它创建的一个,而不是它的标准输出在一个已经存在的文件上,可能包含非零内容) (2认同)