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

tbe*_*nz9 31 linux netcat md5 transfer

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

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

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

archive$ nc -l -p 1234 > foo.box
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

  • 我的传输很少被中断,所以重启能力不是问题。
  • 通过NC转账一般需要3-4小时,然后40分钟才能拿到md5sum。
  • 在这种情况下,散列的安全性不是问题。

ner*_*ler 19

您可以使用tee 用类似这样的东西动态计算总和(根据您的需要调整 netcat 命令):

服务器:

netcat -l -w 2 1111 | tee >( md5sum > /dev/stderr )
Run Code Online (Sandbox Code Playgroud)

客户:

tee >( md5sum > /dev/stderr ) | netcat 127.0.0.1 1111
Run Code Online (Sandbox Code Playgroud)


der*_*ert 11

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

但我想补充一点:

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
Run Code Online (Sandbox Code Playgroud)

在上面,你可以看到 MD4 是最快的,SHA256 是最慢的。这个结果至少在类似 PC 的硬件上是典型的。

如果您想要更高的性能(以微不足道的篡改为代价,也不太可能检测到损坏),您需要查看 CRC 或 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/秒。


Kei*_*son 9

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

md2文档中也有一个,但它似乎给出了与md5.

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

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

一个小问题:你有一个Useless Use ofcat . 而不是:

cat foo.box | nc <archive IP> 1234
Run Code Online (Sandbox Code Playgroud)

您可以使用:

nc <archive IP> 1234 < foo.box
Run Code Online (Sandbox Code Playgroud)

甚至:

< foo.box nc <archive IP> 1234
Run Code Online (Sandbox Code Playgroud)

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


spu*_*der 5

两种选择:

sha1sum

sha1sum foo.box
Run Code Online (Sandbox Code Playgroud)

在某些情况下sha1sum 更快


rsync

传输需要更长的时间,但 rsync 会验证文件是否完好无损。

从 rsync 手册页

请注意,rsync 始终通过检查文件传输时生成的整个文件校验和来验证每个传输的文件是否在接收端正确重建...