web-dev-qa-db-ja.com

チェックサムを含むtarファイルを作成する

これが私の問題です。大きなファイル(通常はそれぞれ30〜40 GB)の大量(最大60 TB)のtarファイルにアーカイブする必要があります。アーカイブする前に、これらのファイルのチェックサム(md5、sha1など)を作成します。ただし、notすべてのファイルを2回(チェックサムに1回、tarに2回)読み取ることは、非常に高いアーカイブパフォーマンス(LTO)を達成するためにある程度必要です。 -4は120 MB /秒を維持する必要があり、バックアップウィンドウは制限されています)。

したがって、ファイルを読み取り、一方の側でチェックサムツールをフィードし、もう一方の側でテープにtarを構築する方法が必要です。

tar cf - files | tee tarfile.tar | md5sum -

アーカイブ全体のチェックサム(このサンプルのシェルコードはこれを行うだけです)は必要ありませんが、アーカイブ内の個々のファイルごとのチェックサムは必要ありません。

私はGNU tar、Pax、Starオプションを研究しました。 Archive :: Tar からのソースを調べました。これを達成する明白な方法はわかりません。 PerlやPythonなどでは、パフォーマンスを向上させることができず、さまざまなtarプログラムが必要な「プラグインアーキテクチャ」を見逃してしまいます。コードチャーンを始める前に、これに対する既存の解​​決策を誰かが知っていますか?

16
wazoox

先に進んでtarを書き換える前に、1回のパスで行うよりも遅くない可能性があるため、データを2回読み取る簡単な方法をプロファイルすることをお勧めします。

2パスメソッドはここで提供されます。

http://www.g-loaded.eu/2007/12/01/veritar-verify-checksums-of-files-within-a-tar-archive/

ワンライナー付き:

  tar -cvpf mybackup.tar myfiles/| xargs -I '{}' sh -c "test -f '{}' && 
  md5sum '{}'" | tee mybackup.md5

Md5sumがパイプを介してデータをストリームから取得する代わりに、tarと並行してディスクから各ファイルを読み取っているのは事実ですが、Linuxのディスクキャッシュにより、この2番目の読み取りはメモリバッファーからの単純な読み取りになります。 stdin読み取り。ディスクキャッシュに十分なスペースがあることを確認するだけで、2番目のリーダーが常にキャッシュから読み取り、ディスクから取得するのに十分なほど離れていない各ファイルを保存できます。

15
bk.

Pythonスクリプトの例です。スクリプトは、アーカイブに追加されるファイルのチェックサムを計算します。スクリプトの最後に、チェックサムファイルがアーカイブに追加されます。

import hashlib,os
import tarfile
def md5(filename):
    ''' function to get md5 of file '''
    d = hashlib.md5()
    try:
        d.update(open(filename).read())
    except Exception,e:
        print e
    else:
        return d.hexdigest()

root="/home"
outtar=os.path.join(root,"path1","output.tar")
path = os.path.join(root,"path1")
chksum_file=os.path.join(root,"path","chksum.txt")
tar = tarfile.open(outtar, "w")
o_chksum=open(chksum_file,"w")
for r,d,f in os.walk(path):
    for files in f:
        filename=os.path.join(r,files)
        digest="%s:%s"%(md5(filename) , filename)
        o_chksum.write(digest+"\n")
        tar.add(os.path.join(r,files))

tar.add(chksum_file)
tar.close()
o_chksum.close()

解凍したら、chksum_fileを使用してチェックサムを確認します

4
user37841

Tarはコンテンツテーブルを介したアーカイブファイル内のランダムアクセス/配置を許可していないため、すべてのプロトコルはファイルベースであり、バッファベースではないため、問題はtarの設計上の問題であると思います。
したがって、ランダムアクセスを許可するPAXやDARなどのさまざまな形式を見ることができます。

1
weismat

最近のアーカイブ形式には通常、ファイル検証用のハッシュが含まれていますが、同様の問題があります。独自のハッシュ関数を常に選択したり、ハッシュのローカルコピーを保持したりできない場合があります。

アーカイブ自体に埋め込まれているものとは別の、ハッシュのローカルコピーを保存することをお勧めします。たとえば、アーカイブがオフラインで(テープまたはデータセンターに読み込むのが高価な状態で)保存されており、ファイル/ディレクトリのローカルコピー。

7Zip には 7z hカスタムハッシュ付き および 7z l -slt すべてのハッシュを一覧表示しますが、md5またはsha1ハッシュの一覧が必要な場合はどうしますか? -bbおよび-bs 冗長性を制御し、受け入れられた回答で言及されているGeorge Notarasメソッドを再利用します。

7z a -bsp1 -bb3 dir.7z dir 2>&1 \
| grep "^+" | sed 's,^+ ,,g' | xargs -d "\n" -I § -P 1 sh -c "test -f '§' && sha1sum '§'" \
| tee dir.sha1
0
Nemo