超級區塊(superblock)
每個檔案系統都需要一個地方來描述整個檔案系統,而非任何單一檔案:它有多大、用多大的區塊、存在多少個 inode、重要的表格放在哪裡、上次是否乾淨地卸載。那份摘要紀錄就是超級區塊。如果一本書的目錄告訴你書名、頁面尺寸、章節數、以及每一節從哪裡開始,那麼超級區塊就是整個儲存卷的那份目錄。
其實要分清楚兩個超級區塊。在磁碟上,超級區塊是一個固定的小結構(常在卷上各處備有重複的備份副本),存放識別檔案系統型別的魔術數字、區塊與 inode 的總數、空閒計數、區塊大小、inode 表與位元圖的位置,以及一個在掛載時設上、乾淨卸載時清除的乾淨/髒旗標。在記憶體中,核心保有一個 VFS 的 struct super_block,每個掛載的檔案系統一個,它指向根 dentry、持有用於同步與卸載的函式指標(super_operations),並快取磁碟上的值,使它不必不斷重讀。
為何重要:超級區塊是 fsck 與掛載程式碼最先讀取的進入點——若它損毀,檔案系統可能根本拒絕掛載,這正是為何檔案系統會保留多份備援的備份超級區塊(你可以用類似 fsck -b 32768 的指令把 fsck 指向其中一份)。超級區塊裡的髒旗標也是系統在下次開機時得知某檔案系統未被乾淨卸載、可能需要日誌重播或完整檢查的方式。
$ sudo dumpe2fs -h /dev/sda1 Block size: 4096 Inode count: 6553600 Free blocks: 482113 Filesystem state: clean 備份超級區塊位於: 32768, 98304, ...
dumpe2fs 印出磁碟上的超級區塊:區塊大小、各種計數、乾淨/髒狀態,以及備份位置。
超級區塊裡的空閒區塊數與空閒 inode 數是與位元圖保持同步的摘要;寫入途中當機可能使兩者不一致,而這種不一致正是 fsck 或日誌重播存在要修復的問題之一。