(另一个“复制并验证”问题......)
我想要在多个 HDD 之间复制合理数量的数据,并且我想绝对确保数据复制正确。
我目前的复制方法相当标准,复制然后验证(使用 sha256)。我不喜欢涉及额外的步骤和时间 - 30-60 分钟的校验和足以中断流程,我必须更加努力地工作,以确保我没有错过任何步骤并正确验证所有内容。
因此,我专门寻找一种单步复制和验证过程。
但是,我不想从磁盘缓存中重新读取复制的文件,因为这会否定验证点!
如果绝对需要的话,我准备为这项工作编写自己的工具,但我绝对希望听到有人赞同这里的观点,并且已经编写了像我所描述的那样的工具。
在 Linux 上,我还知道我可以使用echo 3 > /proc/sys/vm/drop_caches
.但每隔几千字节甚至兆字节执行此操作绝对肯定会降低 I/O 性能。这种特定的技术通常也不是可移植的,所以我真的不想把它作为我解决这个问题的解决方案归档。
我知道fsync(file); fdatasync(file); fsync(dir); fdatasync(dir)
这可能是一个很好的起点(这里过度杀伤是好的),但我担心它会杀死顺序流吞吐量?
我当前的想法是进行读/写复制,同时我还打开目标文件,在读/写达到的位置后面256MB,所以它是出色地在 HDD 板载控制器和高速缓存 RAM 的范围之外,然后从该 $copypoint-256MB 位置顺序读取和验证。
我可以做一些花哨的步法O_SYNC | O_DIRECT
并获得可接受的速度吗和很好地保证我的读回从磁盘盘片上获取数据?
或者...先写后验证只是处理“现代”操作系统、HDD 控制器和良好的安全文件 I/O 设计等次优现状的最佳方法吗? :/
答案1
您可以cat
源文件并将其通过管道传输到tee
以将其保存到目标,同时将输出通过管道传输到sha256sum
.这样您就不必重新读取源代码来计算其哈希值。如果您想确保从磁盘而不是缓存中重新读取目标,您可以使用dd
该iflag=direct
选项。