cp --reflink
私はコピーオンライトが可能な btrfs を使っています。 などの他のプログラムlxc-clone
もこの機能を使用する場合があります。質問は、ファイルが別のファイルの CoW であるかどうかをどのように判断するかということです。ハードリンクの場合と同様に、inode 番号から判断できます。
答え1
いい質問ですね。今のところ、簡単に高レベルで判断する方法はないようです。
1つの問題は、コピーオンライトによってファイルがデータの一部しか共有できないことです。これは物理エクステントと呼ばれ、いくつかの または 全て物理エクステントは CoW ファイル間で共有される場合があります。
。 (編集:私の他の答え)。inode
ファイルを比較したときに、ファイルが同じ物理範囲を共有していることを示す類似のものはありません
低レベルの答えは、カーネルにどの物理エクステントがファイルに使用されているかを尋ねることです。FS_IOC_FIEMAP
ioctl
、これは文書化されているDocumentation/filesystems/fiemap.txt
原則として、すべての物理エクステントが同じである場合、ファイルは同じ基礎ストレージを共有している必要があります。
この情報をより高レベルで見る方法を実装しているものはほとんどありません。コードはここどうやら、filefrag
ユーティリティは-vで範囲を表示するはずです。さらに、btrfs-debug-tree
この情報を表示します。
ただし、これらのデータはこの目的で実際に使用されることはほとんどないため、間違った答えを出すバグが見つかる可能性があり、データ破損を引き起こす可能性のある操作を決定するためにこのデータに依存することには注意してください。
関連する質問:
答え2
答え3
これに対する最も簡単な解決策は、btrfs filesystem du .
Exclusive を使用することです。CoW の場合は 0.00B になります。
答え4
これは受け入れられた答えにはあまり追加されませんが、誰かがここで問題といくつかの方法を要約しています -https://www.ctrl.blog/entry/distinguish-file-link-clone.html
問題点:
- シンボリックリンクとハードリンクをrefリンクと区別する
- 部分的なクローン(一部のデータを共有するが、すべてのデータを共有しないファイル)を識別する
解決策:
- ファイルフラグを使用する
stat
クローンは同じファイルシステム上に存在する必要があるため、デバイスを識別するために使用します。
引用:
ハードリンクは宛先と同じ inode 番号を共有しますが、クローンには独自の inode があります。この違い (およびコピーオンライト ファイル システム) により、クローンは、クローンを認識しないプログラムによって変更された場合でも、オリジナルとは独立して動作できます。"
- コマンド filefrag -v file1 file2 (e2fsprogs の一部) を実行します。共有フラグが設定されているエクステント行内のファイルの physical_offset 範囲を比較します。
2 つのファイルは、同一または重複する範囲を共有している場合、ストレージ ドライブ上で重複排除/複製されたデータを共有します。
どれがオリジナルでどれがクローンなのかを判断することは、タイムマシンがなければほぼ不可能です。