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


16

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

そのため、ファイルを読み取り、一方の側にチェックサムツールを供給し、もう一方の側にテープにtarを作成する何らかの方法が必要になります。

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

アーカイブ全体のチェックサム(このサンプルシェルコードはこれを行うだけでなく)ではなく、アーカイブ内の個々のファイルのチェックサムが必要な場合を除きます。

GNU tar、Pax、Starオプションを研究しました。Archive :: Tarのソースを見てきました。これを達成する明白な方法はありません。必要なものを実現するために、Cなどで手動でビルドする必要があるようです。Perl / Python /などは単にパフォーマンス面でそれをカットしません、そして、様々なtarプログラムは必要な「プラグインアーキテクチャ」を見逃します。コードチャーニングを開始する前に、これに対する既存のソリューションを知っている人はいますか?


2
tarあなたがそれを書くことに決めた場合、確かに便利な追加のように聞こえます;)

1
ないあなたの質問が、と7zあなたはハッシュを選択していること方法でそれを印刷することができますsha1sumし、sha256sum理解することができます:7zip.bugaco.com/7zip/7zip_15_09/MANUAL/c​​mdline/commands/...(とsami-lehtinen.net/blog/...)それを試してみてください7z h -scrcsha256 mydir/* | sed --regexp-extended 's, +[0-9]+ +, ,g' > mydir.sha256sum ; sha256sum -c mydir.sha256sum(p7zipのバージョン15.09ベータ版でテスト)
ニモ

回答:


14

先に進んで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番目の読み取りをメモリバッファーからの単純な読み取りにする必要があります。標準入力を読み取ります。2番目のリーダーが常にキャッシュから読み取り、ディスクから取得しなければならないほど遅れることがないように、各ファイルを十分に格納するための十分なスペースをディスクキャッシュに確保する必要があります。


2
実際には非常にうまく機能しますが、md5をクランチするCPUの能力によって制限されているようです(1つのコアで最大280MB / s)。
wazoox

4

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を使用します


1
はい、私はこのようなことを考えましたが、通常、この種のライブラリは、操作する前にファイルをRAMにロードします。ファイルは少なくとも20 GBです
。...-wazoox

1

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


1
残念ながら、tarの出力は必須です。ワークフローの基になっているからです。
wazoox

0

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

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

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.