fsck 是 「file system check」 的縮寫,意為「文件系統檢查」,用於檢查 Linux 上的文件系統並嘗試修復發現的錯誤。通常,fsck 會並行檢查不同物理磁碟上的文件系統來節省時間(請參閱 fsck(8))。
在 Arch 的啟動流程中,fsck 會在您每次開機時自動檢查相關的驅動器,因此您無需使用命令行。
啟動時檢查
方式
有兩種方式:
- mkinitcpio 為您提供了一個選擇,即在掛載您的根文件系統前使用
fsck
鉤子檢查它。若如此做,您應當用rw
內核參數將根文件系統掛載為可讀寫[1]。 - systemd 會檢查所有 fsck 選項大於 0 的文件系統(使用 fstab 選項或用戶提供的單元文件)。對於根文件系統,其必須在開始時被使用
ro
內核參數被掛載為只讀,然後再通過 fstab 被重新掛載為可讀寫(請注意defaults
掛載選項包含rw
)。
推薦第一種方式,若您遵循了安裝指南,則會默認這樣。若您想使用第二種方式,您應當從 mkinitcpio.conf
中移除 fsck
鉤子並在內核命令行中使用 ro
。使用 fsck.mode=skip
內核參數可在兩種做法中完全禁用 fsck。
強制檢查
如果您使用 base
的 mkinitcpio 鉤子,您可以向內核傳遞 fsck.mode=force
內核參數以在啟動時強制執行 fsck,這會檢查您的設備上的每一個文件系統。
此外,systemd 提供了 systemd-fsck@.service(8),用於檢查已配置的文件系統,且不在 initramfs 中執行。然而,用這種方法檢測根文件系統會推遲啟動流程,因為要重新掛載根文件系統。
forcefsck
文件或使用 shutdown -F
關機命令等舊方法,但它們僅適用於 SysVinit 和早期版本的 Upstart,但不適用於 systemd。因此上述方法是 Arch Linux 上唯一的解決方法。在修復詢問中自動回答 yes
啟動時的 fsck 檢查可能會停止並返回 "UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY."
。
當您需要允許某些更改以修復系統,而這些更改並不被認為是完全安全的時候,它就會發生。因此需要手動執行 fsck。
您可以通過將 fsck.repair
內核命令行選項設為 yes
來讓 fsck
自動接受所有建議的更改(即對所有問題回答 yes)。
提示和技巧
嘗試修復壞塊
欲自動修復 ext2/ext3/ext4 或 FAT 文件系統上損壞的部分,請執行:
# fsck -a
交互式地修復壞塊
這在 boot 分區上的文件被改動而日誌未能正確更新時會很有用。在這種情況下,請取消掛載 boot 分區,然後執行以下命令以修復損壞的部分:
# fsck -r 设备
更改檢查頻率
默認情況下,fsck 每 30 次啟動檢查一次文件系統(不同分區獨立計數)。要更改檢查頻率,請執行:
# tune2fs -c 20 /dev/sda1
在本例中,20
是相鄰兩次檢查之間的啟動次數。
請注意 1
會在每次啟動時都執行檢查,而 0
會完全停止檢查。
欲查看某分區的檢查頻率和掛載次數,請執行:
# dumpe2fs -h /dev/sda1 | grep -i 'mount count'
fstab 選項
fstab 是一個系統配置文件,用於告訴 Linux 內核將哪些分區(文件系統)掛載到文件系統樹的哪裡。
一個典型的 /etc/fstab
條目可能看起來像這樣:
/dev/sda1 / ext4 defaults 0 1 /dev/sda2 /other ext4 defaults 0 2 /dev/sda3 /win ntfs-3g defaults 0 0
第 6 列(粗體文字)是 fsck 選項。
-
0
— 不檢查 -
1
— 要檢查的第一個文件系統(分區),/
(根分區)應當被設為1
。 -
2
— 所有要檢查的其他文件系統。
疑難解答
無法在獨立的 /usr 分區上運行 fsck
- 確保您的
/etc/mkinitcpio.conf
文件中配置了需要的鉤子,並在編輯該文件後重新生成了 initramfs。 - 檢查您的 fstab!只有根分區的最後一項需要是
1
,其他的都是2
或0
。檢查是否存在其他拼寫錯誤。
「ext2fs: no external journal」 報錯
有時候 ext3/ext4 文件系統可能會損壞(由於電源故障)。通常,fsck 會提示 no external journal
(無外部日誌),在這種情況下,請運行以下命令:
將該分區從其掛載點取消掛載:
# umount directory
向該分區寫入新日誌:
# tune2fs -j /dev/partition
運行 fsck 以修復該分區:
# fsck -p /dev/partition