ファイルがローカルパーティションからNFSパーティションに転送されている間に、Linuxディストリビューションでmd5sumまたはsha1チェックを実行する方法はありますか?
例:
NFSマウントされたドライブと、ローカルドライブに非常に大きなファイルがあります。そのファイルをNFSマウントされたドライブに転送すると同時に、md5チェックを実行したいと思います。ファイルがリモートドライブにコピーされた後にmd5を実行するスクリプトをたくさん見つけましたが、100GB以上の非常に大きなファイルなので、ファイルがすでに存在しているという事実を利用する方法があるかどうか知りたいです。転送中は赤。
私はこれを行うことができる標準の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)
crcsum
とcp
をチェックサムで拡張する外部プログラム(mv
)を使用できます。
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
。