如何使用tar,gzip,rsync加快对稀疏文件的操作?


9

我的文件稀疏。(du -h报告3G,du -h --apparent-size报告100G。)到目前为止,还不错。

现在,当我要使用压缩文件tar或使用进行网络传输时rsync,将需要3G的时间。这些工具似乎读取了所有零。

我以为以某种方式标记了漏洞,而这些工具可能以某种方式跳过了它们?

我的文件可能没有问题?

这是在缺少功能tarrsync不看稀疏文件?我使用了tar参数--sparse,但是并没有加快速度。rsync参数也没有--sparse

有什么方法可以在稀疏文件上加快这些工具的速度吗?

Answers:


7

bsdtar(至少从libarchive3.1.2起)能够FS_IOC_FIEMAP在支持ioctl的文件系统上使用ioctl 来检测稀疏部分(尽管它也支持许多其他API),但是至少在我的测试中,很奇怪无法处理tar它自己生成的文件(尽管看起来像个错误)。

但是,使用GNU tar提取它们是可行的,但是GNU tar无法处理bsdtar支持的某些扩展属性。

所以

bsdtar cf - sparse-files | (cd elsewhere && tar xpf -)

只要文件没有扩展的属性或标志就可以工作。

它对于完全稀疏的文件(仅为零)仍然不起作用,因为FS_IOC_FIEMAPioctl然后返回0范围,并且看起来bsdtar无法正确处理(另一个错误?)。

starSchily tar)是另一个开源tar实现,它可以检测稀疏文件(使用该-sparse选项),并且没有这些bug bsdtar(但许多系统未打包)。


2

本文rsync至少提供一些有用的建议:

问题

使用rsync --sparse works,但会导致大量不必要的磁盘写入。在50GB长(使用1GB)上更改10个字节应该只能写入一个或两个块,这将导致写入1GB。这很慢,可能不利于磁盘的使用寿命。

使用的rsync --inplace作品,但创建非稀疏文件。

您不能同时使用--sparse和--inplace :-( rsync不允许这样做。rsync:--sparse不能与--inplace一起使用

如果使用--inplace更新先前存在的稀疏文件,则该文件将保持稀疏状态,并且仅写入少量块。仅当rsync --inplace创建文件时,它才会变得稀疏。

因此,解决方案是在源计算机上为源计算机上的每个文件在目标计算机上创建一个相应的,长度正确,空的稀疏文件(如果目标计算机上尚不存在该文件)。

然后rsync --inplace将按预期工作,使稀疏文件保持稀疏状态,仅将更改的块写入磁盘。

因此,如果我没看错的话,您首先要在目标上创建一个空的稀疏文件。你可以用

truncate -s 3G filename

然后,您可以rsync --inplace用来复制文件。这仅需要一次。


同一篇文章中建议使用Virtsync这是

一个售价49美元的商业Linux命令行工具,用于同步大文件(例如虚拟机磁盘映像和数据库)的内容。

如果您愿意为此付费,这可能是最好的解决方案,因为它似乎是专门针对此类情况编写的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.