V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
autoxbc
V2EX  ›  问与答

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

  •  
  •   autoxbc · 2020-01-15 19:30:11 +08:00 · 2499 次点击
    这是一个创建于 1556 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一块冷备盘中有 500G 的镜像文件,需要复制到另一块冷备盘中,两个盘的传输速度都是 100MB/s

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

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

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

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

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

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

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

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

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

    ==========

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

    如果不想手动操作,那就还是老老实实自己写代码实现功能吧。
    ahhui
        16
    ahhui  
       2020-01-16 08:22:27 +08:00 via iPhone
    自己写代码分分钟的问题,都是现成的库
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   943 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 19:51 · PVG 03:51 · LAX 12:51 · JFK 15:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.