rsync是否验证在两个本地驱动器之间复制的文件?


64

我想从一个本地驱动器到另一个本地驱动器复制大量文件的新副本。

我已经读到rsync在通过网络将文件发送到远程计算机时会对文件进行校验和比较。

  1. 在两个本地驱动器之间复制文件时,rsync会进行比较吗?

  2. 如果确实进行了验证-这是一个安全的选择吗?还是进行逐字节比较更好?

Answers:


77

rsync始终使用校验和来验证文件是否正确传输。如果目标文件已经存在,则如果修改时间和大小与源文件匹配,则rsync可以跳过更新文件,但是如果rsync决定需要传输数据,则在发送和接收rsync进程之间传输的数据上始终使用校验和。 。这验证了接收到的数据与高概率发送的数据相同,而没有网络上字节级比较的沉重开销。

接收到文件数据后,rsync会将数据写入文件,并相信如果内核指示写入成功,则数据将被写入磁盘而不会损坏。rsync不会重新读取数据,并与已知的校验和进行比较作为附加校验。

至于验证本身,对于协议30及更高版本(在3.0.0中首先受支持),rsync使用MD5。对于较旧的协议,使用的校验和为MD4

尽管长期以来人们一直认为安全加密哈希已过时,但MD5和MD4仍然足以检查文件损坏。

来源:手册页,盯着rsync源代码进行验证。


3
我不想破坏每个人的泡沫,但是rsync仅在添加-c标志时才进行校验和验证!

27
@clint不,答案是正确的。从手册页对-c标志的解释中可以看出:“请注意,rsync始终通过检查在传输文件时生成的整个文件校验和来验证每个传输文件在接收端是否正确重建,但是会自动进行传输后校验验证与该选项的传输前“是否需要更新此文件?”检查无关。”
Michael Mrozek

7
如果在复制后实际验证文件,此答案不清楚。如果校验和是在接收文件时计算的,则它不是复制后校验和,因此您不能确定文件是否正确写入。然后,您需要执行其他比较。
安德烈·米勒

7
拒绝投票,是因为我不喜欢这个答案的详细写法和技术上的正确性,同时又离题太多,以至于误导读者。问题是答案非常详细地说明了传输过程中发生的情况,而发问者则特别声明他关心本地副本不是网络传输。我很确定凯尔·琼斯(Kyle Jones)不想误导任何人,但是这个答案(IMHO)可以。
ndemou,2016年

4
凯尔(Kyle),我不相信您的回答是错误的。我已经注意到它“在细节上写得很好并且在技术上是正确的”,但是它要求读者不必要地专注和小心。为什么在您的答案中途出现117个单词重复描述另一个不相关的验证过程之后,对您的答案中途提出质疑的磁盘数据缺乏验证?无论如何,感谢您的时间和关注。我衷心感谢。
ndemou '16

40

rsync没有做本地文件副本复印件后验证。您可以通过rsync将大文件复制到慢速(即USB)驱动器,然后使用来复制同一文件cp,从而验证是否没有此文件:

time rsync bigfile /mnt/usb/bigfile

time cp bigfile /mnt/usb/bigfile

这两个命令花费的时间大致相同,因此rsync可能无法执行校验和,因为这将涉及从慢速磁盘上重新读取目标文件。

man不幸的是,该页面对此产生了误导。我还用以下方法对此进行strace了验证:复制完成后,rsync不会read()在目标文件上发出任何调用,因此它不能进行校验和。您可以通过以下类似的方法来验证它iotop:您看到rsync同时进行读写(从源复制到目标),然后退出。如果正在验证完整性,那么将存在一个只读阶段。


1
“不幸的是,手册页对此产生了误导。我也使用strace对此进行了验证。”您是跟踪运行中的远程rsync进程还是本地的rsync进程?有两个...即使在使用ssh时,也可以在目标上运行。
user129070 2013年

8
没有本地或远程副本的副本后验证。rsync -c如果要强制检查,请再次运行。
psusi

验证是对传入流进行的。如果文件系统已确认已将其写入,则无需从磁盘读回它。
OrangeDog

17

rsync复制之前(在某些情况下)进行校验和比较,以避免复制已经存在的内容。校验和比较的重点不是验证复制是否成功。这就是基础架构的工作:文件系统驱动程序,磁盘驱动程序,网络驱动程序等。诸如此类的单个应用程序rsync不必为此烦恼。所有rsync要做的事情(就是做!)是检查系统调用的返回值,以确保没有错误。


1
这似乎与公认的答案相矛盾...
djule5 '16

2
@ djule5用什么方式?可接受的答案似乎主要与rsync如何检查传输的文件有关,但是问题和我的答案与本地副本有关。
吉尔斯

3
好吧,在这种情况下,我同意这样做更有意义。因此,“校验和比较的重点不是验证副本是否成功”仅对于本地副本为真;和“校验和始终用于在发送和接收rsync进程之间传输的数据上”仅对传输的副本有效。我发现关于该问题的可接受答案具有误导性,并相信您的答案应该是可接受的答案(仅是我的2美分)。
djule5

我仍然觉得这个答案有点误导。例如,它说,网络驱动程序特别验证了复制是否成功-但是,如果您说校验和比较未仅对本地验证复制是否成功,则网络驱动程序将无法发挥作用。
肯(Ken)

1
@肯,我不明白你要说的重点。我怀疑你看错了东西。只有存在网络副本时,网络驱动程序才起作用。Rsync本身在进行任何复制之前都会进行校验和比较,以确定是否要复制。复制后, Rsync不会进行任何校验和比较(因为它将毫无意义:它知道它只是复制了什么)。
吉尔斯

4

快速而肮脏的答案,直接针对问题。

问:rsync在两个本地驱动器之间复制文件时会进行比较吗?答:它将进行比较以找出要复制的内容。

问:如果确实进行了验证-这是一个安全的选择吗?还是进行逐字节比较更好?答:和文件MD5校验和背后的数学一样安全。您可以尝试做一些简单的实验来学习和信任该工具。

长答案:我想,您想rsync在复制文件后进行文件比较(逐位或校验和)。如果您是少数几个重视数据完整性的公司之一,则可能会发现以下有用的信息:

rsync -avh [source] [destination] && rsync -avhc [source] [destination] 

上面的代码rsync文件文件夹在第一次运行时,如果没有问题的完成,将rsync通过使用整个文件的哈希值在执行相同文件名比较时立即再次运行。


1

使用rsync验证重复项的完整性

为确保此测试从物理上重新读取驱动器介质中的文件,建议在运行此测试之前关闭两个驱动器的电源并重新启动它们。这将清除其内部易失性缓存。

如果还没有重新启动Linux,则至少应使用以下命令删除缓存(*):

sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

然后重新读取两棵树并比较它们的校验和:

rsync --dry-run --checksum --itemize-changes --archive SRC DEST

现代的rsync校验和使用128位的MD5。未能检测到单个文件中的错误的可能性在天文学上极低(这里有一些讨论),但并非不可能。



祝你好运,让结尾的斜杠正确。
nobar

没有消息就是好消息。
nobar

在没有--checksum测试通过之前,请不要打扰。
nobar
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.