設定常規檔案系統檢查 (Filesystem Check, fsck)

FlossDoc,自由中文開源知識庫

Jump to: navigation, search

除了直接使用命令「fsck -f 裝置檔案」檢查檔案系統的完整性 (integrity) 外,Unix/Linux 系統亦會在啟動時依各種情況和數據決定是否對個別檔案系統進行例行的完整檔案系統檢查。

目录

檢查次序

Unix/Linux 啟動後先會檢視檔案 /etc/fstab 中的 pass 欄 (第六欄) 檢查檔案系統的次序。pass 值為 0 時表示永不檢查,非零亦由小至大逐個檢查。以下面例子,GNU/Linux 會先檢查 /dev/sda6 ,然後檢查 /dev/sda1。

proc       /proc          proc     defaults        0  0
/dev/sda6  /              ext3     defaults        0  1
/dev/sda1  /boot          ext3     defaults        0  2
/dev/sda5  none           swap     sw              0  0

檔案系統的資料

Ext2/Ext3/Ext4 會根據檔案系統以下三個條件決定是否真得進行完整檢查工作:

  • 檔案系統狀態 (Filesystem state) - 檔案系統如果沒有被卸載 (unmount),自然要進行檢查工作。
  • 掛載次數 (Mount count) - 檔案系統被掛載多次或系統被多次重新啟動後,就需要進行例行檢查工作。
  • 檢查間距 (Check interval) - 檔案系統過久沒有被檢查,亦需要進行例行檢查工作。

每個檔案系統都會記錄檔案系統功能 (Filesystem features)、檔案系統狀態 (Filesystem state)、最後掛載時間 (Last mount time)、掛載次數 (Mount count)、最大掛載次數 (Maxmimum Mount count)、最後檢查時間 (Last checked)、檢查間距 (Check interval, 以秒為單位) 和下次檢查時間 (Next check after) 等數據方便 e2fsck 判斷以上的三個條件。您可以使用命令 「dumpe2fs -h 裝置檔案」 或 「tune2fs -l 裝置檔案」 顯示以上數據:

Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
...
Filesystem created:       Sat Apr 26 00:55:40 2008
Last mount time:          Thu Oct  2 23:52:21 2008
Last write time:          Thu Oct  2 23:52:21 2008
Mount count:              12
Maximum mount count:      38
Last checked:             Sun Sep  7 20:51:09 2008
Check interval:           15552000 (6 months)
Next check after:         Fri Mar  6 20:51:09 2009
Reserved blocks uid:      0 (user root)

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

檔案系統是否被正常卸載

e2fsck 每次被執行會先檢查檔案系統是否有被正常卸載,來決定是否需要用日誌修復檔案系統或進行完整檔案系統檢查。視乎檔案系統是否有日誌,e2fsck 會用以下兩種方法來判斷:

  • needs_recovery 檔案系統功能 - 只在有日誌的檔案系統,即 Ext3 或 Ext4
  • 檔案系統狀態 (Filesystem state)

needs_recovery 功能

e2fsck 如果發現檔案系統有日誌 (即是 Ext3Ext4 檔案系統),會先用檔案系統功能 (Filesystem features) needs_recovery 確定檔案系統是否被正常卸載。每當檔案系統被掛載成讀寫模式 (rw) 時,檔案系統功能會加上 needs_recovery。如果檔案系統之後被成功卸載時,needs_recovery 功能會被取消。

所以檔案系統沒有被成功卸載或者運作中途系統被中斷等,檔案系統功能仍會有 needs_recovery。當檔案系統下次被檢查時,就可以由有否 needs_recovery 功能得知檔案系統是否有被正常卸載。如果檔案系統有 needs_recovery,fsck 就會嘗試把檔案系統掛載先在一個暫時的目錄。因為掛載檔案系統,會令檔案系統嘗試完成日誌中未完成的工作來快速自動修復。如果成功,檔案系統狀態 (Filesystem state) 將被設回 clean,needs_recovery 亦會自然會消失,e2fsck 就可以離開。如果修復失敗,e2fsck 會對 檔案系統進行完整檢查工作。

檔案系統狀態 (Filesystem state)

如果沒有日誌 (即為 Ext2 檔案系統),就只會使用檔案系統狀態 (Filesystem state) 確定檔案系統是否被正常卸載,其值可以為:

  • not-clean - 表示檔案系統掛載成讀寫模式 (rw) 後,仍未被卸載
  • clean - 表示檔案系統已成功地被卸載
  • erroneous - 表示檔案系統被發現有問題

每當檔案系統被掛載成讀寫模式 (rw) 時,檔案系統狀態會被設定為 not-clean。如果檔案系統之後被成功卸載時,檔案系統狀態會被設定為 clean。所以檔案系統沒有被成功卸載或者運作中途系統被中斷等,狀態會維持在 not-clean。當檔案系統下次被檢查時,就可以由檔案系統狀態得知檔案系統是否有被正常卸載。如果檔案系統狀態為 not-clean,fsck 就會檔案系統對進行完整檢查工作。檢查工作成功完成後,檔案系統狀態自然會變回 clean。

掛載次數 (Mount count)

掛載次數 (mount count) 表示上成檢查檔案系統後,檔案系統被掛載成讀和寫 (rw) 的次數。每當檔案系統被掛載成讀寫模式時,掛載次數 (mount count) 會被加一。當掛載次數大於最大掛載次數 (maximum mount count) 時,fsck 就會檔案系統對進行例行的完整檢查工作了。完整檢查工作成功完成後,掛載次數自然會變回 0。

要改變檔案系統的掛載次數,可以使用 tune2fs 命令的 -C mount-count 選項:

tune2fs -C 0 /dev/sda5

要改變檔案系統的最大掛載次數,可以使用 tune2fs 命令的 -c max-mount-count 選項:

tune2fs -c 40 /dev/sda5

檢查間距 (Check interval)

為了要很少被掛載或重新啟動系統中的檔案系統會被進行例行完整檢查,Ext2/Ext3 亦會使用檢查間距。每當檔案系統被掛載成讀寫模式時,最後掛載時間 (Last mount time) 會被更新到當時時間。如果下次檢查時間 (Next check after) 舊於當時時間,fsck 就會檔案系統對進行例行的完整檢查工作了。檢查工作成功完成後,最後檢查時間會更新至當前時間,下次檢查時間 (Next check after) 亦會自動更新至最後檢查時間 + 最大檢查間距

要改變檔案系統的最後檢查時間,可以使用 tune2fs 命令的 -T YYYYMMDD [HHMM[SS]] 選項:

tune2fs -T 20080930 093010 /dev/sda5

要改變檔案系統的檢查間距,可以使用 tune2fs 命令的 -i interval-between-checks[d|m|y] 選項。例如要把 /dev/sda5 的檢查間距設定為 3 個月,可以使用命令:

tune2fs -i 3m /dev/sda5

參考資料

  1. Hagen, William von (2001). “Linux Filesystems”. Sams Publishing. ISBN 06-723-2272-2

請參看

外部連結

Personal tools