当源文件相同但分开时,rsync 是否会保留目标上的硬链接?

当源文件相同但分开时,rsync 是否会保留目标上的硬链接?

我正在运行一个(基于 Linux 的)rsync 服务器,用于软件分发。一个(基于 Windows 的)源代码存储库服务器(不受我控制)通过 rsync 向其推送软件包,全球大约有 100 个卫星服务器也通过 rsync 从其提取软件包。

源存储库包含许多大型重复文件。我想通过将这些重复文件替换为硬链接来减少卫星服务器上的磁盘空间和带宽消耗。源存储库的管理员不愿意或无法在源上这样做,因此我试图在分发服务器上事后执行此操作。我已根据命令创建了一个简单的 bash 脚本,该脚本fdupes查找重复文件组并将它们替换为指向单个文件的硬链接。由于使用了 -H 选项,到卫星服务器的 rsync 传输会根据需要保留这些硬链接。但是,从源存储库的传输会产生不一致的结果。有时重复数据删除会保留下来。有时源服务器会重新传输已删除重复文件的组的所有文件,这样即使源文件未发生更改,重复数据删除也会中断。

因此,我的问题是:如果要求 rsync 同步两个相同但独立的文件,并且这些文件确实已存在于目标中且具有正确的内容,但作为指向同一文件的硬链接,rsync 的官方行为是什么?重新传输文件的确切标准是什么?有没有办法确保在这种情况下保留目标中的硬链接,即使源中不存在硬链接?

答案1

tl;dr:要通过目标处的硬链接保留文件级重复数据删除,请rsync使用该--checksum选项运行。

完整答案,根据我做的一系列实验:

如果两个文件在源端没有硬链接,rsync则将分别将它们同步到目标端。它不关心文件是否恰好在目标端进行了硬链接。如果其中一个文件(或两个文件)最终被重新传输,则目标端的硬链接将被破坏,否则将保持不变。也就是说,即使有此选项--hard-linksrsync也不会因为文件在源端没有硬链接而破坏目标端的硬链接。

重新传输文件的标准取决于--checksum-c)和--ignore-times-I)选项。

  • 如果给出了该选项--checksum,则仅重新传输源和目标之间大小或校验和不同的文件。因此,如果文件内容没有改变,则即使源上不存在硬链接,目标上的硬链接也会保留。
  • 如果给出了该选项--ignore-times,则所有文件都将被重新传输,从而破坏目标处任何在源处不存在的硬链接。
  • 如果这两个选项均未给出,rsync则将使用源文件和目标文件的修改时间戳来做出决定。在这种情况下,如果两个源文件的时间戳不同,则目标处的硬链接将始终断开,因为两个时间戳中只有一个可以匹配。

答案2

如果使用 -H 或 --hard-links 选项,它会保留源硬链接

这将不是创建硬链接——您必须事后查找具有相同校验和的文件,删除一个文件,然后添加硬链接来替换它。毕竟,您不希望 rsync 将每个内容重复的文件都变成指向同一文件的硬链接。想象一下,如果每个长度为 0 的文件都是硬链接——您向其中一个文件添加内容,就改变了所有文件的内容。

相关内容