2003 - ext3 日誌式檔案系統(當機後的重生)#
案件摘要#
2001–03 年(2001 年進入 Linux 核心 2.4.15,2003 年 RHEL 3 普及),ext3 成為 Linux 預設檔案系統——第一個廣泛使用的日誌式檔案系統(journaling filesystem)。
\[ \text{當機瞬間} \;\xrightarrow{\text{日誌重放}}\; \text{檔案系統一致性恢復} \quad (\text{數秒}) \;\text{取代}\; \text{fsck 全盤掃描(數小時)}. \]
彌補的缺陷:ext2 當機後必須跑 fsck 檢查整個磁碟——大型伺服器重啟要等數小時。
前因 -- 為什麼會有這個案子#
- ext2 的缺陷:ext2(1993)把中繼資料寫入多個位置,當機(斷電)時寫到一半 → 檔案系統不一致,重啟後
fsck要掃描全部 inode——TB 級磁碟要數小時。 - 資料庫理論的借鏡:1970 年代資料庫(System R、Oracle)已用 write-ahead logging(WAL,預寫日誌)保證交易原子性——ext3 把資料庫的交易理論移植到檔案系統:
\[ \text{ACID 的原子性} \;\Longrightarrow\; \text{日誌先寫、資料後寫、當機重放}. \]
- Stephen Tweedie 的實作:為了不破壞 ext2 的磁碟格式(舊 ext2 可原地升級 ext3)——漸進演化的工程智慧。
線索與推理 -- 數學式、程式、理論#
第一條線索:日誌(journal)的三種模式#
- journal:資料+中繼資料都寫日誌(最安全、最慢)。
- ordered(預設):中繼資料寫日誌,資料先於中繼資料寫出。
- writeback:只寫中繼資料日誌(最快、當機後資料可能舊)。
- 理論基礎:一致性與效能的取捨——日誌越完整越安全但越慢。
第二條線索:交易的原子性#
\[ \text{交易} = \{\text{寫日誌} \to \text{提交(commit)} \to \text{實際寫入}\}. \]
- 彌補的缺陷:當機可能發生在任何寫入中間——日誌把「多步寫入」變成原子交易:要嘛全部完成、要嘛全部重放、要嘛全部放棄。
第三條線索:後繼者——ext4 與 btrfs#
- ext4(2008):extent(區段)取代間接區塊、延遲分配(delayed allocation)——效能再躍升。
- btrfs(2009)/ZFS(2005):寫時複製(copy-on-write)、快照、校驗和——檔案系統的現代化。
Shell 範例:日誌式檔案系統的實證#
# ext2 vs ext3:當機恢復時間的對比
$ fsck /dev/sda1 # ext2:掃描全部 inode,數小時
$ fsck /dev/sdb1 # ext3:只重放日誌,數秒
/dev/sdb1: clean, 1234/655360 files, ...
# 建立 ext3 日誌(從 ext2 原地升級)
$ tune2fs -j /dev/sda1 # 加上日誌,資料不動
$ mount -t ext3 /dev/sda1 /mnt
Python 範例:模擬 WAL 的原子性#
import json, os
def transaction(log, updates):
"""write-ahead logging:先寫日誌,再套用更新"""
with open("journal.log", "w") as f:
json.dump({"updates": updates}, f) # 1. 先寫日誌
f.flush(); os.fsync(f.fileno()) # 強制落盤
for k, v in updates.items(): # 2. 實際更新
log[k] = v
os.remove("journal.log") # 3. 提交完成
def recover(log):
if os.path.exists("journal.log"): # 當機後:重放日誌
with open("journal.log") as f:
for k, v in json.load(f)["updates"].items():
log[k] = v
return log
結案 -- 後果與影響#
- 伺服器可用性:日誌式檔案系統讓 Linux 伺服器重啟從「小時級」降到「秒級」——雲端時代的基礎。
- 資料庫理論的移植:WAL 從資料庫(1970s)→ 檔案系統(2001)→ 容器與 KV 存儲(etcd、RocksDB)——交易理論的通用化。
- 後繼者:ext4(2008)、btrfs(2009)、ZFS(2005)、APFS(2017,Apple)——copy-on-write 與快照成為標配。
- 歷史教訓:一致性不是免費的,但「當機後等數小時」更貴——日誌是把災難成本換成日常成本的交易。
關鍵人物與文獻#
- S. Tweedie:〈ext3, Journaling Filesystem〉(2000, Ottawa Linux Symposium)。
- C. Mohan et al.:ARIES 交易復原始算法 (1992, IBM)。
- 相關案件:
1993-發行版與FreeBSD誕生.md、2013-Docker容器.md。