跳至內容
出自 Arch Linux 中文维基

fsck「file system check」 的縮寫,意為「文件系統檢查」,用於檢查 Linux 上的文件系統並嘗試修復發現的錯誤。通常,fsck 會並行檢查不同物理磁碟上的文件系統來節省時間(請參閱 fsck(8))。

Arch 的啟動流程中,fsck 會在您每次開機時自動檢查相關的驅動器,因此您無需使用命令行。

啟動時檢查

方式

提示:本小節中所有的「檢查」(共兩處)在英文原文中均為動詞 「fsck」,而 fsck 本身則包含「檢查並嘗試修復」之意,為保證語句通順譯為「檢查」,請知悉。

有兩種方式:

  1. mkinitcpio 為您提供了一個選擇,即在掛載您的根文件系統前使用 fsck 鉤子檢查它。若如此做,您應當用 rw 內核參數將根文件系統掛載為可讀寫[1]
  2. systemd 會檢查所有 fsck 選項大於 0 的文件系統(使用 fstab 選項用戶提供的單元文件)。對於根文件系統,其必須在開始時被使用 ro 內核參數被掛載為只讀,然後再通過 fstab 被重新掛載為可讀寫(請注意 defaults 掛載選項包含 rw)。

推薦第一種方式,若您遵循了安裝指南,則會默認這樣。若您想使用第二種方式,您應當從 mkinitcpio.conf 中移除 fsck 鉤子並在內核命令行中使用 ro。使用 fsck.mode=skip 內核參數可在兩種做法中完全禁用 fsck

強制檢查

如果您使用 basemkinitcpio 鉤子,您可以向內核傳遞 fsck.mode=force 內核參數以在啟動時強制執行 fsck,這會檢查您的設備上的每一個文件系統。

此外,systemd 提供了 systemd-fsck@.service(8),用於檢查已配置的文件系統,且不在 initramfs 中執行。然而,用這種方法檢測根文件系統會推遲啟動流程,因為要重新掛載根文件系統。

這篇文章的某些內容需要擴充。

原因:有可能使用 systemd 鉤子在 initramfs 中運行 fsck 嗎? (在 Talk:Fsck 中討論)
注意:習慣使用其他 GNU/Linux 發行版的用戶可能會習慣向每個文件系統寫入 forcefsck 文件或使用 shutdown -F 關機命令等舊方法,但它們僅適用於 SysVinit 和早期版本的 Upstart,但不適用於 systemd。因此上述方法是 Arch Linux 上唯一的解決方法。

在修復詢問中自動回答 yes

啟動時的 fsck 檢查可能會停止並返回 "UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY."

當您需要允許某些更改以修復系統,而這些更改並不被認為是完全安全的時候,它就會發生。因此需要手動執行 fsck

您可以通過將 fsck.repair 內核命令行選項設為 yes 來讓 fsck 自動接受所有建議的更改(即對所有問題回答 yes)。

提示:其他可能的值為 nopreen,參閱 systemd-fsck@.service(8) 以獲取這些選項的意義。

提示和技巧

嘗試修復壞塊

欲自動修復 ext2/ext3/ext4 或 FAT 文件系統上損壞的部分,請執行:

警告:這條命令不會詢問您是否修復,當您運行它時,回答就已經是 yes。
# fsck -a

交互式地修復壞塊

這在 boot 分區上的文件被改動而日誌未能正確更新時會很有用。在這種情況下,請取消掛載 boot 分區,然後執行以下命令以修復損壞的部分:

# fsck -r 设备

更改檢查頻率

注意:本小節的 tune2fs 命令和 dumpe2fs 命令僅在 ext2/ext3/ext4 文件系統上工作。

默認情況下,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

  1. 確保您的 /etc/mkinitcpio.conf 文件中配置了需要的鉤子,並在編輯該文件後重新生成了 initramfs。
  2. 檢查您的 fstab!只有根分區的最後一項需要是 1,其他的都是 20。檢查是否存在其他拼寫錯誤。

「ext2fs: no external journal」 報錯

有時候 ext3/ext4 文件系統可能會損壞(由於電源故障)。通常,fsck 會提示 no external journal(無外部日誌),在這種情況下,請運行以下命令:

將該分區從其掛載點取消掛載:

# umount directory

向該分區寫入新日誌:

# tune2fs -j /dev/partition

運行 fsck 以修復該分區:

# fsck -p /dev/partition