檔案系統實作

記錄結構檔案系統(log-structured file system)

想像寫一本日記,你從不回頭去擦掉或重寫舊的一頁——你只往最後面追加。要更新昨天的記錄,你只在底部寫一條新筆記說明改了什麼,而最新的筆記永遠勝出。記錄結構檔案系統把整顆磁碟當成那本日記:它從不就地修改資料;它把變更先緩衝起來,再全部循序地寫出,作為對一條單一、不斷增長之記錄末端的一次大追加。

動機是「在搜尋成本昂貴的磁碟上」追求效能。零散的小寫入逼磁頭到處亂跳;記錄結構檔案系統在記憶體中蒐集許多待處理的寫入——新資料區塊、變動的索引節點、目錄更新——再以一次長長的循序寫入把它們串流到記錄裡,這是磁碟非常擅長的事。由於索引節點被重寫時也會移動,系統維護一張索引節點映射表,記錄每個索引節點目前的版本現在住在哪,而這張表本身也寫進記錄裡,並由一塊固定的檢查點區域追蹤。讀取仍然可以很快,因為索引節點映射直接指向最新副本。當然,隨時間推移,記錄會塞滿磁碟並散落著舊的、被取代的版本,所以一個背景清理器(垃圾收集器)會掃描舊的記錄區段,把其中少數仍存活的區塊往前複製成新的寫入,並釋放回收的區段供重用。

最大的勝利是寫入變得幾乎純循序,這在歷史上大幅勝過受限於搜尋的寫入效能,並提供自然的當機一致性(記錄的尾端就是最新狀態)。誠實的代價是讀取碎裂(一個檔案的區塊經過多次更新後可能散落於整條記錄)以及清理器本身,它爭奪磁碟頻寬,並可能在磁碟快滿時讓事情卡住。純記錄結構檔案系統在今日的通用磁碟上較少見,但其核心概念無所不在:它本質上正是快閃 SSD 與其快閃轉換層內部的運作方式,因為快閃同樣禁止就地覆寫。

對十個檔案存入小修改:LFS 不做十次零散的就地寫入(十次搜尋),而是把這十個檔案的新區塊連同更新後的索引節點蒐集進一個區段,在記錄末端以單次循序寫入寫出。稍後,清理器回收這些檔案留下、如今已作廢的舊版本。

把許多零散的寫入變成一次大的循序追加;背景清理器稍後回收作廢的空間。

這個概念活在 SSD 內部:快閃同樣無法就地覆寫,所以快閃轉換層把新資料寫到別處,再對舊區塊做垃圾收集——這是裝置層級的記錄結構思維。

又稱
LFSlog-structured filesystem日誌結構檔案系統記錄式檔案系統