在 Linux 中使用 fsck 命令检查和修复文件系统错误

有时不好的事情会发生在好的系统上。

幸运的是,您是 Linux 用户,并且您拥有 fsck (文件系统检查)以帮助处理可能损坏的文件系统。 此实用程序用于检查和(可选)修复文件系统。

在几种情况下,您可能想要使用 fsck。 通常,如果您的系统无法启动、设备(外部驱动器或存储介质)无法正常运行,或者您已经看到文件损坏的证据,您可能需要运行此命令。

fsck 实际上是许多文件系统特定检查器(如 fsck.vfat、fsck.ext2 等)的“前端”。这些不需要指定,但您可以在 man 中找到更高级的选项这些更精确的命令的页面。

fsck 命令简介

fsck 命令遵循与大多数 Linux 命令类似的模式。

fsck [options] [filesystem]

如果你没有指定文件系统,系统会分析你的 fstab 文件 (/etc/fstab) 用于扫描设备。

您将需要以 root 用户身份运行该命令或将其与 sudo.

您可以使用 fdisk 或 df 命令列出 Linux 中的硬盘驱动器。 这样,您可以使用 fsck 命令指定要检查的设备。

Disk /dev/nvme0n1: 238.49 GiB, 256060514304 bytes, 500118192 sectors
Disk model: THNSN5256GPUK NVMe TOSHIBA 256GB        
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 014A45DC-22A2-4FC0-BEEA-25A6F2406380

Device            Start       End   Sectors   Size Type
/dev/nvme0n1p1     2048   1050623   1048576   512M EFI System
/dev/nvme0n1p2  1050624  98563270  97512647  46.5G Linux filesystem
/dev/nvme0n1p3 98564096 500117503 401553408 191.5G Linux filesystem

在运行 fsck 之前卸载设备

不要在已挂载的设备上运行 fsck,您需要先卸载目标以避免损坏文件。

如果您尝试在已安装的设备上运行 fsck,您应该会看到如下错误:

[email protected]:~$ sudo fsck /dev/sda3
fsck from util-linux 2.34
e2fsck 1.45.5 (07-Jan-2020)
/dev/sda3 is mounted.
e2fsck: Cannot continue, aborting.

在正常、健康的驱动器上运行 fsck 如下所示:

[email protected]:~$ sudo fsck /dev/sda2
fsck from util-linux 2.34
fsck.fat 4.1 (2017-01-24)
/dev/sda2: 5 files, 1967/1972 clusters

虽然 fsck 接受设备名称,例如 /dev/sda,您可以选择输入 UUID 以避免与安装和卸载设备混淆。 UUID 是分配给您的设备的固定值,不会受到这些系统更改的影响。

了解 fsck 命令的退出代码

这是检查磁盘后可能从 fsck 返回的代码列表。 如果您分析一个磁盘,您的退出代码将是这些代码的总和。 如果您在多个设备上使用 fsck,它将返回 按位或 的两个总和。

  • 0 – 没有错误
  • 1 – 文件系统错误已更正
  • 2 – 系统应该重新启动
  • 4 – 文件系统错误未得到纠正
  • 8 – 操作错误
  • 16 – 用法或语法错误
  • 32 – 用户请求取消 Fsck
  • 128 – 共享库错误

您可以使用检查上次运行命令的退出代码 echo $? 命令。

fsck 命令的实际使用

现在您对 fsck 命令有点熟悉了,让我们看看这个命令的实际用例。

修复 U 盘和其他可移动设备

出于我们的目的,我们假设您已经确定了有问题的设备 /dev/sdb.

首先,您需要确保驱动器已被卸载:

sudo umount /dev/sdb

现在运行 fsck 命令:

sudo fsck /dev/sdb

检查输出是否有任何错误。 如果没有显示,请检查退出代码 echo $?.

我们还可以添加一些选项标志以允许进行一些自动更正。 但是这些命令不是标准化的,您应该验证文件系统类型并比较该特定手册页中的文档。

尽管如此,通常您可以使用 -p 允许 fsck 自动应用修复。

sudo fsck -p /dev/sdb

相似地, -y 将对任何检测到的文件系统损坏应用更正。

修复根文件系统

当系统处于活动状态时,您无法卸载根分区。 如果您怀疑您的主文件系统已损坏,您必须在此处使用不同的方法。

实际上,您可以使用几个不同的选项。 您可以在引导时、在救援模式下运行 fsck,或使用以恢复为主题的 live cd。

许多 Linux 发行版会在启动尝试失败一定次数后自动强制 fsck。 如果您更愿意自己动手​​,您可以安排系统自行执行此操作。

大多数现代 Linux 版本都有一个名为 tune2fs 的工具。

sudo tune2fs -c 1 /dev/sda

假设您的根设备是 dev/sda,这是您要输入的命令。

现在,实际发生的是您正在更改系统设置,以便每次运行 fsck n 靴子数量(1 在 example)。 您也可以将其设置为标准时间间隔。 选项是 d是的, weeks,或 等等。

假设如果一周内没有检查,您希望 fsck 在您启动的任何时候运行。 你可以使用 -i 指定时间间隔,命令看起来像这样。

sudo tune2fs -i 1w /dev/sda	

如果您使用的是 systemd,您可以在下次启动时强制运行 fsck,方法是输入以下内容:

fsck.mode=force
fsck.repair=yes

结论

您可以随时查看手册页以获取更多信息。 只需使用 man fsck 在终端。

我希望您对 fsck 命令有所了解。 如果您有任何意见或问题,请在下方留言。