因此,rsync 在决定传输什么(即文件中的哪些部分)的过程中会运行一些校验和。但是,与正常的网络传输相比,是否有理由更信任接收端最终获得的文件?我应该在 rsync 完成后运行校验和来验证数据吗?重新运行 rsync 并开启预检查(即 --checksum 选项)是否是实现此目的的可接受方法?
答案1
一般来说,rsync 校验和机制相当可靠。这里的权衡是常见的:您可以进行更多验证,但这将花费更多时间。如果您真的担心两台机器上的一组文件完全相同,则应该运行单独的验证。例如,您可以在两侧的文件列表上使用 md5sum 并比较结果。假设文件在此期间没有更改(如日志文件),这将使您非常有信心两侧的文件是相同的。
答案2
使用rsync -Pahn --checksum /path/to/source /path/to/destination | sed '/\/$/d' | tee migration.txt
sed
从校验和验证中删除目录。
tee
同时输出到屏幕和文件。
请记住,如果您的文件非常大,这可能不是一个合适的方法,因为验证将需要很长时间。
答案3
针对您的情况,有一个专门用于监控同步后文件完整性的工具。它独立于 rsync 工作,当然是完全开源的。
https://github.com/dennisrazumovsky/precizer
precizer 是一款 CLI 应用程序,用于检查同步后文件的完整性。该程序以递归方式遍历目录并创建文件及其校验和的数据库,然后进行快速比较。
precizer 专注于处理巨型文件系统。使用该程序可以通过将数据与来自不同来源的文件及其校验和进行比较来查找同步错误。或者,它可以通过比较来自同一来源的不同时间的数据库来抓取历史变化。
简单示例
假设有两台主机,磁盘很大,内容也完全一样,分别挂载在/mnt1和/mnt2上,一般就是检查一下内容是否完全一样,或者有没有什么区别。
1.在第一台主机名为host1的机器上运行该程序:
precizer --progress /mnt1
程序运行后,将递归遍历从 /mnt1 开始的所有目录,并在当前目录中创建 host1.db 数据库。--progress 选项可直观显示进度,并显示空间量和正在检查的文件数。
2. 在第二台具有主机名的机器上运行该程序,例如 host2:
precizer --progress /mnt2
结果,将在当前目录中创建 host2.db 数据库。
3.将包含 host1.db 和 host2.db 数据库的文件复制到其中一台机器,并使用适当的参数运行程序来比较数据库:
precizer --compare host1.db host2.db
屏幕上将显示以下信息:
- 哪些文件在 host1 上缺失,但在 host2 上存在,反之亦然。
- 对于两个主机上存在的文件,校验和不匹配。