檔案系統檢查(filesystem check,fsck)
/ fsck = EFF-ess-see-kay or 'eff-sck' /
有時一個檔案系統會落得內部自相矛盾——一個被標為已用卻不屬於任何檔案的區塊、一個連結計數與「實際有多少目錄項指向它」不符的 inode、一個命名了已被釋放之 inode 的目錄項。這可能發生在日誌無法完全修復的不乾淨關機之後、磁碟硬體錯誤之後、或軟體錯誤之後。檔案系統檢查,由工具 fsck 執行,正是那個掃描整個檔案系統、找尋這類矛盾並修復它們、把結構放回一致狀態的程式。
概念上 fsck 分階段做一次徹底的稽核。它檢查每個 inode(型別有效嗎?它的連結計數等於實際參考它的目錄項數嗎?)、每個目錄項(它指向一個使用中的 inode 嗎?「.」與「..」正確嗎?)、以及每個區塊(每個已用區塊恰被一個檔案宣稱嗎——沒有區塊被宣稱兩次、沒有已用區塊無人宣稱嗎?)。它從實際找到的東西重建空閒區塊與空閒 inode 的位元圖與計數。當它發現一個完全沒有任何目錄參考的 inode——有資料卻無名字——它不刪除它;它把它以一個數字名字連進一個特殊的 lost+found 目錄,好讓管理員檢視。在日誌檔案系統上,一次例行的不乾淨關機通常靠掛載時的快速日誌重播修復,只有在懷疑更深層損壞時才需要完整的 fsck,因為對一個大檔案系統做完整檢查可能花很久。
為何重要:fsck 是檔案系統完整性的最後一道防線,而 lost+found 正是糟糕當機後「成為孤兒卻被救回」之資料的去處。對它的本質要誠實:fsck 修復的是檔案系統的「結構」,而非你檔案的「內容」——它能讓後設資料再次一致,卻無法重建從未被持久寫入的位元組,而一次「修復」可能正當地丟棄一個建立到一半的檔案、或把一個檔案截斷到一致的長度。你絕不可對一個已掛載、正在變動的檔案系統執行 fsck(它會看到一個移動的目標、並可能損壞它);而 fsck 不是備份的替代品,只是一個把受損檔案系統再次變得可掛載且自我一致的方法。
$ sudo fsck /dev/sdb1 # 必須先卸載 Pass 1: 檢查 inode、區塊與大小 Pass 2: 檢查目錄結構 Inode 4521 參考計數為 2,應為 1。修復?yes 孤立的 inode 9003。連到 /lost+found?yes /dev/sdb1: 11/65536 個檔案, 2841/262144 個區塊
fsck 稽核 inode、目錄與區塊宣稱,修正計數並把孤立的 inode 停放進 lost+found。
絕不要對一個已掛載、正在被寫入的檔案系統執行 fsck——它稽核一個移動的目標、並可能損壞它。fsck 修復結構、而非內容:它無法救回從未被持久寫入的位元組,而一次正當的修復可能丟棄或截斷一個寫了一半的檔案。它讓檔案系統一致且可掛載;它不是備份。