有没有在文件复制过程中同时生成 MD5 的软件?

2020-01-15 19:30:11 +08:00
 autoxbc
一块冷备盘中有 500G 的镜像文件,需要复制到另一块冷备盘中,两个盘的传输速度都是 100MB/s

单次复制需要时间:500*1024/100/60 = 85 分钟
生成 MD5 校验:85 分钟
复制然后生成 MD5:85*2 = 170 分钟

如果复制的同时生成 MD5,可以节省大量时间,有没有这类软件
最好是 Windows 下的,这样对 NTFS 读写安全一点
2592 次点击
所在节点    问与答
16 条回复
xupefei
2020-01-15 19:34:32 +08:00
真能省时间吗。
复制文件需要写入 500G。MD5 需要读取硬盘 500GB。
在复制文件的时候 HDD 占用是 100%,这时进行读取必定牺牲写入速度。换句话说,复制文件时间会变长。
具体会变多长呢?当然是 170 分钟。
winterbells
2020-01-15 19:36:30 +08:00
@xupefei 他是想说在内存里算 md5 吧,省一次读取
xupefei
2020-01-15 19:38:38 +08:00
@winterbells 但是在内存里 md5 只能保证读取没错,不能保证写入没错……
单单保证读取没错又没啥意义,毕竟读取时底层已经校验过了。
autoxbc
2020-01-15 20:05:09 +08:00
@xupefei 不用检验写入,主要需要生成 MD5

说个题外话,写入检验的软件如何保证穿透缓存的?
Sylv
2020-01-15 20:08:17 +08:00
现成软件估计是没有,需求太小众了,自己写个 Python 脚本啥的不是太难。
xupefei
2020-01-15 20:19:30 +08:00
@autoxbc dcfldd 可以,但是只有 linux 版。
穿透缓存可以用系统提供的 API, 例如 Win32 的 CreateFile 有个 FILE_FLAG_NO_BUFFERING 选项可以关闭系统缓存。
eason1874
2020-01-15 20:21:23 +08:00
MD5 是分块计算的,一边复制一边计算是可能的,但我搜了一圈没搜到现成软件,不知道是不是搜索词不对。

刚看到一个叫 TeraCopy 的软件,有 Windows 版,支持 10 种哈希算法校验,看几个讨论都说 xxHash 比 md5 快,你可以试试。
autoxbc
2020-01-15 20:23:12 +08:00
@Sylv 想过用 node 写,不过一旦有隐性 bug 就是灾难性的。希望是成熟一点的方案,至少被很多人用过的
lostpg
2020-01-15 20:28:48 +08:00
有个软件能够在复制以后自动帮你做一遍校验,很方便,但是我现在在卫生间,等我出来了就报上软件名
lostpg
2020-01-15 20:31:54 +08:00
@eason1874 对对我说的也是 teracopy。
SoloCompany
2020-01-15 20:56:06 +08:00
cat file1 | tee file2 | md5sum > file2.md5 ?
ipwx
2020-01-15 20:58:17 +08:00
一开始看 1L 的评论觉得他在无理取闹,按照楼主的字面需求,只要生成 MD5 就行了,根本没有 1L 说的问题。

细细一品,卧槽,我怎么觉得楼主的需求很奇葩。。。 不把文件完整地存进第二张盘,然后清空缓存,再读出来,然后再算 MD5,就根本起不到校验拷贝操作的正确性吧。。
eason1874
2020-01-15 21:23:07 +08:00
@ipwx #12 楼主这个需求确实很可能是不合理的。

我刚才搜索相关软件的时候看了下那些专门做复制功能的商业软件,他们哈希校验都是 after copy,免费版付费版都没有边复制边校验,说明这个做法很可能有致命缺陷,只是我们不熟悉不知道。
ipwx
2020-01-15 22:51:28 +08:00
@eason1874 因为边复制边校验,要么总时间更长(写入一块到目标盘、清空缓存、从目标盘读出一块;这肯定比不上先全部写入,清空缓存,然后全部读出计算 MD5 来得快),要么根本只能校验源盘而不能校验目标盘。
msg7086
2020-01-16 02:32:02 +08:00
@xupefei @eason1874 @ipwx
楼主的需求是复制时生成 MD5 而不是复制后校验写入完整。
换句话说楼主对文件写入是否完整并没有需求,或者说校验写入完整和生成 MD5 本来就是分开的两个需求。

生成 MD5 的目的是等几个月、几年以后,磁盘老化了产生 Bitflips 的时候,去检验备份是否完整。
而你们提的校验写入完整,目的是检查当前的磁盘写入是否正确。

假设楼主的冷备盘是新品品质,电脑也有 ECC,那么磁盘写入是否正确其实是不需要检查的。

楼主的要求,换句话说,其实是生成一个 MD5 文件,然后把源文件和 MD5 文件一起复制到新硬盘里。

==========

至于复制时计算 MD5,其实只要空余内存大点,复制的时候源数据都会缓存的,直接在旁边跑一个有暂停功能的校验软件就行了。让校验软件的速度和复制进度一样,两个软件会共享读取的数据的。

如果不想手动操作,那就还是老老实实自己写代码实现功能吧。
0TSH60F7J2rVkg8t
2020-01-16 08:22:27 +08:00
自己写代码分分钟的问题,都是现成的库

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/638236

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX