如何验证 1TB 文件是否已正确传输?

如何验证 1TB 文件是否已正确传输?

我经常将虚拟机映像从虚拟机管理程序传输到存档服务器以进行长期存储。

我使用 netcat 进行传输,因为它比 scp、rsync 等更快。

hypervisor$ cat foo.box | nc <archive IP> 1234

archive$ nc -l -p 1234 > foo.box

md5sum当文件传输完成后,我会通过在目标和源上运行来验证没有损坏。

不幸的是,对大型文件运行 md5sum 需要很长时间。如何才能更快地比较两个大型文件的完整性?

更新:

  • 我的传输很少中断,因此重启能力不是问题。
  • 通过NC传输一般需要3-4个小时,然后需要40分钟才能得到md5sum。
  • 在这种情况下,哈希的安全性不是问题。

答案1

您可以使用球座 使用类似这样的方法即时进行求和(根据您的需要调整 netcat 命令):

服务器:

netcat -l -w 2 1111 | tee >( md5sum > /dev/stderr )

客户:

tee >( md5sum > /dev/stderr ) | netcat 127.0.0.1 1111

答案2

Nerdwaller 的回答如果您主要担心网络上的损坏,那么同时传输tee和计算校验和是一种很好的方法。但它无法保护您免受传输到磁盘等过程中的损坏,因为它在到达磁盘之前会进行校验和计算。

但我想补充一点:

1 TiB / 40 分钟 ≈ 437 MiB/秒1 .

事实上,这已经相当快了。记住,除非你有一个很多RAM,这必须从存储中返回。因此,首先要检查的是iostat -kx 10运行校验和时要观察;特别是要注意列%util。如果您正在固定磁盘(接近 100%),那么答案是购买更快的存储。

否则,正如其他发帖者提到的,您可以尝试不同的校验和算法。MD4、MD5 和 SHA-1 都被设计为加密哈希(尽管它们都不再用于此目的;它们都被认为太弱了)。速度方面,您可以将它们与进行比较openssl speed md4 md5 sha1 sha256。我加入了 SHA256,以便至少有一个足够强大的哈希。

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md4              61716.74k   195224.79k   455472.73k   695089.49k   820035.58k
md5              46317.99k   140508.39k   320853.42k   473215.66k   539563.35k
sha1             43397.21k   126598.91k   283775.15k   392279.04k   473153.54k
sha256           33677.99k    75638.81k   128904.87k   155874.91k   167774.89k

从上图中可以看出,MD4 是最快的,而 SHA256 是最慢的。这个结果至少在类似 PC 的硬件上是典型的。

如果你想要更高的性能(代价是琐碎的由于篡改的可能性较低,也不太可能检测到损坏,因此您需要查看 CRC 或 Adler 哈希。在这两种方法中,Adler 通常更快,但更弱。不幸的是,我不知道任何真正快速的命令行实现;我的系统上的程序都比 OpenSSL 的 md4 慢。

因此,从速度上来说,最好的选择是openssl md4 -r-r使其看起来像 md5sum 输出)。

如果你愿意做一些编译和/或最少的编程,请参阅Mark Adler 在 Stack Overflow 上的代码并且xxhash如果您拥有 SSE 4.2,那么您将无法超越硬件 CRC 指令的速度。


1 1 TiB = 1024⁴ 字节;1 MiB = 1024² 字节。以 1000 的幂为单位,约为 417MB/秒。

答案3

openssl命令支持多种消息摘要。在我尝试过的那些中,md4运行时间似乎约为 的 65% md5,运行时间约为 的 54% sha1(对于我测试的一个文件而言)。

md2文档中还有一个,但它似乎给出了与相同的结果md5

粗略地说,速度似乎与质量成反比,但由于您(可能)不担心对手造成故意碰撞,所以这应该不是什么大问题。

您可能会寻找更旧、更简单的消息摘要(md1例如,是否有)?

一个小问题:你有一个无用使用cat。 而不是:

cat foo.box | nc <archive IP> 1234

您可以使用:

nc <archive IP> 1234 < foo.box

甚至:

< foo.box nc <archive IP> 1234

这样做可以节省一个流程,但可能不会对性能产生任何显著的影响。

答案4

科学在进步。看来新的 BLAKE2 哈希函数比 MD5 更快(而且加密能力更强)。

参考:https://leastauthority.com/blog/BLAKE2-harder-better-faster-stronger-than-MD5.html

来自 Zooko 的幻灯片:

Intel Core i5-3210M (Ivy Bridge)
函数每字节周期数
长消息 4096 B 64 B MD5 5.0 5.2 13.1 SHA1 4.7 4.8 13.7 SHA256 12.8 13.0 30.0 凯卡克 8.2 8.5 26.0 布莱克1 5.8 6.0 14.9 布莱克2 3.5 3.5 9.3

相关内容