fsck
fsck 代表 "file system check"(文件系统检查),用于检查并可选地修复一个或多个 Linux 文件系统。通常,fsck 程序会尝试并行处理不同物理磁盘驱动器上的文件系统,以减少检查所有文件系统所需的总时间(参见 fsck(8))。
Arch Linux 引导过程会方便地为您处理 fsck 程序,并在每次引导时自动检查驱动器上的所有相关分区。因此,通常无需诉诸于命令行。
引导时检查
机制
这里涉及两个参与者
- mkinitcpio 通过
fsck钩子为您提供了在挂载根文件系统之前对其进行 fsck 的选项。如果您这样做,应通过相应的rw内核参数将根目录挂载为读写模式。[1] - systemd 将对所有 fsck 传递次数(pass number)大于 0 的文件系统执行 fsck(无论是通过 #fstab 选项 还是 用户提供的单元文件)。对于根文件系统,它必须最初使用内核参数
ro挂载为只读,然后才根据 fstab 重新挂载为读写(请注意,defaults挂载选项隐含了rw)。
第一种方案是推荐的默认设置,也是您按照 安装指南 操作后得到的结果。如果您想选择方案 2,则应从 mkinitcpio.conf 中移除 fsck 钩子,并在内核命令行中使用 ro。可以使用内核参数 fsck.mode=skip 来确保两种方案都完全禁用 fsck。
强制检查
如果您使用 base mkinitcpio 钩子,可以通过传递 fsck.mode=force 作为 内核参数 来强制在引导时进行 fsck。这将检查机器上的每个文件系统。
或者,systemd 提供了 systemd-fsck@.service(8),它会检查所有已配置但未在 initramfs 中检查的文件系统。然而,以这种方式检查根文件系统会导致引导过程延迟,因为文件系统必须重新挂载。
forcefsck 的文件,或使用带有 -F 标志的 shutdown 命令等技巧,仅适用于旧的 SysVinit 和早期版本的 Upstart,在 systemd 中不再起作用。因此,上述解决方案是 Arch Linux 中唯一有效的方法。自动对所有修复问题回答“是”
引导时的 fsck 检查可能会提示 "UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY."(出现意外的不一致;请手动运行 fsck)。
当您需要对文件系统应用一些不被认为完全安全地修复更改时,就会发生这种情况,因此需要手动运行 fsck。
您可以通过将内核命令行选项 fsck.repair 设置为 yes,来让 fsck 自动应用所有建议的更改(即对所有问题回答“是”)。(其他可能的值为 no 和 preen。)请查阅文档 systemd-fsck@.service(8) 以了解这些选项的含义。
技巧与提示
尝试修复损坏的数据块
要自动修复 ext2/ext3/ext4 或 FAT 文件系统 的损坏部分,请运行
# fsck -a
交互式修复损坏的数据块
当引导分区上的文件发生更改且日志未能正确更新时,此操作很有用。在这种情况下,请卸载引导分区并运行以下代码来修复损坏的部分
# fsck -r drive
更改检查频率
默认情况下,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
有时(由于电源故障),ext(3/4) 文件系统可能会损坏到无法通过常规方式修复。通常,fsck 会提示找不到外部日志。在这种情况下,请运行以下命令
根据目录卸载分区
# umount directory
向分区写入新日志
# tune2fs -j /dev/partition
运行 fsck 修复分区
# fsck -p /dev/partition