7

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

 1 year ago
source link: https://www.51cto.com/article/722191.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

作者:刘光录 2022-11-07 12:52:25
fsck(file system check,文件系统检查)用于处理可能损坏的文件系统,本文对该命令做个简单介绍。
764bc15525362724241432dadec6332287a68d.jpg

一般来说,有这么几种情况,你可能会用到 fsck 命令:系统无法启动,设备(外部驱动器或存储设备)运行不正常,或者有文件损坏的情况等。 fsck 实际上是许多文件系统特定检查器的“前端”,比如 fsck.vfat, fsck.ext2 等。使用 fsck 的时候不需要指定具体使用的是哪个检查器。

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-25A6F2406380Device            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 之前需要先卸载设备。

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

$ 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,输出是这样的:

$ 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,那么返回的是两个和的逻辑或(OR,||)。

  • 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 $? 来检查退出代码。

我们可以添加一些选项,允许命令进行自动更正。但是这些命令没有进行标准化,所以在使用前需要验证文件系统并比较 man 手册中的描述信息。 尽管如此,通常我们可以使用 -p 选项来让 fsck 自动修复:

sudo fsck -p /dev/sdb

类似的,-y 选项可以对检测到的任何损坏的文件系统进行更正。

修复根文件系统

当系统处于活动(active)状态时,我们无法卸载 root 分区。如果我们怀疑主文件系统已损坏,那就需要使用其他的方法了。

对于这种情况,有几个方案可以使用。比如可以在系统启动时,在救援模式(rescue mode)下运行 fsck,或者使用恢复主题的引导盘(recovery-themed live cd)。

许多 Linux 发行版,在经过几次系统启动失败后,重新启动时会自动强制 fsck。如果你喜欢自己动手,可以手动设置“几次”这个数值。 大多数现代 Linux 版本都有一个名为 tune2fs 的工具,假如你的 root 设备为 /dev/sda,可以使用如下命令:

sudo tune2fs -c 1 /dev/sda

上述命令是对系统设置的更改,设置为每 n 次(上述例子中为1)引导(系统启动),运行一次 fsck。你还可以将其设置为标准的时间间隔,单位可以设置为天、周或月。 假如我们希望在任何时间启动系统时,如果一周内没有检查,就运行 fsck。那么可以使用 -i 选项来指定时间间隔,如下:

sudo tune2fs -i 1w /dev/sda

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

fsck.mode=force
fsck.repair=yes

关于 fsck 的更多信息,大家可以参考 man 手册,在终端中运行 man fsck 即可。

以上就是本次分享全部内容,欢迎讨论。

责任编辑:庞桂玉 来源: TIAP

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK