跳转到内容

fsck

来自 Arch Linux 中文维基

本文或本节需要翻译。要贡献翻译,请访问简体中文翻译团队

附注: 需要翻译。(在 Talk:Fsck# 中讨论)

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 钩子在 iniramfs 中运行 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 — 所有要检查的其他文件系统。

Troubleshooting[编辑 | 编辑源代码]

Can't run fsck on a separate /usr partition[编辑 | 编辑源代码]

  1. Make sure you have the required hooks in /etc/mkinitcpio.conf and that you remembered to re-generate your initramfs image after editing this file.
  2. Check your fstab! Only the root partition needs 1 at the end, everything else should have either 2 or 0. Carefully inspect it for other typos, as well.

ext2fs: no external journal[编辑 | 编辑源代码]

There are times (due to power failure) in which an ext(3/4) file system can corrupt beyond normal repair. Normally, there will be a prompt from fsck indicating that it cannot find an external journal. In this case, run the following commands:

Unmount the partition based on its directory

# umount directory

Write a new journal to the partition

# tune2fs -j /dev/partition

Run an fsck to repair the partition

# fsck -p /dev/partition