fsck
fsck 代表 “文件系统检查 (file system check)”,它用于检查和(可选)修复一个或多个 Linux 文件系统。通常,fsck 程序会尝试并行处理不同物理磁盘驱动器上的文件系统,以减少检查所有文件系统所需的总时间(参见 fsck(8))。
Arch Linux 启动过程 会为您方便地处理 fsck 过程,并在每次启动时自动检查驱动器上的所有相关分区。因此,通常不需要求助于命令行。
启动时检查
机制
涉及两个参与者
- mkinitcpio 为您提供了一个选项,即在通过
fsck
钩子挂载根文件系统之前对其进行 fsck。 如果您这样做,您应该通过适当的rw
内核参数以读写方式挂载根目录。[1] - systemd 将 fsck 所有文件系统,这些文件系统的 fsck 通过号大于 0(通过 #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.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: 没有外部日志
有时(由于电源故障),ext(3/4) 文件系统可能会损坏到超出正常修复的程度。 通常,fsck 会提示它找不到外部日志。 在这种情况下,运行以下命令
根据目录卸载分区
# umount directory
向分区写入新日志
# tune2fs -j /dev/partition
运行 fsck 以修复分区
# fsck -p /dev/partition