Linux 的 fsck
指令可以用來檢測或修復檔案系統,這裡蒐集了許多實用的範例。
fsck
是 Linux 系統中常會使用到的硬碟檢測工具,它可以檢查檔案系統是否有錯誤,並且嘗試修復它,通常 Linux 系統每間隔一段時間就會自動使用 fsck
檢查一次檔案系統,而在平常如果檔案系統出問題時,管理者也會需要用到這個指令來處理這類的問題。
fsck
的使用範例,透過這些例子可以很快了解如何使用 fsck
來檢查自己的硬碟資料,並且修正錯誤。
在執行 fsck
時,請先確定硬碟是處於沒有被掛載(mount)的狀態下,以避免資料損毀的風險。
首先以 parted
察看磁碟分割表:
parted /dev/sda 'print'
輸出為
Number Start End Size Type File system Flags 1 1049kB 106MB 105MB primary fat16 diag 2 106MB 15.8GB 15.7GB primary ntfs boot 3 15.8GB 266GB 251GB primary ntfs 4 266GB 500GB 234GB extended 5 266GB 466GB 200GB logical ext4 6 467GB 486GB 18.3GB logical ext2 7 487GB 499GB 12.0GB logical fat32 lba
若要檢查 /dev/sda6
的檔案系統,則執行:
fsck /dev/sda6
輸出為
fsck from util-linux 2.20.1 e2fsck 1.42 (29-Nov-2011) /dev/sda6: clean, 95/2240224 files, 3793506/4476416 blocks
下面這些是各種 fsck
的傳回值所代表的意義:
fsck
在執行時會依照不同的檔案系統,呼叫對應的內部檢查指令,這些對應的內部指令一般都放在 /sbin
下面。
cd /sbin ls fsck*
輸出為
fsck fsck.ext2 fsck.ext4 fsck.minix fsck.nfs fsck.cramfs fsck.ext3 fsck.ext4dev fsck.msdos fsck.vfat
從這些 fsck
的內部指令就可以看出來它支援哪些檔案系統,如果遇到不支援的檔案系統,它就會出現錯誤訊息,例如 ntfs:
fsck /dev/sda2
輸出為
fsck from util-linux 2.20.1 fsck: fsck.ntfs: not found fsck: error 2 while executing fsck.ntfs for /dev/sda2
如果想要一次檢查系統中所有的檔案系統,可以在執行 fsck
時加上 -A
參數,這樣它就會依照 /etc/fstab
中的 fs_passno
所指定的順序來檢查(如果 fs_passno
的值為 0
則跳過)。
下面這個是 /etc/fstab
的內容:
## proc /proc proc nodev,noexec,nosuid 0 0 ## / was on /dev/sda5 during installation /dev/sda5 / ext4 errors=remount-ro 0 1 ## /mydata was on /dev/sda6 during installation /dev/sda6 /mydata ext2 defaults 0 2 ## /backup was on /dev/sda7 during installation /dev/sda7 /backup vfat defaults 2 3
其中最後一個欄位就是 fs_passno
,當執行
fsck -A
的時候,就會依照 fs_passno
數值的順序來檢查。在檢查所有的檔案系統時,建議加上 -R
參數,跳過根目錄所在的檔案系統。
fsck -AR -y
輸出為
fsck from util-linux 2.20.1 e2fsck 1.42 (29-Nov-2011) /dev/sda6: clean, 95/2240224 files, 3793506/4476416 blocks dosfsck 3.0.12, 29 Oct 2011, FAT32, LFN /dev/sda7: 8 files, 50/1463400 clusters
這裡的 -y
參數,請參考下面的教學。
在使用 -A
參數時,可以配合 -t
參數,指定要檢查的檔案系統類型,在這種情況下,fsck
就只會針對該類型的檔案系統進行檢查,如果不是屬於該類型的檔案系統則會被忽略。
如果只要檢查 ext2 這個類型的檔案系統,則執行:
fsck -AR -t ext2 -y
輸出為
fsck from util-linux 2.20.1 e2fsck 1.42 (29-Nov-2011) /dev/sda6: clean, 11/2240224 files, 70327/4476416 blocks
由於所有的分割區中,只有 /dev/sda6
是屬於 ext2 的檔案系統,所以 fsck
只會檢查這個分割區。
如果要排除某檔案系統類型,可以使用 no
來排除指定的類型,例如:
fsck -AR -t noext2 -y
就會排除 ext2
這個類型,輸出為
fsck from util-linux 2.20.1 dosfsck 3.0.12, 29 Oct 2011, FAT32, LFN /dev/sda7: 0 files, 1/1463400 clusters
使用 -M
參數可以讓 fsck
自動跳過系統上已經掛載的檔案系統,這樣可以避免不小心處理到已經掛載的分割區。
我們可以使用
mount | grep "/dev/sd*"
查看系統上各個檔案系統掛載的狀況
/dev/sda5 on / type ext4 (rw,errors=remount-ro) /dev/sda6 on /mydata type ext2 (rw) /dev/sda7 on /backup type vfat (rw)
根據這裡的資訊,/dev/sda7
是一個已經被掛載的檔案系統,如果這時候對這個分割區執行
fsck -M /dev/sda7
就不會有任何動作,而其傳回值為 0
。
echo $?
輸出為
0
預設的狀況下,fsck
在一開始執行的時候,會輸出一些基本的訊息,例如
fsck from util-linux 2.20.1
如果要避免這類的輸出,可以加上 -T
參數:
fsck -TAR
輸出為
e2fsck 1.42 (29-Nov-2011) /dev/sda6 is mounted. e2fsck: Cannot continue, aborting. dosfsck 3.0.12, 29 Oct 2011, FAT32, LFN /dev/sda7: 8 files, 50/1463400 clusters
每當檔案系統被掛載成讀寫模式(rw)時,檔案系統狀態會被設定為 not-clean,而在檔案系統被成功卸載後,其狀態就會被設定回 clean。所以檔案系統沒有被成功卸載或者運作中途系統被中斷等,狀態就會維持在 not-clean,當檔案系統下次被檢查時,就可以由檔案系統狀態得知檔案系統是否有被正常卸載。
在預設的狀況下,fsck
只會對狀態為 not-clean 的檔案系統進行檢查,如果碰到狀態為 clean 的檔案系統,就會很快地跳過:
fsck /dev/sda6
輸出為
fsck from util-linux 2.20.1 e2fsck 1.42 (29-Nov-2011) /dev/sda6: clean, 95/2240224 files, 3793503/4476416 blocks
如果想要讓它檢查 clean 的檔案系統,可以加上 -f
參數:
fsck -f /dev/sda6
輸出為
fsck from util-linux 2.20.1 e2fsck 1.42 (29-Nov-2011) 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/sda6: 95/2240224 files (7.4% non-contiguous), 3793503/4476416 blocks
假設 /dev/sda6
中有一些檔案出問題:
mount /dev/sda6 /mydata cd /mydata ls -li
輸出為
ls: cannot access test: Input/output error total 72 49061 -rw-r--r-- 1 root root 8 Aug 21 21:50 1 49058 -rw-r--r-- 1 root root 36864 Aug 21 21:24 file_with_holes 49057 -rw-r--r-- 1 root root 8192 Aug 21 21:23 fwh 11 drwxr-xr-x 2 root root 49152 Aug 19 00:29 lost+found 2060353 ?rwSr-S-wT 16 root root 4096 Aug 21 21:11 Movies ? -????????? ? ? ? ? ? test
這裡的 Movies
與 test
的檔案屬性有問題。
如果加上 -y
參數,則在偵測到錯誤時,所有的問題都會以 yes
回答,進行修復:
fsck -y /dev/sda6
輸出為
fsck from util-linux 2.20.1 e2fsck 1.42 (29-Nov-2011) /dev/sda6 contains a file system with errors, check forced. Pass 1: Checking inodes, blocks, and sizes Inode 2060353 is a unknown file type with mode 0137642 but it looks like it is really a directory. Fix? yes Pass 2: Checking directory structure Entry 'test' in / (2) has deleted/unused inode 49059. Clear? yes Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/sda6: ***** FILE SYSTEM WAS MODIFIED ***** /dev/sda6: 96/2240224 files (7.3% non-contiguous), 3793508/4476416 blocks
如果不想修復任何的問題,只想得到問題的資訊,可以加上 -n
,讓所有的問題都以 no
回答。
假設 /dev/sda6
的資料有些問題:
mount /dev/sda6 /mydata cd /mydata ls -lrt
輸出為
total 64 drwxr-xr-x 2 root root 49152 Aug 19 00:29 lost+found ?--xrwx-wx 16 root root 4096 Aug 21 21:11 Movies ?-----x-wx 1 root root 8192 Aug 21 21:23 fwh -rw-r--r-- 1 root root 36864 Aug 21 21:24 file_with_holes -rw-r--r-- 1 root root 8 Aug 21 21:50 1
如果只想要得到問題的資訊,而不想直接修復,則執行:
fsck -n /dev/sda6
輸出為
fsck from util-linux 2.20.1 e2fsck 1.42 (29-Nov-2011) /dev/sda6 contains a file system with errors, check forced. Pass 1: Checking inodes, blocks, and sizes Inode 2060353 is a unknown file type with mode 0173 but it looks like it is really a directory. Fix? no Inode 2060353, i_blocks is 8, should be 0. Fix? no Pass 2: Checking directory structure Inode 2060353 (/Movies) has invalid mode (0173). Clear? no Inode 49057 (/fwh) has invalid mode (013). Clear? no Entry 'fwh' in / (2) has an incorrect filetype (was 1, should be 0). Fix? no Pass 3: Checking directory connectivity Unconnected directory inode 65409 (???) Connect to /lost+found? no '..' in ... (65409) is ??? (2060353), should be (0). Fix? no Unconnected directory inode 2076736 (???) Connect to /lost+found? no Pass 4: Checking reference counts Inode 2 ref count is 4, should be 3. Fix? no Inode 65409 ref count is 3, should be 2. Fix? no Inode 2060353 ref count is 16, should be 15. Fix? no Unattached inode 2060354 Connect to /lost+found? no Pass 5: Checking group summary information Block bitmap differences: -(164356--164357) -4149248 Fix? no Directories count wrong for group #126 (1, counted=0). Fix? no /dev/sda6: ********** WARNING: Filesystem still has errors ********** /dev/sda6: 96/2240224 files (7.3% non-contiguous), 3793508/4476416 blocks
如果要讓 fsck
自動修復偵測到的問題,可以加上 -a
參數:
fsck -a -AR
這樣就會自動修復那些比較沒有風險的問題。如果遇到需要管理者確認的問題,fsck
就會輸出這樣的訊息:
fsck -a /dev/sda6
輸出為
fsck from util-linux 2.20.1 /dev/sda6 contains a file system with errors, check forced. /dev/sda6: Inode 2060353 is a unknown file type with mode 0173 but it looks like it is really a directory. /dev/sda6: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY. (i.e., without -a or -p options)
並且傳回 4
:
echo $?
輸出為
4
如果遇到這樣的狀況,可以使用上面介紹的 -y
參數:
fsck -y /dev/sda6
輸出為
fsck from util-linux 2.20.1 e2fsck 1.42 (29-Nov-2011) /dev/sda6 contains a file system with errors, check forced. Pass 1: Checking inodes, blocks, and sizes Inode 2060353 is a unknown file type with mode 0173 but it looks like it is really a directory. Fix? yes Pass 2: Checking directory structure Inode 49057 (/fwh) has invalid mode (013). Clear? yes Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information Block bitmap differences: -(164356--164357) Fix? yes Free blocks count wrong for group #5 (0, counted=2). Fix? yes Free blocks count wrong (682908, counted=682910). Fix? yes /dev/sda6: ***** FILE SYSTEM WAS MODIFIED ***** /dev/sda6: 95/2240224 files (7.4% non-contiguous), 3793506/4476416 blocks
參考資料:The Geek Stuff、Debian Wiki、MTE