bsdtar 与 gnu tar - 稀疏文件

bsdtar 与 gnu tar - 稀疏文件

我一直在使用 qemu 原始图像,对于使用 tar 处理这些图像我有几个疑问。

据我所知,内核版本 >= 3.1 的 bsdtar 能够比 gnu tar 更快地处理稀疏映像文件,因为它可以利用内核中的 seek_hole 功能。我对其进行了测试,它比 tar 快得多。

我的问题是……我的镜像文件(全尺寸)是 260G。由于它不是满的并且很稀疏,所以实际上只占用了 38G。当我执行 a 时,tar -cvSf test.img.tar test.img它需要很长时间(约 10 分钟),但最终得到的文件大小为 20G。如果我解压,它会回到 38G。当我执行 a 时,速度bsdtar -cvf test.img.tar test.img it要快得多(约 2.5 分钟),但文件大小是 38G,而不是 gnu tar 给我的 20G。

有什么区别?为什么使用 tar 后文件大小会更小?我期望其行为与 bsdtar 类似,因为我认为 tar -S 仅强制 tar 将文件视为稀疏文件而不对其进行扩展,因此我不明白为什么文件大小会更小。

提前致谢!

答案1

来自 GNU tar 手册(信息):

8.1.2 归档稀疏文件

文件系统中的文件偶尔会有“空洞”。文件中的“空洞”是指文件内容中从未写入的部分。空洞的内容读作全零。在许多操作系统中,实际的磁盘存储空间并未分配给空洞,但它们被计入文件的长度中。如果您存档这样的文件,“tar”可能会创建一个比原始文件更长的存档。要让“tar”尝试识别文件中的空洞,请使用“--sparse”(“-S”)。当您使用此选项时,对于任何使用比其长度预期更少磁盘空间的文件,“tar”会在文件中搜索连续的零。然后,它会在文件的存档中记录连续的零所在的位置,并仅存档文件的“实际内容”。在提取时(提取时不需要使用“--sparse”),任何此类文件都会在发现连续零的位置产生空洞。因此,如果您使用‘--sparse’,‘tar’档案将不会比原始档案占用更多的空间。

'-S' '--sparse' 此选项指示 'tar' 在尝试存档之前测试每个文件的稀疏性。如果发现文件稀疏,则对其进行特殊处理,从而减少其映像在存档中使用的空间量。

此选项仅在创建或更新档案时才有意义。它对提取没有影响。

执行文件系统备份时考虑使用“--sparse”,以避免归档系统中稀疏存储的文件的扩展形式。

即使您的系统目前没有稀疏文件,将来也可能会创建一些。如果您在进行文件系统备份时理所当然地使用“--sparse”,则可以确保存档在介质上占用的空间绝不会超过文件在磁盘上占用的空间(否则,存档一个充满稀疏文件的磁盘可能需要数百盘磁带)。*注意增量转储::。

但是,请注意“--sparse”选项存在一个严重的缺点。也就是说,为了确定文件是否稀疏,“tar”必须在尝试存档之前读取它,因此文件总体上被读取两次。因此,请始终记住,使用此选项处理所有文件所需的时间大约是不使用此选项存档所需时间的两倍。

使用“POSIX”存档格式时,GNU“tar”能够使用三种不同的方式存储稀疏文件,称为“稀疏格式”。稀疏格式由其“编号”标识,通常由两个十进制数组成,以点分隔。默认情况下,使用格式“1.0”。如果出于某种原因,您希望使用较早的格式,则可以使用“--sparse-version”选项进行选择。

'--sparse-version=版本'

选择存储稀疏文件的格式。有效的 VERSION 值为:“0.0”、“0.1”和“1.0”。*注意稀疏格式::,了解每种格式的详细描述。

使用‘--sparse-format’选项意味着‘--sparse’。

(强调添加)


也就是说,它的速度较慢,因为它读取文件两次;第一次是分析文件内容,第二次是实际存档。
这种检测稀疏性的方法可能也解释了为什么存档最终会变得更小;很可能存在大量实际上并非稀疏存储的零序列。

相关内容