私は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 ハッシュを計算し、複数の (同じ) 参照リンクのコピーを見つけるために使用できます。ただし、いくつかの注意事項があります(参照)。文書)。 BTRFSは、私が挑発や警告なしに作成したリッピングコピーの物理的範囲の一部(すべてではない)を変更することにしました。
答え3
最も簡単な解決策は、btrfs filesystem du .
CoWの場合は0.00BのExclusiveを使用することです。
答え4
これは許可された答えに多くを追加しませんが、誰かがここで問題といくつかのアプローチを要約しました。https://www.ctrl.blog/entry/distinguish-file-link-clone.html
質問:
- シンボリックリンク、ハードリンク、参照リンクの区別
- 部分複製の識別(一部ではなく一部のデータを共有するファイル)
解決策:
- ファイル断片化の使用
stat
レプリカは同じファイルシステムに常駐する必要があるため、デバイスを識別するために使用されます。
引用:
ハードリンクはターゲットと同じiノード番号を共有しますが、レプリカには独自のiノードがあります。これらの区別(記録中にコピーファイルシステムと組み合わせる)によって、クローンを認識しないプログラムによって変更された場合でも、クローンは元のバージョンとは無関係に機能する可能性があります。 」
- filefrag -v file1 file2(e2fsprogsの一部)コマンドを実行します。エクステント行内のファイルの Physical_offset 範囲を共有フラグセットと比較します。
これら2つのファイルが同じまたは重複する範囲を共有している場合は、ストレージドライブの重複排除/複製データを共有します。
どれがオリジナルで、どちらがレプリカなのか判断する上で…。タイムマシンがなければ、これを決定することはほとんど不可能です。