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

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

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

答案1

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

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

(强调我的)

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

答案2

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

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

所以我会尝试

xz -dc < image.xz | dd of=image conv=sparse

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

答案3

根据我的经验,在使用 SSD 和 NVME 等现代硬件时, dd -conv=sparse 和/或使用 gzip/pbzip/xz 等不会产生良好的结果,因为未分配的块将返回随机数据,无法使用这些数据进行压缩或转换疏。我建议使用:

partclone.<fstype> -c -d -s /dev/<input> -o /path/to/<output>

这将始终创建最小的文件并且创建/恢复速度最快。如果您愿意,您还可以添加压缩、CRC 等。

相关内容