寫入目錄時複製?
一些文件系統,特別是 XFS 和 btrfs 支持文件的塊級寫入時複製。這是通過重新連結文件之間共享底層塊的位置來完成的,直到它們被修改。
由於目錄本質上是將文件名映射到 inode 的關聯數組,因此應該直接對目錄執行類似的操作。
是否已經開發了任何可以在 Linux(或任何其他類 Unix 系統)上支持此功能的文件系統?
大概它需要核心支持,就像使用重新連結一樣。這是一個類似於copy_file_range () 的呼叫,它適用於目錄。
有沒有人積極從事這方面的工作?僅僅是沒有人願意這樣做,還是有任何理由說明這是一個壞主意或不必要的?
是否有任何特殊的技術障礙需要克服?
另請參閱https://serverfault.com/questions/129969/is-there-a-way-to-create-a-copy-on-write-copy-of-a-directory 並沒有真正回答這個問題。
是否有任何特殊的技術障礙需要克服?
一大障礙是語義上的差異。複製目錄(在目標不存在的情況下)會導致其所有內容的副本,以及指向所有這些內容的新目錄。特別是,這意味著雖然源目錄和目標目錄最終包含相同的名稱,但每個名稱的目標 inode 是不同的。
如果以與複製文件相同的方式複製目錄,則最終會得到兩個目錄,其內容指向相同的 inode — 實際上,您正在創建一個包含指向原始目錄內容的硬連結的目錄。這對目錄不起作用,它為文件創建了令人驚訝的語義——複製
dira
包含file
, asdirb
意味著編輯dirb/file
也會編輯dira/file
,這可能不是最初的意圖。因此,這意味著目錄副本的共享儲存在一般情況下不起作用,並且僅在少數情況下有用。
copy_file_range
並且s但是不要假設底層儲存將被共享。FICLONE
ioctl
它們是“核心,請複制此(部分)文件”形式的請求;它們的好處是可以共享儲存,但委託複製比讀取和寫入更有效。例如,在網路文件系統上,可以在伺服器上處理複製,這比客戶端驅動的副本效率高得多。將此推理應用於目錄副本,而不必共享底層儲存,可能會很有用。即使在有用的場景中,核心操作的實現和使用也會很複雜。
文件複製操作需要處理單個文件,最初在單個文件系統中。即便如此,
copy_file_range
跨多個文件系統處理副本的擴展也導致了許多問題。目錄的“複製”操作會復雜得多。複製目錄不僅包括複製目錄本身(即文件名到 inode 的映射),還包括目錄的內容。如前所述,您不能只硬連結文件,語義會有所不同;即使這是可以接受的簡化,您仍然需要處理無法硬連結的條目,例如您嘗試複製的目錄中的目錄。然後我們到達安裝點,“有趣”的水平就上升了很多。所有這一切當然是在處理權限時。
假設有人實現了所有這些,那麼您需要更新相關的使用者空間程序以使用新操作,並將現有程式碼作為備份。與單文件複製不同,語義是相當不同的,在所有情況下拼接新函式可能並不容易。生成的文件系統語義也不同(可以說,如果它是值得——見
relatime
和noatime
)。可能還有其他我還沒有想到的障礙;但是第一個表明目錄實際上幾乎沒有機會實際共享儲存。