Fre*_*rez 86 rsync verification
我想从一个本地驱动器到另一个本地驱动器制作大量文件的全新副本。
我读过 rsync 在通过网络将文件发送到远程机器时对文件进行校验和比较。
在两个本地驱动器之间复制文件时,rsync 会进行比较吗?
如果它确实进行了验证 - 这是一个安全的赌注吗?还是逐字节比较更好?
Kyl*_*nes 100
rsync 总是使用校验和来验证文件是否正确传输。如果目标文件已经存在,如果修改时间和大小与源文件匹配,rsync 可能会跳过更新文件,但如果 rsync 决定需要传输数据,则始终对发送和接收 rsync 进程之间传输的数据使用校验和. 这验证了接收到的数据与以高概率发送的数据相同,而没有通过网络进行字节级比较的大量开销。
接收到文件数据后,rsync 将数据写入文件并相信如果内核指示成功写入,则数据已写入磁盘而不会损坏。rsync 不会重新读取数据并与已知校验和进行比较作为附加检查。
至于验证本身,对于协议 30 及更高版本(在 3.0.0 中首次支持),rsync 使用MD5。对于较旧的协议,使用的校验和是MD4。
虽然长期以来被认为对于安全加密哈希已经过时,但 MD5 和 MD4 仍然足以检查文件损坏。
来源:手册页并查看 rsync 源代码进行验证。
小智 48
rsync并没有做本地文件副本后副本验证。您可以通过使用rsync将大文件复制到慢速(即 USB)驱动器,然后使用 复制同一文件来验证它没有cp,即:
time rsync bigfile /mnt/usb/bigfile
time cp bigfile /mnt/usb/bigfileRun Code Online (Sandbox Code Playgroud)
这两个命令花费的时间大致相同,因此rsync不可能进行校验和——因为这将涉及从慢速磁盘上重新读取目标文件。
man不幸的是,该页面在这方面具有误导性。我还验证了这一点strace- 在复制完成后,rsync不对read()目标文件发出任何调用,因此无法对其进行校验和。您还可以通过以下方式验证它iotop:您看到rsync同时进行读取和写入(从源复制到目标),然后它退出。如果它正在验证完整性,则会有一个只读阶段。
Gil*_*il' 19
rsync在复制之前进行校验和比较(在某些情况下),以避免复制已经存在的内容。校验和比较的重点不是验证复制是否成功。这是底层基础设施的工作:文件系统驱动程序、磁盘驱动程序、网络驱动程序等。诸如此类的个别应用程序rsync不需要为这种疯狂而烦恼。所有rsync需要做的(并且做!)就是检查系统调用的返回值以确保没有错误。
小智 11
直接回答问题的快速而肮脏的答案。
问:rsync在两个本地驱动器之间复制文件时会进行比较吗?A:它会做比较以找出要复制的内容。
问:如果它确实进行了验证 - 这是一个安全的赌注吗?还是逐字节比较更好?答:与文件 MD5 校验和背后的数学一样安全。您可以尝试做简单的实验来学习和信任该工具。
长答案:我想,您想rsync在复制文件后进行文件比较(一点一点或校验和)。如果您是少数重视数据完整性的人之一,您可能会发现以下内容很有用:
rsync -avh [source] [destination] && rsync -avhc [source] [destination]
Run Code Online (Sandbox Code Playgroud)
rsync文件文件夹在第一次运行时,如果完成没有问题,将rsync立即再次运行,同时使用整个文件的哈希值执行相同的文件名比较。为了保证此测试从驱动器介质中物理重新读取文件,我建议在运行此测试之前关闭两个驱动器的电源并重新启动它们。这将清除其内部易失性缓存。
如果不重新启动 Linux,您至少应该使用以下命令删除缓存 ( * ):
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
Run Code Online (Sandbox Code Playgroud)
然后重新读取两棵树并比较它们的校验和:
rsync --dry-run --checksum --itemize-changes --archive SRC DEST
Run Code Online (Sandbox Code Playgroud)
现代rsync校验和使用MD5,它是128位。未能检测到单个文件中的错误的可能性非常低(这里有一些讨论),但并非不可能。