Answers:
rsync始终使用校验和来验证文件是否正确传输。如果目标文件已经存在,则如果修改时间和大小与源文件匹配,则rsync可以跳过更新文件,但是如果rsync决定需要传输数据,则在发送和接收rsync进程之间传输的数据上始终使用校验和。 。这验证了接收到的数据与高概率发送的数据相同,而没有网络上字节级比较的沉重开销。
接收到文件数据后,rsync会将数据写入文件,并相信如果内核指示写入成功,则数据将被写入磁盘而不会损坏。rsync不会重新读取数据,并与已知的校验和进行比较作为附加校验。
至于验证本身,对于协议30及更高版本(在3.0.0中首先受支持),rsync使用MD5。对于较旧的协议,使用的校验和为MD4。
尽管长期以来人们一直认为安全加密哈希已过时,但MD5和MD4仍然足以检查文件损坏。
来源:手册页,盯着rsync源代码进行验证。
-c
标志的解释中可以看出:“请注意,rsync始终通过检查在传输文件时生成的整个文件校验和来验证每个传输文件在接收端是否正确重建,但是会自动进行传输后校验验证与该选项的传输前“是否需要更新此文件?”检查无关。”
rsync
并没有做本地文件副本复印件后验证。您可以通过rsync
将大文件复制到慢速(即USB)驱动器,然后使用来复制同一文件cp
,从而验证是否没有此文件:
time rsync bigfile /mnt/usb/bigfile
time cp bigfile /mnt/usb/bigfile
这两个命令花费的时间大致相同,因此rsync
可能无法执行校验和,因为这将涉及从慢速磁盘上重新读取目标文件。
man
不幸的是,该页面对此产生了误导。我还用以下方法对此进行strace
了验证:复制完成后,rsync
不会read()
在目标文件上发出任何调用,因此它不能进行校验和。您可以通过以下类似的方法来验证它iotop
:您看到rsync
同时进行读写(从源复制到目标),然后退出。如果正在验证完整性,那么将存在一个只读阶段。
rsync -c
如果要强制检查,请再次运行。
rsync
在复制之前(在某些情况下)进行校验和比较,以避免复制已经存在的内容。校验和比较的重点不是验证复制是否成功。这就是基础架构的工作:文件系统驱动程序,磁盘驱动程序,网络驱动程序等。诸如此类的单个应用程序rsync
不必为此烦恼。所有rsync
要做的事情(就是做!)是检查系统调用的返回值,以确保没有错误。
快速而肮脏的答案,直接针对问题。
问:rsync
在两个本地驱动器之间复制文件时会进行比较吗?答:它将进行比较以找出要复制的内容。
问:如果确实进行了验证-这是一个安全的选择吗?还是进行逐字节比较更好?答:和文件MD5校验和背后的数学一样安全。您可以尝试做一些简单的实验来学习和信任该工具。
长答案:我想,您想rsync
在复制文件后进行文件比较(逐位或校验和)。如果您是少数几个重视数据完整性的公司之一,则可能会发现以下有用的信息:
rsync -avh [source] [destination] && rsync -avhc [source] [destination]
rsync
文件文件夹在第一次运行时,如果没有问题的完成,将rsync
通过使用整个文件的哈希值在执行相同文件名比较时立即再次运行。为确保此测试从物理上重新读取驱动器介质中的文件,建议在运行此测试之前关闭两个驱动器的电源并重新启动它们。这将清除其内部易失性缓存。
如果还没有重新启动Linux,则至少应使用以下命令删除缓存(*):
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
然后重新读取两棵树并比较它们的校验和:
rsync --dry-run --checksum --itemize-changes --archive SRC DEST
现代的rsync校验和使用128位的MD5。未能检测到单个文件中的错误的可能性在天文学上极低(这里有一些讨论),但并非不可能。
--checksum
测试通过之前,请不要打扰。