如何驗證文件副本是 reflink/CoW?

如何驗證文件副本是 reflink/CoW?

我正在使用 btrfs,它允許cp --reflink寫入時複製。其他程式(例如lxc-clone)也可以使用此功能。我的問題是,如何判斷一個檔案是否是另一個檔案的 CoW?就像硬連結一樣,我可以從索引節點號看出。

答案1

好問題。看起來目前沒有任何簡單的高級方法可以判斷。

一個問題是檔案可能僅透過寫入時複製共享部分資料。這稱為物理範圍,並且一些 或者 全部物理範圍的一部分可以在 CoW 檔案之間共用。

當在文件之間進行比較時,沒有任何類似的東西inode可以告訴您文件共享相同的物理範圍。(編輯:參見我的另一個答案)。

低階答案是,您可以使用以下命令詢問內核檔案使用了哪些物理範圍FS_IOC_FIEMAP ioctl,即記錄在Documentation/filesystems/fiemap.txt。原則上,如果所有實體範圍都相同,則檔案必須共用相同的底層儲存。

很少有事情能夠實現從更高層次查看這些資訊的方法。我找到了一些在這裡輸入代碼。顯然是filefrag實用程式應該用 -v 顯示範圍。此外,btrfs-debug-tree顯示此資訊。

不過,我會謹慎行事,因為這些東西在野外可能沒有什麼用處,因此您可能會發現錯誤給您錯誤的答案,因此要小心依賴這些數據來決定可能導致數據損壞的操作。

一些相關問題:

答案2

進一步我之前的回答,我剛剛發布了fienode它計算檔案物理範圍的 SHA1 雜湊值,並可用於尋找一些(相同的)引用連結副本。但請注意,有一些警告(請參閱文件)。 BTRFS 決定更改我在沒有挑釁或警告的情況下製作的 refink 副本的部分(但不是全部)物理範圍,從而導致值發生變化。

答案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

問題:

  • 區分符號鏈接和硬鏈接與引用鏈接
  • 識別部分克隆(共享部分但非全部資料的檔案)

解決方案:

  • 使用文件碎片
  • 用於stat識別設備,因為克隆必須駐留在同一檔案系統上。

引用:

硬連結與其目的地共享相同的索引節點號,而克隆則有自己的索引節點。這種區別(加上寫入時複製檔案系統)使克隆能夠獨立於其原始檔案運行,即使在被非克隆感知程式修改時也是如此。

  • 執行指令 filefrag -v file1 file2 (e2fsprogs 的一部份)。比較設定了共享標誌的盤區行內的文件的physical_offset 範圍。

如果這兩個檔案共用任何相同或重疊的範圍,則它們會共用儲存磁碟機上的重複資料刪除/複製資料。

至於確定哪個是原作,哪個是克隆……。如果沒有時間機器,這幾乎是不可能確定的。

相關內容