檔案系統實作

寫入時複製檔案系統(copy-on-write file system)

/ btrfs -> BUTTER-eff-ess /

想像你從不擦掉手稿頁面來編輯。要改一行,你反而把那一頁影印一份,在副本上編輯,只有當副本完美無瑕時,才把它換進活頁夾、頂替舊的那一頁。舊頁直到最後一步都原封不動地存活著。寫入時複製檔案系統就是這樣運作的:它從不就地覆寫一個存活的區塊。要改資料,它把新版本寫到一個全新的空閒區塊,再更新指標指向新區塊——而舊版本在那次切換發生前都保持完好。

因為沒有任何存活的東西被覆寫,磁碟上的狀態總是一致的:在任何一瞬間,檔案系統要不仍指向「完全是舊」的版本,要不已乾淨地切換到「完全是新」的版本,絕不會是半混雜的爛攤子。這次切換之所以不可分割,是把變更沿著一棵指標樹一路向上串連到一個最後才更新的單一根:先寫新的資料區塊,再寫指向它的新索引節點,再寫指向該索引節點的新目錄,最後翻動那一個根指標(超級區塊)指向新的樹。根翻動之前的當機,留下舊而一致的樹;之後的當機,留下新的樹。同一個機制讓快照幾乎免費:把舊的根指標留著,你就有一個凍結、唯讀的整個檔案系統視圖,呈現它在那一瞬間的樣子,並共用所有未變動的區塊。ZFS 與 btrfs 是著名的寫入時複製檔案系統。

寫入時複製不需另外的日誌就提供強大的當機一致性(一致性內建在寫入的方式裡),外加便宜的快照、用於偵測無聲毀損的校驗和、以及容易的回復。誠實的代價:寫新副本而非覆寫,會隨時間把檔案的區塊散落各處(碎裂),這可能傷害循序讀取速度;而追蹤眾多共用區塊與快照需要額外的中繼資料與記憶體。它與日誌是不同的取捨,而不是一個全然免費的升級。

在 btrfs 上,你在一次有風險的升級前執行 snapshot——瞬間完成、幾乎不耗空間,因為快照只是共用所有既有區塊。升級接著只寫入變動區塊的新副本。如果它弄壞系統,你回復到快照的根指標,每一個原始區塊都還在、原封不動。

絕不就地覆寫:寫新的、不可分割地切換根——一致性與便宜的快照隨之而來。

這和記憶體管理中的寫入時複製概念相同(共用頁面直到有人寫入),只是套用在磁碟區塊上。取捨是真實的:異地寫入會使檔案碎裂,而追蹤共用區塊的中繼資料較沉重。

又称
CoW file systemZFSbtrfs寫時複製檔案系統