ハッシュを使用してディレクトリツリーとマニフェストファイルを比較するdiff -rのようなツールはありますか?


-1

これが私の状況です。同一のデータセットを含む(はずの)コールドストレージアーカイブボリュームが2つあります。これらのボリュームには、アクセス頻度の低いバックアップが含まれています。最終的には、bitrotがそれらの一方または両方に到達し、その中に含まれるデータをわずかに破損することを心配しています。私は私ができる知っているdiff -r2巻と2の間で変更または消滅したファイルを見つけることが、私はボリュームが「良い」のコピーを持っているかについて何の役に立つの表示を得ることはありません。これらはUSBディスクであり、ZFSのようなものに変換するのは面倒です。

私が望むのは、ディレクトリツリーを再帰的にたどり、パスとファイル名を含むマニフェストファイルをファイルの内容のハッシュとともに書き込むツールです。データを各ボリュームに書き込んだ直後にこのツールを実行し、結果のマニフェストファイルをウォームストレージに保存します。おそらく何らかのリビジョン管理下にあります。

このファイルから、まったく同じように動作する何かを実行できるようにしたいと思いdiff -rます。ファイルが追加、削除、または内容が変更されたかどうかを教えてくれます。1つのボリュームを他のボリュームと比較する代わりに、1つのボリュームを既知の正常なマニフェストファイルと比較します。この方法を使用すると、将来ディスクの月/年から読み取っているデータが最初に置いたデータと同一であるかどうかを確認できるはずです。

私はこのような何かがすでに存在すると考えなければならないでしょう。私はマニフェストファイルに近いものを取得できます:

find /mnt/my-volume -type f -exec md5sum {} + > manifest.txt

しかし、これまでのところ、このファイルを解析して各ハッシュを再帰的にチェックする良い方法を思いつきませんでした。また、やや重要性は低いですが、空のディレクトリが表示されたり消えたりしたかどうかはわかりません。(なぜそれが重要なのか考えることはできませんが、それが発生したことを知ってうれしいです。)

私はこれで正しい軌道に乗っていますか、またはこのタイプのことを行うことができるより適切なツールがありますか?

回答:


2

そのようなツールは既に存在します。あなたの投稿には「linux」というタグが付けられているように見えますが、おそらくBSD指向のソリューションが啓発されるでしょう。

FreeBSDのmtree(8)ユーティリティは、まさにあなたが求めていることをすることができます。

仮定:

$ find .
.
./c
./c/file3
./b
./b/file2
./a
./a/file1

すべてのファイルのsha256ハッシュを含む、そのファイル階層のマニフェストを作成するには、次のようにします。

$ mtree -c -K sha256 > /tmp/manifest.txt
$ cat /tmp/manifest.txt
#          user: diego
#       machine: myhost.example.com
#          tree: /data/home/diego/foo
#          date: Wed Mar 28 10:31:17 2018

# .
/set type=file uid=1001 gid=1001 mode=0710 nlink=1 flags=uarch
.               type=dir nlink=5 time=1522257963.738221000

# ./a
/set type=file uid=1001 gid=1001 mode=0600 nlink=1 flags=uarch
a               type=dir mode=0710 nlink=2 time=1522257932.680802000
    file1       size=29 time=1522257932.682389000 \
                sha256digest=6b4114c4f12e63c0ca44073de5ca0a2b39fedaceaa533af3dfdc89f00039c973
# ./a
..


# ./b
b               type=dir mode=0710 nlink=2 time=1522257937.929131000
    file2       size=29 time=1522257937.930666000 \
                sha256digest=9f7a0a49475bb6f98e609a4e057f0bc702c5e4706be5bd656a676fd8d15da7ef
# ./b
..


# ./c
c               type=dir mode=0710 nlink=2 time=1522257942.064315000
    file3       size=29 time=1522257942.065882000 \
                sha256digest=bd617f47217ef0605d3aff036778d10bf18cb2f415c45e8e362e2c091df19491
# ./c
..

次に、マニフェストをmtreeにパイプすることにより、マニフェストに対してファイルの階層を検証できます。

$ mtree < /tmp/manifest.txt || echo fail

ファイルを追加、削除、名前変更、または変更すると、検証が失敗します。

$ touch foo
$ mtree < /tmp/manifest.txt || echo fail
.:      modification time (Wed Mar 28 10:34:56 2018, Wed Mar 28 10:37:01 2018)
extra: foo
fail
$ rm foo; touch b/file2; mtree < /tmp/manifest.txt || echo fail
.:      modification time (Wed Mar 28 10:34:56 2018, Wed Mar 28 10:39:39 2018)
b/file2: 
        modification time (Wed Mar 28 10:25:37 2018, Wed Mar 28 10:39:39 2018)
fail
$ mv c/file3 c/FILE3; rm a/file1; date >> b/file2; mtree < /tmp/manifest.txt || echo fail
.:      modification time (Wed Mar 28 10:34:56 2018, Wed Mar 28 10:39:39 2018)
c:      modification time (Wed Mar 28 10:25:42 2018, Wed Mar 28 10:41:59 2018)
extra: c/FILE3
b/file2:
        size (29, 58)
        modification time (Wed Mar 28 10:25:37 2018, Wed Mar 28 10:47:31 2018)
        sha256digest (0x9f7a0a49475bb6f98e609a4e057f0bc702c5e4706be5bd656a676fd8d15da7ef, 0x569c17bd1a1ca2447fd8167f103531bf3a7b7b4268f0f68b18506e586e7eea94)
a:      modification time (Wed Mar 28 10:25:32 2018, Wed Mar 28 10:41:59 2018)
./a/file1 missing
./c/file3 missing
fail

1

md5sum -c manifest.txtに保存されているパスを称えるでしょうmanifest.txtfindプログラムの代替{}で指定された任意の検索場所を含めたファイルへの完全なパスfindコマンドラインは、すなわちファイルに対して./a/b/c/d/e、それは同じことを代用します./a/b/c/d/eコマンドの find ./a -type f -exec md5sum {} \;

考えられる問題は絶対パスであるため、より適切な「マニフェスト作成コマンド」は次のとおりです。

cd /mnt/my-volume; find  -type f -exec md5sum {} + > manifest.txt

ただし、sedmainfest.txt内のパスは常に修正できます。

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