檢查檔案系統 (Filesystem Check, fsck)

FlossDoc,自由中文開源知識庫

Jump to: navigation, search

Unix/Linux 一般使用工具 fsck (意思為 filesystem checkfilesystem consistency check) 來檢查檔案系統是否有問題和進行修復工作 (和 Windows/MSDOS 的磁碟掃瞄工具 SCANDISK/CHKDISK 類似),您可以使用系統管理員帳戶 (即 root) 身份打「fsck 儲存裝置」來檢查特定的儲存裝置。

目录

強行檢查檔案系統

然而,事實上 fsck 一般只會對檔案系統作很簡單的檢查就會離開:

要強迫 fsck 進行完整的檔案系統檢查,您需要加上選項 -f,即命令「fsck -f 儲存裝置」:

fsck -f /dev/sda7

fsck 會自動根據要檢查儲存裝置的檔案系統,尋找程式 fsck.檔案系統 並執行。以 ext3 為例,如果要檢查儲存裝置的檔案系統為 ext3,fsck 自然會把檢查檔案系統交由 fsck.ext3 處理。一般 GNU/Linux 都會有 e2fsck、fsck.ext2 和 fsck.ext3,而事實上三個命令都是同一個程式。

檔案系統 fsck 程式 套件
Ext2/Ext3/Ext4 e2fsck, fsck.ext2, fsck.ext3, fsck.ext4 e2fsprogs
SGI XFS fsck.xfs (幌子程式) xfsprogs
ReiserFS reiserfsck, fsck.reiserfs reiserfsprogs
IBM JFS jfs_fsck, fsck.jfs jfsutils
FAT dosfsck, fsck.vfat, fsck.msdos dosfstools
cramfs fsck.cramfs util-linux
Minix 檔案系統 fsck.minix util-linux

檢查檔案系統的作用

fsck 的工作主要是檢查檔案系統的一致性 (consistency)。

檢查檔案系統工作

Ext2/Ext3/Ext4 (e2fsck)

大部份檔案系統的 fsck 都會用多重步驟 (multi-pass) 來進行檢查工作。e2fsck 就有五重步驟[2]

  • 第一步:檢查所有 inode 的一致性 - 檢查所有 inode 所表示檔案和目錄的 mode (包括檔案類型和使用權限) 是否有效,所有區塊 (block) 指標中的區塊編號是否有效,inode 中的檔案大小 (size count) 和區塊數目 (block count) 欄是否正確以及多於一個 inode 使用同一個區塊。在檢查過程中,fsck 同時收集檔案系統以下資料以方便進行往後的步驟:
    • 記錄那個 inode 確實正在使用,表示檔案還是目錄。
    • 記錄那個區塊確實正在使用,和有沒有多於一個 inode 使用同一個區塊。
    • 識別表示目錄的 inode 所使用的資料區塊 (data block)
  • 第二步:檢查所有目錄 - 使用第一步建立的紀錄檢查所有目錄中資料,並在過程中同時同時收集各目錄的父目錄 inode:
    • 每個目錄項目的長度和檔案/目錄名稱是否有效
    • 目錄中 inode 編號是否有效 (大於 1 和小於檔案系統的 inode 總數)
    • 目錄中 inode 編號所指的 inode 是否正使用
    • 第一個項目是 “.” 而且 inode 編號指向目錄自己
    • 第二個項目是 “..”
  • 第三步:檢查目錄結構 - 先將根目錄 (/) 標記為 “done”,並追踪所有目錄 inode 的父目錄 inode 直至一個已標記為 “done”的目錄 inode。如果不成功或追踪過程訪問同一目錄 inode 多於一次 (表示為循環目錄),e2fsck 會把目錄移至lost+found 中。
  • 第四步:檢查所有 inode 的連結數目 (link count/reference counter) - 比較在第一步計算出來的連結數目和第二、三步的結果,把連結數目 0 的 inode 移至lost+found 中。
  • 第五步:檢查超級區塊 (superblock) 的資料 - 比較超級區塊的資料和前四步所計算的資料包括區塊對應表 (block bitmaps) 和 inode 對應表 (inode bitmaps) 。如果不一樣,將使用前四步所計算的資料修正超級區塊的資料。

e2fsck 如檢查有檔案系統有問題,會嘗試自動修復。修復出來的檔案將存放在目錄 lost+found 中。

# e2fsck -f /dev/sda7
e2fsck 1.41.3 (12-Oct-2008)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sda7: 254995/720896 files (1.2% non-contiguous), 2814327/2879643 blocks

SGI XFS (fsck.xfs)

因為作為日誌式檔案系統的 XFS 是直接在掛載 (mount) 時自動進行修復工作,所以 fsck.xfs 只是一個幌子程式,無論如何不做任何事而直接離開。

直接檢查檔案系統一致性的工具和修復工具分別為 xfs_checkxfs_repair

ReiserFS (reiserfsck)

IBM JFS (jfs_fsck)

FAT (dosfsck)

依次序檢查以下:

  • FAT 中有無效的 cluster 編號,發現則改成 EOF。
  • 檔案 cluster 鏈有循環
  • 有壞 cluster (讀取時有錯誤),發現則把該 cluster 標記為壞 cluster,並由使用它的檔案中移除。
  • 有大量壞項目的目錄,發現則可能要遺棄整個目錄。
  • 檔案 . 和 .. 不是目錄,發現則需要改名。
  • 在根目錄發現目錄 . 和 ..,發現則需要遺棄。
  • 有壞檔案名稱,發現則需要改名。
  • 有重覆目錄項目,發現則需要改名或遺棄。
  • 有目錄的檔案大小為非零,發現則需要設定為 0。
  • 有目錄 . 不指向父目錄 (parent directory),發現則需要調節指標。
  • 有目錄 .. 不指向父目錄的父目錄,發現則需要調節指標。
  • 檔案的第一 cluster 編號無效,發現則需要設檔案大小為 0。
  • 檔案有壞或未使用的 cluster,發現則需要折斷檔案。
  • 檔案 cluster 鏈長於檔案大小欄所指定的大小,發現則需要折斷檔案。
  • 兩個或以上的檔案使用同一個 cluster,發現則除一個檔案外,其檔案都需要被折斷。如果被折斷是一個已檢查的目錄,折斷後需要重新開以整個檔案系統檢查工作。
  • 檔案 cluster 鏈短於檔案大小欄所指定的大小,發現則需要折斷檔案。
  • cluster 被標記為已使用但未有一個檔案使用,發現則需要未使用。

此外,亦會檢查以下但不進行修復:

  • 啟動磁區 (boot sector) 有無效參數
  • 非根目錄沒有 [[File:.|.]] 和 [[File:..|..]] 兩項目

參考資料

  1. Henson, Valerie (2006-07-05). “The 2006 Linux Filesystems Workshop (Part II)” Linux Weekly News.
  2. William von Hagen (2001). “Linux Filesystems”. Sams Publishing. ISBN 06-723-2272-2

請參看

外部連結

Personal tools