我一直在使用qemu原始图片,而且我只是在使用tar时遇到了一些问题。
从我读的内容来看,内核> = 3.1的bsdtar能够比gnu tar快得多处理稀疏图像文件,因为它可以利用内核的seek_holefunction。 我testing了它,它比焦油快得多。
我的问题是这个…我的图像文件(全尺寸)是260G。 由于它不够饱满,所以只占用38G。 当我做一个tar -cvSf test.img.tar test.img需要很长时间(~10分钟),但是最终我得到了一个20G的文件。 如果我解开,它会回到38G。 当我做一个bsdtar -cvf test.img.tar test.img it会更快( bsdtar -cvf test.img.tar test.img it分钟),但是文件大小是gnu tar给我的20G的38G intead。
有什么不同? 为什么使用tar的文件较小? 我期望的行为就像bsdtar所做的一样,因为我认为tar-s只是强制tar把文件视为稀疏文件,而不是扩展它,所以我不明白为什么它更小。
提前致谢!
从GNU tar手册(信息):
8.1.2存档稀疏文件
文件系统中的文件偶尔会有“漏洞”。 文件中的“空洞”是文件内容中从未被写入的部分。 一个洞的内容全部为零。 在许多操作系统上,实际的磁盘存储空间并没有被分配,但是它们被计算在文件的长度中。 如果你存档这样的文件,'tar'可以创build比原来更长的存档。 要让'tar'尝试识别文件中的空洞,可以使用'–sparse'('-S')。 当你使用这个选项的时候,对于任何文件占用的磁盘空间都比从它的长度来的磁盘空间要less,'tar'search文件连续的零。 然后在档案中logging连续延伸的零的文件,并仅存档文件的“真实内容”。 在提取时(在提取时不需要使用“–sparse”),任何这样的文件在连续延伸的零被发现的地方都会产生空洞。 因此,如果使用'–sparse','tar'档案将不会占用比原来更多的空间。
'-S''–sparse'该选项指示'tar'在尝试归档之前testing每个稀疏文件。 如果发现文件稀疏,则会专门处理文件,从而可以减less文件中的图像占用空间。
只有在创build或更新档案时,此选项才有意义。 它对提取没有影响。
执行文件系统备份时,请考虑使用'–sparse',以避免归档存储在系统中稀疏文件的扩展forms。
即使您的系统目前没有稀疏文件,也可能会在将来创build一些文件。 当然,如果在进行文件系统备份时使用“–sparse”,则可以确定存档不会占用介质上的空间多于文件在磁盘上的占用空间(否则,将存满稀疏文件的磁盘存档可能会采取数百磁带)。 *注意增量转储::。
但是,请注意“–sparse”选项存在严重的缺陷。 也就是说,为了确定文件是否稀疏,“tar”在尝试归档之前必须读取它,因此总共读取文件两次 。 因此,请始终记住,使用此选项处理所有文件所需的时间大约是没有该文件时所需时间的两倍。
当使用'POSIX'存档格式时,GNU'tar'能够以三种不同的方式存储稀疏文件,称为“稀疏格式”。 稀疏格式由其“数字”标识,通常由两个十进制数组成,由点分隔。 默认情况下,使用格式“1.0”。 如果出于某种原因希望使用较早的格式,则可以使用'–sparse-version'选项进行select。
'–sparse-版本='
select存储稀疏文件的格式。有效的VERSION值为:“0.0”,“0.1”和“1.0”。 *注意稀疏格式::,每种格式的详细说明。
使用'–sparse-format'选项意味着'–sparse'。
(强调加)
即比较慢,因为它读取文件两次; 第一次分析文件内容,第二次实际归档它们。
这种检测稀疏性的方法也可能解释为什么归档结果更小; 很可能有一些零的重要序列实际上并不稀疏地存储。