檔案系統實作

當機一致性(crash consistency)

假設你正在更新一本紙本帳冊:擦掉舊餘額、寫上新的,再更新最上面的累計總額。如果有人在第一步之後、其他步驟之前把那一頁抽走,帳冊現在就自相矛盾了。檔案系統不斷面對相同的危險,因為一個邏輯動作——比如建立一個檔案——其實需要好幾次分開的磁碟寫入:在位元圖中配置一個區塊、寫入索引節點、加入目錄項目。中途當機就讓磁碟處於不一致的狀態。當機一致性是這樣一種性質(以及達成它的技術):檔案系統在意外當機或斷電後,總能被帶回一個合理的狀態。

危險在於:跨多個區塊的磁碟寫入並非不可分割:檔案系統無法在一個不可分割的步驟裡同時更新位元圖、索引節點與目錄。若在位元圖把某區塊標記為已用之後、索引節點記錄擁有它之前斷電,那個區塊就漏了——被標記為已用卻不屬於任何檔案。若在目錄指向某索引節點之後、索引節點被寫入之前失敗,目錄就指向垃圾。最素樸的復原是在開機時用像 fsck 的工具掃描整個檔案系統,費力地交叉核對每一個結構並修補矛盾——做法正確,但在大磁碟上慢得令人煎熬,而且不保證救回你的資料,只保證讓中繼資料自相一致。

由於完整掃描太慢,現代檔案系統把當機一致性設計進去。主要做法是日誌(先把變更的描述寫進一份記錄,這樣復原時可以重做或捨棄那個半完成的更新)、軟更新(小心地排序寫入,使磁碟上的狀態即使被打斷也總是一致)、以及寫入時複製(絕不覆寫存活的資料;把新版本寫到別處,再不可分割地切換過去)。一個誠實的限制貫穿它們全部:預設情況下,這些技術保護的是檔案系統的「中繼資料」——它自己的記帳——不一定保護你檔案的「資料」。當機後,檔案系統可能完美地一致,而你最後幾秒打的字就這麼沒了。

建立 note.txt 需要三次寫入:在位元圖中把一個區塊標記為已用、寫入新的索引節點、加入目錄項目。若只在位元圖寫入之後斷電,那個區塊現在被標記為已用卻無人擁有——一處洩漏。復原(日誌重放或 fsck)正是要偵測並修復這種半完成的更新。

一個邏輯變更 = 數次磁碟寫入;它們之間的當機留下矛盾,必須由復原來化解。

多數當機一致性技術保證的是檔案系統的中繼資料一致,而非你最近的檔案資料安然無恙。一個一致的檔案系統,仍可能弄丟你最後幾秒未存的工作。

又称
file-system consistencyconsistency on crash崩潰一致性一致性復原