ファイルのコピーが reflink/CoW であることを確認するにはどうすればよいですか?

ファイルのコピーが reflink/CoW であることを確認するにはどうすればよいですか?

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

前回の回答に続き、私はちょうどリリースしましたfienodeこれはファイルの物理的範囲のSHA1ハッシュを計算し、いくつかの(同一の)reflinkコピーを見つけるために使用できます。ただし、注意点があります(ドキュメント)。BTRFS は、私が作成した再リンク コピーの物理範囲の一部 (すべてではありません) を、挑発や警告なしに変更することを決定し、値が変更されました。

答え3

これに対する最も簡単な解決策は、btrfs filesystem du . Exclusive を使用することです。CoW の場合は 0.00B になります。

ここで見つかりました:https://unix.stackexchange.com/a/655813/525352

答え4

これは受け入れられた答えにはあまり追加されませんが、誰かがここで問題といくつかの方法を要約しています -https://www.ctrl.blog/entry/distinguish-file-link-clone.html

問題点:

  • シンボリックリンクとハードリンクをrefリンクと区別する
  • 部分的なクローン(一部のデータを共有するが、すべてのデータを共有しないファイル)を識別する

解決策:

  • ファイルフラグを使用する
  • statクローンは同じファイルシステム上に存在する必要があるため、デバイスを識別するために使用します。

引用:

ハードリンクは宛先と同じ inode 番号を共有しますが、クローンには独自の inode があります。この違い (およびコピーオンライト ファイル システム) により、クローンは、クローンを認識しないプログラムによって変更された場合でも、オリジナルとは独立して動作できます。"

  • コマンド filefrag -v file1 file2 (e2fsprogs の一部) を実行します。共有フラグが設定されているエクステント行内のファイルの physical_offset 範囲を比較します。

2 つのファイルは、同一または重複する範囲を共有している場合、ストレージ ドライブ上で重複排除/複製されたデータを共有します。

どれがオリジナルでどれがクローンなのかを判断することは、タイムマシンがなければほぼ不可能です。

関連情報