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


95

谁能澄清rsync --checksum--ignore-times选项之间的区别?

我的理解如下:

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

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

那是技术上的差异,但是据我所知,它们在语义上是同一回事。

所以,我想知道的是:

  • 两种选择之间的实际区别是什么?
  • 在什么情况下,您会使用一种而不是另一种?
  • 它们之间在性能上有什么区别吗?

Answers:


99

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

--ignore-times告诉rsync您关闭文件时间和大小的试探法,从而无条件地将所有文件从源传输到目标。rsync然后,它将继续读取源端的每个文件,因为它将需要使用其增量传输算法,或者只是完全发送每个文件(取决于是否--whole-file指定了该选项)。

--checksum还修改了文件时间和大小的启发式方法,但是这里它忽略时间并仅检查大小。源和目标端上大小不同的文件将被传输,因为它们明显不同。对具有相同大小的文件进行校验和(在rsync3.0.0+版本中使用MD5,在较早版本中使用MD4),并且发现总和不同的文件也将被传输。

如果源端和目标端大部分相同,--checksum则将导致大多数文件都被校验和。这可能会花费很长时间,但是最终结果是,最少量的数据实际上将通过电线传输,尤其是在使用增量传输算法的情况下。当然,只有在网络速度很慢和/或CPU速度非常快的情况下,这才是胜利。

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

我想我只会用,--checksum或者--ignore-times如果我将文件传输到怀疑某些文件的内容已损坏但修改时间未更改的目的地,则只能使用。尽管可能还有其他用例,但我真的没有想到使用其他任何理由。


12
我发现对验证备份--checksum很有用--itemize-changes。当前每日/每周更新完成后,我的备份脚本会不时地以这种方式进行全面比较。如果--itemize-changes输出任何意外内容,我会收到一封标记为紧急的电子邮件,因此我知道我应该调查一个潜在的问题。
David Spillett

10
--checksum在Git中工作并在具有更改文件的分支之间切换时很有用,这会不断更改您不打算从特定分支发送的文件的更新时间。
FriendlyDev

6
--ignore-times尤其--checksum是在您的“文件”之一是Truecrypt文件容器的情况下很有必要,因为默认情况下不会更新文件的时间戳。参见productforums.google.com/forum/#!topic/drive/gnmDp3UXEgsask-leo.com/why_wont_my_truecrypt_volume_backup.html
Marcus Junius Brutus

注意:我做了一个快速实验,没有比较ctime,只有mtime。至少在Mac上。了解这一点可能很有用。这就是为什么Windows文件系统存在很多问题的原因,这些文件报告atime,mtime和ctime的同一时间(ctime)。
爱德华·福尔克

是否--checksum在目标计算机,或者在目标目录中的所有文件上的校验只有源文件名?
格雷格

16

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


4

一个细节:checksum选项在一端检查整个文件,然后在另一端检查整个文件。如果您的文件太大,则这种情况会杀死并行性。

另外,如果文件很大,则很可能会遇到的超时问题--checksum,而没有-I


2

info rsync问候到--checksum选项- “由于在连接两端的所有文件的这整个文件校验除了文件的传输过程中发生的自动校验和核查时,此选项可能很慢。”


1
那句话似乎不在我的手册页中……所以,这是否意味着checksum选项将使用校验和来识别文件是否相同,如果不相同,它将传输,从而再次生成校验和,如下所示:转让的一部分?--ignore-times选项仅跳过检查并假定它们已更改?因此,明智的--ignore-times是实现同一目标的更好方法吗?我仍在努力查看为什么有2个不同的选项(除了--checksum更加透明的事实)
Andy Madge 2010年

你应该看看最新的文档编辑:gitweb.samba.org/...
亚历山大Levchuk

2

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

我不知道rsync --ignore-times是否足够聪明,可以避免在增量传输导致什么都不会传输的情况下进行“自动传输后验证”。

对于--ignore-times

  • 如果rsync不明智(或不信任增量编码),则将进行两次检查(校验和和编码)。
  • 也可能是增量编码比128位MD4校验和慢得多的情况。

双方--checksum--ignore-times会“相当缓慢”,但--ignore-times很可能会更慢(因为2点的可能性以上)。

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


我明白你的意思了。我将运行一些测试并发回。
Andy Madge 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.