fsck

来自 ArchWiki

fsck 代表 “文件系统检查 (file system check)”,它用于检查和(可选)修复一个或多个 Linux 文件系统。通常,fsck 程序会尝试并行处理不同物理磁盘驱动器上的文件系统,以减少检查所有文件系统所需的总时间(参见 fsck(8))。

Arch Linux 启动过程 会为您方便地处理 fsck 过程,并在每次启动时自动检查驱动器上的所有相关分区。因此,通常不需要求助于命令行。

启动时检查

机制

涉及两个参与者

  1. mkinitcpio 为您提供了一个选项,即在通过 fsck 钩子挂载根文件系统之前对其进行 fsck。 如果您这样做,您应该通过适当的 rw 内核参数以读写方式挂载根目录。[1]
  2. 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 中检查。 但是,以这种方式检查根文件系统会导致启动过程延迟,因为文件系统必须重新挂载。

此文章或章节需要扩充。

原因:是否可以使用 systemd 钩子从 initramfs 运行 fsck? (在 Talk:Fsck 中讨论)
注意: 对于那些习惯使用其他 GNU/Linux 发行版的人来说,旧的技巧包括在每个文件系统的根目录中写入名为 forcefsck 的文件,或者使用带有 -F 标志的 shutdown 命令,这些技巧仅适用于旧的 SysVinit 和早期版本的 Upstart,并且不适用于 systemd。 因此,上述解决方案是唯一适用于 Arch Linux 的解决方案。

自动回答所有修复问题为“是”

启动时 fsck 检查可能会最终显示 “UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.”

当您需要应用一些更改来修复文件系统,但这些更改被认为不是完全安全时,就会发生这种情况,因此需要手动运行 fsck

您可以通过将 fsck.repair 内核命令行选项设置为 yes,将 fsck 设置为自动应用所有建议的更改(即,对所有问题回答“是”)。 (其他可能的值为 nopreen。)查看文档 systemd-fsck@.service(8) 以了解这些选项的含义。

技巧与诀窍

尝试修复损坏的块

要自动修复 ext2/ext3/ext4 或 FAT 文件系统 的损坏部分,请运行

警告: 这不会询问您是否要修复它,因为当您运行它时,答案是
# fsck -a

交互式修复损坏的块

当启动分区上的文件已更改,并且日志未能正确更新时,这很有用。 在这种情况下,卸载启动分区,并运行以下代码来修复损坏的部分

# fsck -r drive

更改检查频率

注意: 以下命令 tune2fsdumpe2fs 仅适用于 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: 没有外部日志

有时(由于电源故障),ext(3/4) 文件系统可能会损坏到超出正常修复的程度。 通常,fsck 会提示它找不到外部日志。 在这种情况下,运行以下命令

根据目录卸载分区

# umount directory

向分区写入新日志

# tune2fs -j /dev/partition

运行 fsck 以修复分区

# fsck -p /dev/partition