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

adr*_*nos 9 tar rsync sparse-files

我有一个稀疏文件。(du -h报告 3G 和du -h --apparent-size报告 100G。)到目前为止,一切都很好。

现在,当我想使用 压缩文件tar或使用将其通过网络发送时rsync,它将需要与 3G 一样多的时间。似乎这些工具读取所有零。

我认为这些洞是以某种方式标记的,而这些工具可以以某种方式跳过它们?

我的文件可能没有问题?

这是一个缺失的功能,tarrsync不是寻找稀疏文件吗?我使用了tar参数--sparse,但这并没有加快速度。rsync参数也没有--sparse

有没有办法在稀疏文件上加快这些工具的速度?

Sté*_*las 7

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

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

所以

bsdtar cf - sparse-files | (cd elsewhere && tar xpf -)
Run Code Online (Sandbox Code Playgroud)

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

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

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


ter*_*don 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
Run Code Online (Sandbox Code Playgroud)

然后您可以使用rsync --inplace复制文件。这应该只需要一次。


同一篇文章建议使用Virtsync

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

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