--checksum
有人能澄清一下 rsync和选项之间的区别吗--ignore-times
?
我的理解如下:
--checksum
如果文件大小和时间匹配,它将在两端进行校验,以查看文件是否真的相同。
--ignore-times
“传输”每个文件,无论两端的文件时间是否相同。由于它仍将使用增量传输算法,因此如果文件实际上相同,则不会传输任何内容。
这是技术上的区别,但据我所知,它们在语义上是相同的。
所以,我想知道的是:
- 这两个选择之间有何实际区别?
- 在什么情况下你会使用其中一个而不是另一个?
- 它们之间在性能上有什么区别吗?
答案1
通常,rsync
当源端和目标端的文件大小和时间相同时,会跳过这些文件。这是一种启发式方法,通常是一个好主意,因为它可以避免rsync
检查源端和目标端很可能相同的文件的内容。
--ignore-times
告诉rsync
关闭文件时间和大小启发式方法,从而无条件地将所有文件从源传输到目标。rsync
然后将继续读取源端的每个文件,因为它需要使用其增量传输算法,或者简单地发送每个文件的全部内容,这取决于是否--whole-file
指定了该选项。
--checksum
还修改了文件时间和大小启发式方法,但在这里它忽略了时间,只检查大小。源端和目标端大小不同的文件将被传输,因为它们显然不同。大小相同的文件将进行校验(在rsync
3.0.0+ 版本中使用 MD5,在早期版本中使用 MD4),并且发现总和不同的文件也会被传输。
如果源端和目标端基本相同,--checksum
则会导致大多数文件在两端进行校验和。这可能需要很长时间,但结果是实际上只有最少的数据会通过线路传输,尤其是在使用增量传输算法的情况下。当然,只有在网络速度非常慢和/或 CPU 速度非常快的情况下,这才是胜利。
--ignore-times
另一方面,将通过网络发送更多数据,并导致读取所有源文件,但至少不会给源和目标 CPU 带来计算许多加密强度高的哈希值的额外负担。我希望此选项的性能比您--checksum
的网络速度快和/或 CPU 相对较慢时更好。
我认为,只有在将文件传输到怀疑某些文件的内容已损坏但修改时间未更改的目的地时,我才会使用--checksum
或--ignore-times
。我真的想不出使用这两个选项的任何其他好理由,尽管可能还有其他用例。
答案2
如果您一直使用其他系统来同步文件,而该系统没有保留时间戳,那么校验和也很有用。校验和只会传输不同的文件,并更新接收端的所有时间戳,使它们匹配
答案3
一个细节:校验和选项在一端检查整个文件,然后在另一端检查整个文件。如果你的文件比较大,这会破坏并行性。
此外,如果您有大量文件,则最有可能遇到超时--checksum
,因为您不需要-I
。
答案4
该--ignore-times
选项可能会导致所有文件都进行增量编码,并且增量传输算法(增量编码)至少与校验和一样慢。
我不知道 rsync 是否--ignore-times
足够智能,能够在增量传输不会导致任何内容被传输的常见情况下避免“传输后自动验证”。
为了--ignore-times
:
- 如果 rsync 不够智能(或者不信任增量编码),那么将进行两次检查(校验和和编码)。
- 也可能存在这样的情况,即增量编码比 128 位 MD4 校验和慢得多。
和--checksum
都会--ignore-times
“相当慢”,但--ignore-times
可能会更慢(由于上述两种可能性)。
好问题——如果您在实践中发现任何性能差异,请发表帖子。