跳轉到

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)的三種模式#

  1. journal:資料+中繼資料都寫日誌(最安全、最慢)。
  2. ordered(預設):中繼資料寫日誌,資料先於中繼資料寫出。
  3. writeback:只寫中繼資料日誌(最快、當機後資料可能舊)。
  4. 理論基礎:一致性與效能的取捨——日誌越完整越安全但越慢。

第二條線索:交易的原子性#

\[ \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。