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

时间:2020-03-05 15:26:50  来源:igfitidea点击:

fsck(文件系统检查)可以处理可能损坏的文件系统。
该实用程序用于检查和(可选)修复文件系统。

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

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

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,应该会看到如下错误:

Hyman@theitroad:~$sudo fsck /dev/sda3
fsck from util-linux 2.34
e2fsck 1.45.5 (07-Jan-2017)
/dev/sda3 is mounted.
e2fsck: Cannot continue, aborting.

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

Hyman@theitroad:~$sudo fsck /dev/sda2
fsck from util-linux 2.34
fsck.fat 4.1 (2016-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命令有点熟悉,那么让我们看一下该命令的实际用例。

修复USB磁盘和其他可移动设备

为了我们的目的,假设我们已经确定了有问题的设备/dev/sdb

首先,我们需要确保已卸下驱动器:

sudo umount /dev/sdb

现在运行fsck命令:

sudo fsck /dev/sdb

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

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

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

sudo fsck -p /dev/sdb

类似地,-y将对任何检测到的文件系统损坏进行更正。

修复根文件系统

系统处于活动状态时,无法卸载根分区。
如果我们怀疑主文件系统已损坏,则必须在此处使用其他方法。

实际上,我们可以使用一些不同的选项。
我们可以在启动时,以救援模式运行fsck或者使用以恢复为主题的实时cd。

在一定数量的失败引导尝试之后,许多Linux发行版都会在启动时自动强制fsck。
如果我们希望自己处理事务,则可以安排系统自己执行此操作。

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

sudo tune2fs -c 1 /dev/sda

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

现在,实际上正在发生的是,我们正在更改系统设置,以使fsck每“ n”个引导都运行(在示例中为1)。
我们也可以将其设置为标准时间间隔。
选项是几天,几周或者几个月。

假设我们希望fsck在引导时的任何时间运行,如果一周没有检查。
我们可以使用-i指定间隔,该命令将如下所示。

sudo tune2fs -i 1w /dev/sda

如果我们使用的是systemd,则可以通过输入以下命令来在下次启动时强制运行fsck:

fsck.mode=force
fsck.repair=yes