web-dev-qa-db-ja.com

Btrfsファイルシステムで特定のファイルのデータコピーを見つける方法は?

Btrfsファイルシステムをbedupで重複排除したので、重複するすべてのファイル(特定のサイズを超える)は「reflink」コピーになります。

ファイル名を指定して、他のどのファイルが同じreflinkであるかを確認する方法はありますか?

7
Peter Smit

Btrfsのようなコピーオンライト(CoW)ファイルシステムを使用することの全体的なポイントは、ファイルの複数のバージョンのコンテンツを効率的に共有できることです。そのため、ファイルはコンテンツを含む範囲のコレクションとして表示される場合があり、コンテンツは他のファイルと共有される場合と共有されない場合があります。または、ファイルの他のバージョンによって。実装は、拡張のツリーに似ており、拡張を共有できます。

重複排除を行うために、ファイルへの変更の書き込み中に機能する(したがって、そのファイルの新しいバージョンを生成する)同じメカニズムが使用されています。実装については https://github.com/g2p/bedup :で説明されています。

重複排除は、あるファイルから別のファイルにデータを複製できるBtrfs機能を使用して実装されます。複製された範囲はディスク上で共有され、スペースを節約します。

カーネルでの実装は(たとえば) http://lxr.free-electrons.com/source/fs/btrfs/ioctl.c#L284 ;コメントは、ファイルの「再リンク」ではなく、範囲に関するものであることを明確にしています。

2843 /**
2844  * btrfs_clone() - clone a range from inode file to another
2845  *
2846  * @src: Inode to clone from
2847  * @inode: Inode to clone to
2848  * @off: Offset within source to start clone from
2849  * @olen: Original length, passed by user, of range to clone
2850  * @olen_aligned: Block-aligned value of olen, extent_same uses
2851  *               identical values here
2852  * @destoff: Offset within @inode to start clone
2853  */

したがって、参照されるのはファイルではなく、共有される範囲です。複数のファイルと範囲を共有することにより、新しいファイルを作成することもできます。または、ボリューム間で共有されます。または(これが現在サポートされているかどうかはわかりません)同じファイルに同じ範囲が複数回ある場合でも;)

したがって、これは派生概念であるため、ファイル全体を共有するファイルを見つけるための高レベルのツールは存在しません。もちろん、それに対するサポートを書くことは可能ですが、私が知る限りではそうではありません...

3

ファイルの物理エクステントのSHA1ハッシュを計算する fienode (←リンク)というプログラムをリリースしました。同一のCoWコピーには同じハッシュがあります。

原則として、これをファイルシステム上のすべてのファイルで実行してから、同一のハッシュを探すことができます。

これが必要な理由を説明する、より詳細な回答もここにあります。

ただし、BTRFSは物理的な範囲を自由に変更できることに注意してください。大きなreflinkedファイルが挑発せずに物理エクステントを変更し、物理エクステントの大部分がまだ共有されていても、fienode出力が異なることを確認しました。

0
pwaller