我正在使用 btrfs,它允許cp --reflink
寫入時複製。其他程式(例如lxc-clone
)也可以使用此功能。我的問題是,如何判斷一個檔案是否是另一個檔案的 CoW?就像硬連結一樣,我可以從索引節點號看出。
答案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
問題:
- 區分符號鏈接和硬鏈接與引用鏈接
- 識別部分克隆(共享部分但非全部資料的檔案)
解決方案:
- 使用文件碎片
- 用於
stat
識別設備,因為克隆必須駐留在同一檔案系統上。
引用:
硬連結與其目的地共享相同的索引節點號,而克隆則有自己的索引節點。這種區別(加上寫入時複製檔案系統)使克隆能夠獨立於其原始檔案運行,即使在被非克隆感知程式修改時也是如此。
- 執行指令 filefrag -v file1 file2 (e2fsprogs 的一部份)。比較設定了共享標誌的盤區行內的文件的physical_offset 範圍。
如果這兩個檔案共用任何相同或重疊的範圍,則它們會共用儲存磁碟機上的重複資料刪除/複製資料。
至於確定哪個是原作,哪個是克隆……。如果沒有時間機器,這幾乎是不可能確定的。