题 --checksum和--ignore-times选项之间的Rsync差异


任何人都可以澄清之间的差异 --checksum 和 --ignore-times rsync的选项?

我的理解如下:

--checksum
如果文件大小和时间匹配,它将在两端执行校验和以查看文件是否真的相同。

--ignore-times
无论两端的文件时间是否相同,都“传输”每个文件。由于它仍将使用增量传输算法,如果文件实际上相同,则不会传输任何内容。

这是技术上的差异,但就我所知,它们在语义上是相同的。

所以,我想知道的是:

  • 两种选择之间的实际区别是什么?
  • 在什么情况下你会使用一个而不是另一个?
  • 它们之间有任何性能差异吗?

75
2017-12-09 20:15






答案:


一般, rsync 当文件在源和目标端具有相同的大小和时间时跳过文件。这是一种启发式方法,通常是一个好主意,因为它可以防止 rsync 从必须检查源和目标端非常可能相同的文件的内容。

--ignore-times 告诉 rsync 关闭文件时间和大小启发式,从而无条件地将所有文件从源传输到目标。 rsync 然后将继续读取源端的每个文件,因为它需要使用其delta传输算法,或者只是完整地发送每个文件,具体取决于是否 --whole-file 选项已指定。

--checksum 还修改了文件时间和大小的启发式,但在这里它忽略了时间并仅检查大小。传输源大小和目标端的文件大小不同,因为它们明显不同。校验和具有相同大小的文件(MD5 in rsync 版本3.0.0+,或在早期版本中使用MD4),并且还发送了具有不同总和的那些。

如果源和目的地方大致相同, --checksum 将导致大多数文件被双方校验和。这可能需要很长时间,但结果是最小的数据实际上将通过线路传输,特别是如果使用增量传输算法。当然,如果您的网络速度非常慢,而且CPU速度非常快,那么这只是一场胜利。

--ignore-times另一方面,它将通过网络发送更多数据,并且它将导致所有源文件被读取,但至少它不会增加在源和目标CPU上计算许多加密强哈希值的额外负担。我希望这个选项的表现要好于 --checksum 当您的网络速度很快,和/或您的CPU相对较慢时。

我想我只会用 --checksum 要么 --ignore-times 如果我将文件传输到目的地,在那里怀疑某些文件的内容已损坏,但其修改时间未更改。虽然可能还有其他用例,但我真的不能想到使用任何一个选项的任何其他好理由。


83
2017-12-09 23:41



我发现了 --checksum 与...一起使用 --itemize-changes 用于验证备份。在当前每日/每周更新完成后,我的备份脚本会不时地以这种方式运行完整比较。我收到了一封标有紧急电子邮件的邮件 --itemize-changes 输出任何意外的东西,所以我知道我应该研究一个潜在的问题。 - David Spillett
- 在Git中工作并在具有已更改文件的分支之间切换时, - checkcksum非常有用,这会不断更改您不打算从特定分支发送的文件的更新时间。 - FriendlyDev
--ignore-times 特别是 --checksum 如果您的一个“文件”是Truecrypt文件容器,则是必需的,因为默认情况下不更新文件的时间戳。看到 productforums.google.com/forum/#!topic/drive/gnmDp3UXEgs 和 ask-leo.com/why_wont_my_truecrypt_volume_backup.html - Marcus Junius Brutus
注意:我做了一个快速实验,并且没有比较ctime,只有mtime。在Mac上,至少。知道这可能很有用。这就是为什么我在Windows文件系统中遇到很多问题,它会报告atime,mtime和ctime的同一时间(ctime)。 - Edward Falk
是否 --checksum 校验和只有目标计算机上的源文件名或目标目录中的所有文件? - Greg


如果您一直使用另一个系统来同步未保留时间戳的文件,则校验和也很有用。校验和将仅传输不同的文件并更新接收端的所有时间戳,以便它们匹配


13
2017-07-24 08:37





一个细节:校验和选项检查一端的整个文件,然后检查另一端的整个文件。如果你的文件有点大,这种方式会杀死并行性。

此外,如果你有大文件,你很可能会遇到超时 --checksum,就像你没有 -I


4
2018-06-03 14:43





info rsync 关于 --checksum 选项 - “由于除了在文件传输期间发生的自动校验和验证之外,连接两端的所有文件的整个文件校验和都会发生,因此该选项可能非常慢。”


2
2017-12-09 20:34



这个句子似乎不在我的手册页中...所以,这是否意味着校验和选项将使用校验和来识别文件是否相同,如果它们不相同则会传输,从而再次生成校验和部分转移? --ignore-times选项只是跳过支票并假设它们已经改变了?因此,性能方面 - 时间 - 是实现相同目标的更好方法吗?我仍在苦苦思索为什么有两种不同的选择(除了--checksum更透明的事实) - Andy Madge
您应该查看最新的文档编辑: gitweb.samba.org/... - Aleksandr Levchuk


--ignore-times 选项可能会导致所有文件增量编码,并且增量传输算法(增量编码)至少与校验和一样慢。

我不知道是不是rsync --ignore-times 足够智能,以避免在delta转移将导致任何转移的频繁情况下的“自动转移后验证”。

对于 --ignore-times

  • 如果rsync不是智能的(或不信任delta编码),那么检查(校验和和编码)将完成两次。
  • 也可能是delta编码比128位MD4校验和慢得多。

--checksum 和 --ignore-times 会“很慢”但是 --ignore-times 可能更慢(由于上述两种可能性)。

好问题 - 如果您在实践中发现任何性能差异,请发布。


2
2017-12-09 22:22



我明白你的意思了。我将进行一些测试并发回。 - Andy Madge