fsck(file system check,文件系統(tǒng)檢查)用于處理可能損壞的文件系統(tǒng),本文對(duì)該命令做個(gè)簡(jiǎn)單介紹。
一般來(lái)說(shuō),有這么幾種情況,你可能會(huì)用到 fsck 命令:系統(tǒng)無(wú)法啟動(dòng),設(shè)備(外部驅(qū)動(dòng)器或存儲(chǔ)設(shè)備)運(yùn)行不正常,或者有文件損壞的情況等。
fsck 實(shí)際上是許多文件系統(tǒng)特定檢查器的“前端”,比如 fsck.vfat, fsck.ext2 等。使用 fsck 的時(shí)候不需要指定具體使用的是哪個(gè)檢查器。
fsck 命令簡(jiǎn)介
fsck 命令與大多數(shù) Linux 命令的結(jié)構(gòu)相同,如下為其使用方式:
fsck [options] [filesystem]
如果未指定文件系統(tǒng),系統(tǒng)將分析你的 fstab 文件(/etc/fstab)以查找要掃描的設(shè)備。另外,需要使用 root 用戶或者 sudo 來(lái)運(yùn)行該命令。
我們可以使用 fdisk 或 df 命令列出 Linux 中的硬盤(pán)驅(qū)動(dòng)器,然后就可以使用 fsck 命令來(lái)指定要檢查的設(shè)備了。
Disk /dev/nvme0n1: 238.49 GiB, 256060514304 bytes, 500118192 sectors
Disk model: THNSN5256GPUK NVMe TOSHIBA 256GB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 014A45DC-22A2-4FC0-BEEA-25A6F2406380
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 1050623 1048576 512M EFI System
/dev/nvme0n1p2 1050624 98563270 97512647 46.5G Linux filesystem
/dev/nvme0n1p3 98564096 500117503 401553408 191.5G Linux filesystem
在運(yùn)行 fsck 之前卸載設(shè)備
不要在已安裝或掛載的設(shè)備上運(yùn)行 fsck ,否則的話會(huì)損壞文件。所以在運(yùn)行 fsck 之前需要先卸載設(shè)備。
如果你嘗試在已安裝的設(shè)備上運(yùn)行 fsck,會(huì)看到如下錯(cuò)誤:
$ sudo fsck /dev/sda3
fsck from util-linux 2.34
e2fsck 1.45.5 (07-Jan-2020)
/dev/sda3 is mounted.
e2fsck: Cannot continue, aborting.
而在正常的驅(qū)動(dòng)器上運(yùn)行 fsck,輸出是這樣的:
$ sudo fsck /dev/sda2
fsck from util-linux 2.34
fsck.fat 4.1 (2017-01-24)
/dev/sda2: 5 files, 1967/1972 clusters
雖然 fsck 命令接受設(shè)備名稱(比如 /dev/sda)作為參數(shù),但是你可以選擇輸入 UUID,以免將已安裝的和卸載的設(shè)備混淆。UUID是分配給設(shè)備的固定值,不會(huì)受這些系統(tǒng)更改的影響。
fsck 命令的退出代碼
如下是使用 fsck 檢查磁盤(pán)后返回的一個(gè)代碼列表。如果分析一個(gè)磁盤(pán),退出代碼是這些代碼的總和,如果在多個(gè)設(shè)備上使用 fsck,那么返回的是兩個(gè)和的邏輯或(OR,||)。
- 0 - 沒(méi)有報(bào)錯(cuò);
- 1 - 文件系統(tǒng)錯(cuò)誤已更正;
- 2 - 應(yīng)重新啟動(dòng)系統(tǒng);
- 4 - 未更正的文件系統(tǒng)錯(cuò)誤;
- 8 - 操作錯(cuò)誤;
- 16 - 用法或語(yǔ)法錯(cuò)誤;
- 32 - 用戶請(qǐng)求取消了 fsck
- 128 - 共享庫(kù)錯(cuò)誤。
你可以使用 echo $? 來(lái)檢查上次運(yùn)行命令的退出代碼。
fsck 命令的應(yīng)用
上述我們對(duì) fsck 做了一個(gè)基本的介紹,下面我們來(lái)看看這個(gè)命令的使用。
修復(fù)USB磁盤(pán)和其他可移動(dòng)設(shè)備
作為演示,我們假定有問(wèn)題(待檢查)的設(shè)備為 /dev/sdb。
首先,我們需要確保驅(qū)動(dòng)器已卸載:
sudo umount /dev/sdb
然后運(yùn)行 fsck 命令:
sudo fsck /dev/sdb
檢查是否有錯(cuò)誤輸出,如果沒(méi)有顯示任何信息,可使用 echo $? 來(lái)檢查退出代碼。
我們可以添加一些選項(xiàng),允許命令進(jìn)行自動(dòng)更正。但是這些命令沒(méi)有進(jìn)行標(biāo)準(zhǔn)化,所以在使用前需要驗(yàn)證文件系統(tǒng)并比較 man 手冊(cè)中的描述信息。
盡管如此,通常我們可以使用 -p 選項(xiàng)來(lái)讓 fsck 自動(dòng)修復(fù):
sudo fsck -p /dev/sdb
類似的,-y 選項(xiàng)可以對(duì)檢測(cè)到的任何損壞的文件系統(tǒng)進(jìn)行更正。
修復(fù)根文件系統(tǒng)
當(dāng)系統(tǒng)處于活動(dòng)(active)狀態(tài)時(shí),我們無(wú)法卸載 root 分區(qū)。如果我們懷疑主文件系統(tǒng)已損壞,那就需要使用其他的方法了。
對(duì)于這種情況,有幾個(gè)方案可以使用。比如可以在系統(tǒng)啟動(dòng)時(shí),在救援模式(rescue mode)下運(yùn)行 fsck,或者使用恢復(fù)主題的引導(dǎo)盤(pán)(recovery-themed live cd)。
許多 Linux 發(fā)行版,在經(jīng)過(guò)幾次系統(tǒng)啟動(dòng)失敗后,重新啟動(dòng)時(shí)會(huì)自動(dòng)強(qiáng)制 fsck。如果你喜歡自己動(dòng)手,可以手動(dòng)設(shè)置“幾次”這個(gè)數(shù)值。
大多數(shù)現(xiàn)代 Linux 版本都有一個(gè)名為 tune2fs 的工具,假如你的 root 設(shè)備為 /dev/sda,可以使用如下命令:
sudo tune2fs -c 1 /dev/sda
上述命令是對(duì)系統(tǒng)設(shè)置的更改,設(shè)置為每 **n **次(上述例子中為 1 )引導(dǎo)(系統(tǒng)啟動(dòng)),運(yùn)行一次 fsck。你還可以將其設(shè)置為標(biāo)準(zhǔn)的時(shí)間間隔,單位可以設(shè)置為 天、周或月 。
假如我們希望在任何時(shí)間啟動(dòng)系統(tǒng)時(shí),如果一周內(nèi)沒(méi)有檢查,就運(yùn)行 fsck。那么可以使用 -i 選項(xiàng)來(lái)指定時(shí)間間隔,如下:
sudo tune2fs -i 1w /dev/sda
如果你使用的是 systemd,則可以通過(guò)輸入以下命令在下次啟動(dòng)時(shí)強(qiáng)制運(yùn)行 fsck:
fsck.mode=force
fsck.repair=yes
關(guān)于 fsck 的更多信息,大家可以參考 man 手冊(cè),在終端中運(yùn)行 man fsck 即可。
審核編輯:劉清
-
驅(qū)動(dòng)器
+關(guān)注
關(guān)注
52文章
8102瀏覽量
145828 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
590瀏覽量
27318 -
UUID
+關(guān)注
關(guān)注
0文章
22瀏覽量
8094
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論