複製檔案時的 md5 或 sha1

複製檔案時的 md5 或 sha1

在任何 Linux 發行版中,是否有一種方法可以在檔案從本機分割區傳輸到 NFS 分割區時執行 md5sum 或 sha1 檢查?

例子:

我的本機磁碟機上有一個 NFS 安裝磁碟機和一個非常大的檔案。我想將該檔案傳輸到 NFS 安裝的驅動器,同時進行 md5 檢查。我發現很多腳本在將文件複製到遠端驅動器上後會執行 md5,但由於它是一個非常大的文件 100GB+,我想知道是否有一種方法可以利用該文件已經被複製的事實傳輸時呈紅色。

答案1

我不知道有哪個標準 Linux 實用程式可以做到這一點。如果檔案適合基於記憶體的緩存,那麼首先執行 md5sum 然後複製(複製將從記憶體中獲取資料)的效率不會那麼低。

您可以使用以下組合:

cat filename | tee remote_output_name | md5sum

您可以修改它以直接根據md5sum儲存的 md5 檢查列印的總和。這僅從光碟讀取文件一次。

假設你已經生成了check.md5一個

cd dir_with_big_files
md5sum * > check.md5

,以下 Python 程式將複製和檢查單一文件,一次讀取/寫入 64Mb。將其儲存為 /usr/local/bin/chkcopy,chmod +x /usr/local/chkcopy並使用chkcopy file_name check.md5 destination_filename_or_dir

#! /usr/bin/env python

import sys, os, hashlib

m = hashlib.md5()
file_name = sys.argv[1]
md5_name = sys.argv[2]
out_name = sys.argv[3]
if os.path.isdir(out_name):
    out_name = os.path.join(out_name, file_name)
BUF_SIZE = 64 * (1024 ** 2)

with open(file_name, 'rb') as ifp:
    with open(out_name, 'wb') as ofp:
        buf = ifp.read(BUF_SIZE)
        while buf:
            m.update(buf)
            ofp.write(buf)
            buf = ifp.read(BUF_SIZE)
with open(md5_name) as fp:
    for line in fp:
        md5, fn = line.rstrip().split('  ', 1)
        if fn == file_name:
            assert m.hexdigest() == md5
            break
    else:
        print('no md5 found for ' + file_name)

答案2

dd存在一個具有擴展功能的眾所周知的分支,稱為dcfldd我已經使用了很多年了,或者是一個dd名為的修補版本dc3dd具有有些相似的功能。

這兩種工具都可以在複製過程中執行雜湊(如果需要,甚至可以同時使用多個雜湊類型)。可以對區塊和/或整個資料流計算雜湊值。

一些發行版(例如 debian)直接在其儲存庫中提供軟體包,fedora 的軟體包可透過外部取得憑證儲存庫例如。

要複製 8MiB 區塊中的檔案並計算整個資料的 MD5sum,並將其列印到 STDERR:

dcfldd if=/path/to/input bs=8M hash=md5 of=/path/to/outputfile

要複製 8MiB 區塊中的文件,計算整個資料的 SHA256 雜湊加上每個 64MiB 區塊上的 SHA256sum:

dcfldd if=/path/to/input bs=8M hash=SHA256 hashwindow=64M of=/path/to/outputfile

也可以透過參數指定檔來提供計算出的雜湊值的輸出檔hashlog。當計算多個哈希值時,可以透過例如指定單獨的輸出md5log=FILE1.log sha256log=FILE2.log

答案3

您可以使用外部程式(crcsum),它擴展cpmv帶有校驗和:

https://sourceforge.net/projects/crcsum/

相關內容