假设我将我的web主机压缩到一个tar.gz
存档中,以便创建一个名为backup.tar.gz
的备份。
一个月后,我想重复这个过程。让我们假设我正在积极地开发这个站点,因此自从上次进行备份以来已经有了一些更改。
一个月后,我(或我的cron作业)重复这个过程,我用更新备份存档覆盖原始的backup.tar.gz
。
如果我使用rsync
将该backup.tar.gz
同步到远程备份目标(例如,通过SFTP),那么我只能同步这两个文件之间的增量吗?
覆盖文件是否会通过创建新的时间戳来影响行为?
或者rsync能够查看存档,在任何情况下,都能识别出大部分存档已经在目标上,并且只对更改进行同步?
谢谢!
发布于 2020-07-19 11:43:04
压缩(gzipped)文件将通过附加到源的单个字节进行整体转换。这使得它完全不适合使用rsync
进行高效的复制,因为即使是最微小的更改也需要传输完整的文件。
幸运的是,gzip
的一些实现可以通过rsync
进行调整以进行压缩,以便进行有效的传输,
使用此选项的
--rsyncable
...,rsync只能传输已更改的文件以及更新已更改区域中的归档结构所需的少量元数据。
不能直接从tar
访问此标志,因此需要使用管道,而不是让tar
直接压缩。
tar cf - files and folders | gzip --rsyncable > output.tgz
(有一个GZIP
环境变量,可用于为gzip
的所有调用设置此值,但文档将其标记为过时,因此我不建议您随意使用它。)
发布于 2020-07-19 11:07:36
默认情况下,Rsync只同步修改的块和字节。因此,如果您在同步之前同步了一个文本文件,然后在同步时将一些文本添加到源文件中,那么只会复制插入的文本。
如果您使用未压缩的tar文件并将文件附加到
tar -rf archive.tar file3.txt
然后rsync将能够在tar文件的末尾传输新的差异。
但是,如果您从头创建一个tar文件,在某些情况下,tar在向归档中添加文件和目录的方式上可能是不确定的。
非常相似的文件系统上的两个tar操作很有可能在底层结构上创建非常不同的tar文件。
然而,取决于这种不确定行为有多大,rsync增量算法可以找到一些胜利。
将输出压缩到.gz的行为只会使事情变得更糟。压缩数据是一种转换行为,即使在tar文件中添加几个额外的字节,然后对其进行压缩,也会从根本上改变它的整个结构。从而击败了rsync实现的滚动散列算法。
可能最好不要压缩tar文件,而是允许rsync压缩它用rsync发送的数据,- compress或-z。
Tar不是确定性的,因为它是add填充,它不按特定顺序排序文件,并且添加时间戳等。
有些系统(如Nix/Nixos )使用称为NAR的确定性存档格式。NAR是Nix ARchive。
如果你想了解更多关于档案中的非确定性行为,以及如何克服这一点.您可以在Dolstra的PhD论文中找到更多信息。
https://unix.stackexchange.com/questions/599271
复制相似问题