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 的傳回值所代表的意義:

  • 0:沒有錯誤。
  • 1:檔案系統錯誤已修正。
  • 2:系統需要重新開機。
  • 4:檔案系統錯誤未修正。
  • 8:操作錯誤。
  • 16:使用方式錯誤。
  • 32:使用者取消執行。
  • 128:共享函式庫(shared library)錯誤。

不同的檔案系統

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

強制檢查 Clean 的檔案系統

每當檔案系統被掛載成讀寫模式(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

這裡的 Moviestest 的檔案屬性有問題。

如果加上 -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 StuffDebian WikiMTE