如何在复制时复制并验证文件?

如何在复制时复制并验证文件?

(另一个“复制并验证”问题......)

我想要在多个 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.这样您就不必重新读取源代码来计算其哈希值。如果您想确保从磁盘而不是缓存中重新读取目标,您可以使用ddiflag=direct选项。

相关内容