Btrfs ファイルシステム内の特定のファイルのデータコピーを見つけるにはどうすればよいでしょうか?

Btrfs ファイルシステム内の特定のファイルのデータコピーを見つけるにはどうすればよいでしょうか?

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

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

答え1

btrfs のような Copy-On-Write (CoW) ファイルシステムの最大のポイントは、ファイルの複数のバージョンのコンテンツを効率的に共有できることです。つまり、ファイルはコンテンツを含む範囲のコレクションとみなすことができます。コンテンツは他のファイルと共有される場合もあれば、共有されない場合もあります。または、ファイルの他のバージョンと共有される場合もあります。実装は、extends が共有される可能性がある、extends のツリーに似ています。

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

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

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

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  */

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

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

答え2

私はちょうど、fienode(← リンク) ファイルの物理範囲の SHA1 ハッシュを計算します。同一の CoW コピーは同じハッシュを持ちます。

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

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

ただし、BTRFS は物理範囲を自由に変更できることに注意してください。物理範囲の大部分がまだ共有されているにもかかわらず、大規模な reflink ファイルが何の理由もなく物理範囲を変更し、fienode出力が異なるものになるのを観察しました。

関連情報