日誌式檔案系統(journaling file system)
想像一位謹慎的會計,在更動主帳本之前,先把整筆打算做的變更寫在一張便條紙上:從 A 帳戶扣 50、給 B 帳戶加 50。如果她在編輯帳本到一半時被打斷,可以回到便條,要不就把變更做完,要不就在便條不完整時把它作廢。便條保證帳本絕不會停在改到一半的狀態。日誌式檔案系統就是保有這樣一張便條——日誌(或記錄)——以撐過當機。
這個技術叫作預寫式記錄。在碰真正的檔案系統結構之前,檔案系統先把整筆打算做的更新寫成一筆記錄,放進磁碟上一塊專用的日誌區,並等待這次寫入落地。這筆記錄(一筆交易)實際上說的是:「以下是建立 note.txt 的所有中繼資料變更:位元圖區塊的變化、索引節點內容、目錄項目。」只有在日誌記錄安全提交之後,檔案系統才繼續去更新磁碟上真正的位置。全部做完後,那筆日誌項目被標記為完成,可供重用。回報在當機之後出現:系統不必掃描整顆磁碟,只讀日誌。任何已完整提交到日誌、卻尚未在磁碟上完成的交易,就直接重放(重做)到完成;任何未完整提交的就作廢。復原只需數秒,而非完整 fsck 的數分鐘或數小時。
日誌是 ext3、ext4、NTFS 及許多系統的預設,也是當機一致性的標準解答。兩個誠實的重點:每筆變更寫兩次(一次寫日誌、一次寫真正位置)會耗效能,所以多數系統預設只記錄中繼資料、不記檔案資料——這正是為什麼當機後可能留下一個中繼資料一致、但最新檔案內容仍是垃圾或零的檔案系統。而日誌只保護被寫進它裡面的東西;仍待在揮發性緩衝快取、從未被記錄的資料,在當機時無論如何都會消失。
ext4(在預設的 ordered 模式下)建立檔案:它寫一筆日誌交易,描述索引節點、位元圖與目錄的變更並提交;然後把這些變更寫到它們真正的位置。若更新途中斷電,重開機時核心重放那筆已提交的日誌交易,檔案正確出現——無需完整掃描磁碟。
先把計畫寫進日誌,再去執行;當機時重放已提交的計畫、捨棄其餘。
預設情況下日誌保護的是中繼資料,不是你的檔案資料——當機可能產生一個完全一致、但剛建立的檔案裡全是零的檔案系統。連資料也記錄(完整資料日誌)較安全但較慢。