web-dev-qa-db-ja.com

ファイルのコピー中のmd5またはsha1

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

例:

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

2
Oktav

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

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

cat filename | tee remote_output_name | md5sum

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

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)
5
Anthon

crcsumcpをチェックサムで拡張する外部プログラム(mv)を使用できます。

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

1
Hans

dd と呼ばれる拡張機能を備えた有名なdcflddのフォークがあります。これは、私が何年も使用しているか、パッチを当てたdd-です。と呼ばれるバージョン dc3dd 機能は多少似ています。

どちらのツールも、コピー中にハッシュを実行できます(必要に応じて複数のハッシュタイプを同時に使用する場合でも)。ハッシュは、チャンクおよび/またはデータ全体(Steam)で計算できます。

debianなどの一部のディストリビューションはリポジトリでパッケージを直接提供します。Fedoraのパッケージは外部から入手できます cert-repositories たとえば。

8MiBチャンクでファイルをコピーし、STDERRに出力されるデータ全体のMD5sumを計算するには:

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

データ全体のSHA256ハッシュと各64MiBブロックのSHA256sumを計算する8MiBチャンクのファイルをコピーするには:

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

計算されたハッシュの出力ファイルは、hashlogパラメーターを使用してファイルを指定することによっても提供できます。複数のハッシュを計算する場合、個別の出力を指定できます。 md5log=FILE1.log sha256log=FILE2.log

0
antiplex