ファイルをコピーする際の md5 または sha1

ファイルをコピーする際の md5 または sha1

ファイルがローカル パーティションから NFS パーティションに転送されている間に、Linux ディストリビューションで md5sum または sha1 チェックを実行する方法はありますか?

例:

NFS マウントされたドライブがあり、ローカル ドライブに非常に大きなファイルがあります。そのファイルを NFS マウントされたドライブに転送し、同時に md5 チェックを実行したいと思います。ファイルがリモート ドライブにコピーされた後に md5 を実行するスクリプトは多数見つかりましたが、100 GB を超える非常に大きなファイルであるため、転送中にファイルがすでに赤色になっているという事実を利用する方法があるかどうか知りたいです。

答え1

これを実行できる標準的な Linux ユーティリティは知りません。ファイルがメモリベースのキャッシュに収まる場合は、最初に md5sum を実行してからコピーする (コピーではメモリからデータを取得する) のがそれほど非効率的ではありません。

次の組み合わせを使用できます。

cat filename | tee remote_output_name | md5sum

これを修正すると、保存されている md5 に対して、印刷された合計を直接チェックできるようになりますmd5sum。これにより、ディスクからファイルが 1 回だけ読み取られます。

check.md5を生成したと仮定します

cd dir_with_big_files
md5sum * > check.md5

次のPythonプログラムは、1つのファイルのコピーとチェックを行い、一度に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 のチャンクにコピーし、STDERR に出力されるデータ全体の MD5sum を計算するには:

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

データ全体の SHA256 ハッシュと各 64MiB ブロックの SHA256 合計を計算して、ファイルを 8MiB チャンクでコピーするには、次のようにします。

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/

関連情報