rsync 能否仅用于复制存档中的更改?

rsync 能否仅用于复制存档中的更改?

假设我将我的网络托管压缩到tar.gz存档中以创建名为 的备份backup.tar.gz

一个月后我想重复这个过程。假设我正在积极开发该网站,因此自上次备份以来发生了一些更改。

我(或我的 cron 工作)在一个月后重复这个过程,我覆盖backup.tar.gz带有更新备份存档的原始文件。

如果我要使用rsync它来将其同步backup.tar.gz到远程备份目标(例如,通过 SFTP),我是否只能同步两个文件之间的增量?

覆盖文件会通过创建新时间戳来影响行为吗?

或者 rsync 是否能够在任何情况下查看存档,识别出大部分存档已保留在目标上,并且仅同步更改?

谢谢你!

答案1

压缩(gzipped)文件将通过在源中添加一个字节来进行整体转换。这使得它完全不适合高效复制,rsync因为即使是最微小的更改也需要传输整个文件。

gzip幸运的是,可以调整 的一些实现来压缩以实现高效传输rsync

--rsyncable[...]使用此选项,rsync 只能传输已更改的文件以及更新已更改区域中的存档结构所需的少量元数据。

您无法直接从 访问此标志tar,因此您需要使用管道而不是tar直接压缩

tar cf - files and folders | gzip --rsyncable > output.tgz

(有一个GZIP环境变量可用于为 的所有调用设置此值gzip,但文档已将其标记为过时,因此我不建议您随意使用它。)

答案2

默认情况下,Rsync仅同步修改的块和字节。因此,如果您之前同步过文本文件,后来在同步时向源文件中添加了一些文本,则只会复制插入的文本。

如果您使用未压缩的 tar 文件并将文件附加到其中

tar -rf archive.tar file3.txt

那么 rsync 将能够仅传输 tar 文件末尾的新差异。

但是,如果您从头开始创建 tar 文件,则 tar 在某些情况下将文件和目录添加到存档的方式可能是不确定的。

非常相似的文件系统上的两个 tar 操作很可能会创建底层结构截然不同的 tar 文件。

然而,根据这种不确定性行为的严重程度,rsync delta 算法可能会取得一些胜利。

将输出压缩为 .gz 的行为只会让事情变得更糟。压缩数据是一种转换行为,甚至向 tar 文件添加一些额外的字节然后对其进行压缩,也可以从根本上改变其整个结构。从而击败了 rsync 实现的滚动哈希算法。

最好不要自行压缩 tar 文件,但允许 rsync 使用 rsync、--compress 或 -z 压缩它发送的数据

Tar 不是确定性的,因为它添加填充,它不按特定顺序对文件进行排序,并且添加时间戳等

某些系统(例如 Nix/Nixos)使用称为 NAR 的确定性存档格式。 NAR 是尼克斯档案馆。

如果您想了解更多关于归档器中的非确定性行为以及如何克服这一点...您可以在 Dolstra 的博士论文中找到更多信息。

https://edolstra.github.io/pubs/nixos-jfp-subscribed.pdf

相关内容