すべてのLinuxディストリビューションで、ファイルがローカルパーティションからNFSパーティションに転送されたときにmd5sumまたはsha1チェックを実行する方法はありますか?
例:
NFSマウントドライブがあり、ローカルドライブに非常に大きなファイルがあります。 md5スキャン中にファイルをNFSマウントドライブに転送したいと思います。ファイルをリモートドライブにコピーした後、md5を行うスクリプトをたくさん探してみましたが、100GBを超える非常に大きなファイルなので、ファイルがすでにコピーされているという点を活用する方法がないかと思います。転送時に赤にコピーされます。
答え1
私はこれを行うことができる標準のLinuxユーティリティを知りません。ファイルがメモリベースのキャッシュに収まる場合は、まずmd5sumを実行してからコピー(コピーするとメモリからデータを取得)することはそれほど効率的ではありません。
次の組み合わせを使用できます。
cat filename | tee remote_output_name | md5sum
保存された md5 に直接md5sum
印刷された合計を確認するように変更できます。これはディスクからファイルを一度だけ読み取ります。
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
)を使用できます。cp
mv