ext4文件系统“Structure needs cleaning”问题解决方案

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文介绍ext4文件系统中出现“Structure needs clean”错误信息的解决方案。

问题现象

挂载设备后,读取设备上的文件出现“Structure needs clean”错误信息。

原因分析

出现这类错误一般表示磁盘上的文件系统元数据信息出现损坏,需要对磁盘文件系统进行修复。

解决方法

  1. 卸载文件系统

首先需要卸载磁盘对应的挂载点,这里以磁盘设备/dev/vdd1为例。执行命令df -Th查看各挂载点信息,输出信息如下。

Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs   16G     0   16G   0% /dev
tmpfs          tmpfs      16G     0   16G   0% /dev/shm
tmpfs          tmpfs      16G  552K   16G   1% /run
/dev/vda3      ext4       99G   15G   80G  16% /
tmpfs          tmpfs      16G  4.0K   16G   1% /tmp
/dev/vda2      vfat      200M  5.8M  195M   3% /boot/efi
tmpfs          tmpfs     3.1G     0  3.1G   0% /run/user/0
/dev/vdd1      ext4       98G   24K   93G   1% /mnt

可以看到/dev/vdd1当前正挂载到/mnt。执行下面命令进行卸载。

 sudo umount /mnt

最后,再次执行df -Th确认设备已经被卸载。

Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs   16G     0   16G   0% /dev
tmpfs          tmpfs      16G     0   16G   0% /dev/shm
tmpfs          tmpfs      16G  552K   16G   1% /run
/dev/vda3      ext4       99G   15G   80G  16% /
tmpfs          tmpfs      16G  4.0K   16G   1% /tmp
/dev/vda2      vfat      200M  5.8M  195M   3% /boot/efi
tmpfs          tmpfs     3.1G     0  3.1G   0% /run/user/0
  1. 查看磁盘上文件系统状态

检查磁盘上的文件系统状态可以通过dumpe2fs命令完成。首先确认系统中是否安装了该命令。

dumpe2fs -V

如果输出对应的版本号,则说明已经安装;否则,通过下面的命令安装e2fsprogs包。

sudo yum -y install e2fsprogs

通过dumpe2fs命令可以查看磁盘上文件系统状态,这里以/dev/vdd1为例。

 sudo dumpe2fs /dev/vdd1 

输出结果如下:

Filesystem volume name:   <none>
......
Filesystem state:         clean with errors
Errors behavior:          Continue
Filesystem OS type:       Linux
......
FS Error count:           9
First error time:         Thu Dec 26 12:58:52 2024
First error function:     ext4_ext_check_inode
First error line #:       520
First error inode #:      13
First error err:          EFSCORRUPTED
Last error time:          Thu Dec 26 15:35:37 2024
Last error function:      ext4_ext_check_inode
Last error line #:        520
Last error inode #:       13
Last error err:           EFSCORRUPTED
Journal features:         journal_64bit
Total journal size:       256M
Total journal blocks:     65536
Max transaction length:   65536
Fast commit length:       0

从上述信息中,Filesystem state: clean with errors表明文件系统处于有错误的状态。同时,First error function: ext4_ext_check_inode表明了第一次在内核ext4_ext_check_inode中发生了错误。

  1. 修复磁盘文件系统错误

警告

修复磁盘文件系统可能会造成数据丢失,请谨慎进行此项操作!

fsck.ext4 是 Linux 系统中用于检查和修复EXT4文件系统的工具。它的主要功能是检查文件系统的完整性,并在发现错误时尝试修复这些错误。在检查过程中,fsck.ext4 会识别不同类型的错误,比如:

  • 数据块的丢失:例如,某个inode被标记为使用,但其数据块却不存在。

  • 多重分配:同一个数据块被多个inode分配。

  • 丢失或损坏的超级块:文件系统的超级块可能被损坏。

一旦 fsck.ext4 识别出错误,它会尝试自动修复这些错误。修复机制可能包括:

  • 修复超级块信息,创建新的超级块拷贝。

  • 释放未使用的或重复分配的数据块。

  • 更新inode的状态信息,确保它们与数据块的实际使用情况相符。

  • 修复文件系统的链接,如目录项的错误。

重要

下面的操作会修复磁盘上的文件系统错误,但是可能会造成数据丢失,请谨慎操作!

执行下面的命令修复磁盘上的文件系统,以/dev/vdd1为例。

sudo fsck.ext4 /dev/vdd1 

此时fsck.ext4命令会检查磁盘上的错误,并询问是否对此错误进行修复。

Pass 1: Checking inodes, blocks, and sizes
Inode 13 has corrupt extent header.  Clear inode<y>? yes
Inode 13, i_blocks is 8, should be 0.  Fix<y>? yes
Pass 2: Checking directory structure
Entry 'testfile.txt' in / (2) has deleted/unused inode 13.  Clear<y>? yes
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Block bitmap differences:  -34816
Fix<y>? yes
Free blocks count wrong for group #1 (31735, counted=31736).
Fix<y>? yes
Free blocks count wrong (12822641, counted=12822642).
Fix<y>? yes
Inode bitmap differences:  -13
Fix<y>? yes
Free inodes count wrong for group #0 (8180, counted=8181).
Fix<y>? yes
Free inodes count wrong (3276788, counted=3276789).
Fix<y>? yes

/dev/vdd1: ***** FILE SYSTEM WAS MODIFIED *****
/dev/vdd1: 11/3276800 files (0.0% non-contiguous), 284558/13107200 blocks

对于所有错误都输入y表示修复该错误。或者直接通过下面命令修复所有错误。

fsck.ext4 -y /dev/vdd1 

这时候再通过dumpe2fs命令检查磁盘状态则显示文件系统状态为clean,而非之前的错误状态。

...
Filesystem state:         clean
...