Answers:
bsdtar
(至少从libarchive
3.1.2起)能够FS_IOC_FIEMAP
在支持ioctl的文件系统上使用ioctl 来检测稀疏部分(尽管它也支持许多其他API),但是至少在我的测试中,很奇怪无法处理tar
它自己生成的文件(尽管看起来像个错误)。
但是,使用GNU tar
提取它们是可行的,但是GNU tar无法处理bsdtar支持的某些扩展属性。
所以
bsdtar cf - sparse-files | (cd elsewhere && tar xpf -)
只要文件没有扩展的属性或标志就可以工作。
它对于完全稀疏的文件(仅为零)仍然不起作用,因为FS_IOC_FIEMAP
ioctl然后返回0范围,并且看起来bsdtar
无法正确处理(另一个错误?)。
star
(Schily tar)是另一个开源tar实现,它可以检测稀疏文件(使用该-sparse
选项),并且没有这些bug bsdtar
(但许多系统未打包)。
本文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命令行工具,用于同步大文件(例如虚拟机磁盘映像和数据库)的内容。
如果您愿意为此付费,这可能是最好的解决方案,因为它似乎是专门针对此类情况编写的。