重複排除としてbtrfs CoWを使用する重複排除スクリプトはありますか?


9

Linuxでの重複排除ツールを探すにはたくさんあります。たとえば、このwikiページを参照してください

ほとんどすべてのスクリプトは、検出、重複ファイル名の印刷、または1つのコピーへのハードリンクによる重複ファイルの削除のいずれかを実行します。

btrfsの台頭により、別のオプションがありますcp reflink=always。ファイル(のような)のCoW(コピーオンライト)コピーを作成することです。これを行うツールを見つけていませんが、これを行うツールを知っている人はいますか?


更新:rmlintの開発ブランチ、および私もマスターだと思いますが、以下を追加しました:1)インクリメンタルファイルハッシュ。前回の実行以降に変更されない限り、ファイルは再ハッシュされません(これは巨大です)。2)増分重複排除。重複していないファイル、または変更されたファイルのみを重複除外します。[それはさらに巨大です。]他のすべてのクイック比較メソッドが失敗した後、ハッシュファイルのみと組み合わせると、無敵になります。ベッドアップは放棄され、どうしてもコンパイルされません。私は詳細な比較をしました:docs.google.com/spreadsheets/d/...
ジム・

回答:


17

私はこの目的のためにベッドアップを書きました。増分btreeスキャンとCoW重複排除を組み合わせています。実行できるLinux 3.6で最適に使用されます。

sudo bedup dedup

こんにちは@Gabriel氏、以下の私の回答へのコメントには、「... bedup ...サイズのバケットにデータを入れ、ファイル全体を読み取るだけで、必要に応じてチェックサムを作成する」とあります。本当?もしそうなら、私は以下の私の答えを更新したいと思います。(そして、自分でベッドを使用してください!)残念ながら、私はこれをどこでも確認できませんでした。私はGoogleを試し、githubページで検索し、コードで検索しました。ありがとう。
ジム

4

おやすみなさい。良い(そして、多くの人にとって最適な選択になるいくつかの有用な差別化された機能がある)一方で、すべてのターゲットファイル全体をチェックサムについてスキャンするようです。

それはひどく遅いです。

一方、rdfindやrmlintなどの他のプログラムは、異なる方法でスキャンします。

rdfindには、btrfs reflinkを使用するための「実験的」機能があります。(そして、ハードリンク、シンボリックリンクなどの「固体」オプション)

rmlintには、btrfs clone、reflink、通常のハードリンク、symlinks、delete、および独自のカスタムコマンド用の「固体」オプションがあります。

しかし、より重要なのは、rdfindとrmlintが大幅に高速化されていることです。のように、桁違い。チェックサムについてすべてのターゲットファイルをスキャンするのではなく、およそ次のように実行します。

  • ターゲットファイルシステム全体をスキャンし、パスとファイルサイズだけを収集します。
  • 固有のファイルサイズを持つファイルを検討対象から外します。これだけでも、時間とディスクアクティビティを大幅に節約できます。(「Scads」は、いくつかの逆指数関数か何かです。)
  • 残りの候補のうち、最初のNバイトをスキャンします。ファイルサイズは同じであるが最初のNバイトが異なるものは考慮から外します。
  • 最後のNバイトについても同じことを行います。
  • 残り(通常はごくわずか)のみ、チェックサムをスキャンします。

私が知っているrmlintの他の利点:

  • チェックサムを指定できます。md5怖すぎる?sha256を試してください。または512。またはビットごとの比較。または、独自のハッシュ関数。
  • reflinkだけでなく、Btrfsの「クローン」と「reflink」のオプションが提供されます。"cp --reflink = always"は、アトミックではなく、カーネル内のそのファイルに対して他に何が起こっているかを認識しておらず、常にメタデータを保持するわけではないという点で、少し危険です。「クローン」、つまりOTOH(略称...私は公式のAPI関連の名前を空白にしています)は、アトミックでメタデータを保持するカーネルレベルの呼び出しです。ほとんど常に同じ結果になりますが、少し堅牢で安全です。(ほとんどのプログラムは、最初に他のファイルへの一時参照リンクを正常に作成できない場合、重複ファイルを削除しないように十分スマートですが)。
  • 多くのユースケースに対応するオプションがたくさんあります(これも欠点です)。

私はrmlintとdeduperemoveを比較しました-これは、すべてのターゲットファイルを盲目的にスキャンしてチェックサムを探します。Duperemoveは私のボリュームが完了するまでに数日かかりました(4だと思います)。fmlintは重複を特定するのに数時間かかり、Btrfsクローンで重複を排除するのに1日もかかりませんでした。

(とはいえ、高品質で堅牢なソフトウェアを作成してサポートし、無料で提供するために努力している人は誰でも、主要な賞賛に値します!)

ところで、通常のハードリンクを「一般的な」重複排除ソリューションとして使用することによる重複排除は、いかなる犠牲を払っても避けなければなりません。

特定の対象を絞ったユースケース(たとえば、個々のファイルや、最小サイズを超える特定のファイルタイプをスキャンできるツール、または無料の商用バックアップ/スナップショットソリューションの一部)では、ハードリンクが非常に便利ですが、悲惨な場合があります。大規模な汎用ファイルシステムでの「重複排除」用。その理由は、ほとんどのユーザーがファイルシステムに何千ものファイルを持っている可能性があるためです。これらはバイナリは同じですが、機能的に完全に異なります。

たとえば、多くのプログラムは、最初は同じであるテンプレートや隠し設定ファイルを(場合によっては、表示されるすべてのフォルダーに)生成しますが、ほとんどの場合、ユーザーである必要がなくなるまでそのままです。

具体的な例として:写真を含むフォルダーに無数のプログラムが生成する写真のサムネイルキャッシュファイル(および正当な理由-移植性)は、生成に数時間または数日かかることがありますが、その後、写真アプリを簡単に使用できます。これらの初期キャッシュファイルがすべて一緒にハードリンクされている場合は、後でディレクトリでアプリを開いて大きなキャッシュを構築します...それから何を推測しますか?以前にハードリンクされたキャッシュがあるすべてのフォルダーに間違ったキャッシュが含まれるようになりました。潜在的に、偶発的なデータ破壊につながる可能性のある悲惨な結果を伴います。また、ハードリンクに対応していないバックアップソリューションを爆発させる可能性もあります。

さらに、スナップショット全体を台無しにする可能性があります。スナップショットの重要なポイントは、「ライブ」バージョンを変更し続けることができ、以前の状態にロールバックできる機能です。すべてがハードリンクされている場合でも、同じものに「ロールバック」します。

良いニュースですが、Btrfs clone / reflinkでの重複排除は、そのダメージを取り消すことができるということです(スキャン中、ハードリンクされたファイルは同じものとして表示されるはずです...ハードリンクを考慮しないロジックがない場合)。重複除外を実行する特定のユーティリティ。)


これは正しくありません。bedupも同じことを行い、サイズのバケットに入れてファイル全体を読み取るだけで、必要に応じてチェックサムを作成します。また、ベッドアップはこの結果を保存するため、後続の実行がさらに高速になります。
Peter Smit

@PeterSmit、コメントの最初の部分を確認できる場合は、回答を更新します(自分でベッドアップに戻すことを検討します)。Bedupのgithub readmeにはそれが記載されておらず、「ファイルサイズ」または「ファイルサイズ」を検索しても明確な答えは得られません。どうすれば確認できますか?
ジム、

また、起床は過去3年間中止されたようです。本当に素晴らしいアイデアのように思えるので、これは残念です。よろしくお願いします。
ジム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.