Erdong’ Blog

苦练七十二变,笑对八十一难。

0%

解决 EXT4 使用无法挂载

现象

使用新版本的操作系统自带的文件系统格式化工具进行分区格式化以后,在较低的操作系统版本上会有提示,提示如下:

1
2
3
4
5
6
[root@localhost ~]# mount -t ext4 /dev/sdb1 /root/test
mount: 文件系统类型错误、选项错误、/dev/sdb1 上有坏超级块、
缺少代码页或助手程序,或其他错误

有些情况下在 syslog 中可以找到一些有用信息- 请尝试
dmesg | tail 这样的命令看看。

按照提示查看日志发现

1
2
Mar 12 01:12:20 localhost kernel: JBD2: Unrecognised features on journal
Mar 12 01:12:20 localhost kernel: EXT4-fs (sdb1): error loading journal

原因分析

造成上述问题的原因是在新的操作系统上使用系统自带的 mkfs.ext4 对文件系统进行了格式化,默认会使用一些新的的特性,这些新的特性在旧的系统上是无法使用的。

比如在 Ubuntu 18.04 上进行使用 mkfs.ext4 进行格式化的磁盘,在 CentOS 7.4 1708 上 是可以正常使用的,在 CentOS 7.0 1406 以及以下版本是就是提示上述错误。

Ubuntu 18.04 的 mkfs 版本是 1.44.1-1 ,CentOS 7.0 1406 的 mkfs 版本是 1.42.9-4。造成了这个差异。CentOS 7.4 1708 的 mkfs 版本是 1.42.9-10 ,Redhat 内部在小版本上新增了这个特性的支持。

解决办法

按照日志提示,Unrecognised features on journal , 不支持 journal 。

那么查看文件系统特性:

1
2
#tune2fs -l /dev/sdb1
Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file

文件系统含有一个 has_journal 特性,删除这个特性,删除方式如下:

1
2
#tune2fs -O ^has_journal /dev/sdb1 // 去除has_journal选项
#tune2fs -O has_journal /dev/sdb1 // add has_journal选项

验证是否删除:

1
2
#tune2fs -l /dev/sdb1
Filesystem features: ext_attr resize_inode dir_index filetype

可以看到已经没有这个特性了,再次尝试挂载,

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# mount -t ext4 /dev/sdb1 /root/test
[root@localhost ~]# cd test/
[root@localhost test]# ls
lost+found test_dir test_file.txt
[root@localhost test]# cat test_file.txt
kkdkdkdkkak
kldkjfalkf
kjfklaf
kjafkdj

[root@localhost test]#

可以看到,已经可以正常挂载,挂载后的文件也可以正常显示。

couldn’t mount RDWR

在上述的现象里,如果挂载 ext4 到 CentOS 6.5 等更老一些的系统的时候,也会提示部分不支持的特性,在日志里如果出现了如下提示:

1
kernel: EXT4-fs (sdb1): couldn't mount RDWR because of unsupported optional features (400)

这种情况是因为mkfs.ext4的时候制定的参数,旧的内核不支持导致.

The ext4 feature (400) is the new metadata_csum feature. If this feature is enabled and old tools are used to mount the filesystem they will only be able to mount read-only.

https://ext4.wiki.kernel.org/index.php/Ext4_Metadata_Checksums

解决办法一样,可以在创建的时候不使用该特性,或者删除该特性后再 CentOS 6.5 上使用。

1
2
3
4
[root@localhost ~]# tune2fs -O ^metadata_csum /dev/sdb1
tune2fs 1.43.1 (08-Jun-2016)

请在这个文件系统上运行 e2fsck.

系统提示需要 运行 e2fsck 进行磁盘检查,那么按照要求进行检查, e2fsck 的参数请大家自己选择。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~]# e2fsck -f -a -v /dev/sdb1

13 inodes used (0.00%, out of 30531584)
0 non-contiguous files (0.0%)
0 non-contiguous directories (0.0%)
# of inodes with ind/dind/tind blocks: 0/0/0
Extent depth histogram: 4
1935198 blocks used (1.58%, out of 122096637)
0 bad blocks
1 large file

1 regular file
3 directories
0 character device files
0 block device files
0 fifos
0 links
0 symbolic links (0 fast symbolic links)
0 sockets
------------
4 files

检查完以后,就可以尝试移除这个特性了,期间会询问,请按照实际选择。移除以后挂载就正常了。

1
2
3
4
5
6
7
8
9
[root@localhost ~]# tune2fs -O ^metadata_csum /dev/sdb1
tune2fs 1.43.1 (08-Jun-2016)
Disabling checksums could take some time.
Proceed anyway (or wait 5 seconds) ? (y,n) y
[root@localhost ~]# mount -t ext4 /dev/sdb1 /root/test
[root@localhost ~]# cd test/
[root@localhost test]# ls
lost+found test_dir test_file.txt
[root@localhost test]#

tune2fs 版本较低

执行 tune2fs 如果遇到如下提示:

1
2
3
4
5
[root@localhost ~]# tune2fs -O ^has_journal /dev/sdb1
tune2fs 1.42.9 (28-Dec-2013)
tune2fs: Filesystem has unsupported read-only feature(s) while trying to open /dev/sdb1
Couldn't find valid filesystem superblock.
[root@localhost ~]#

那么说明 tune2fs 版本较低,不支持 has_journal 特性,需要升级到 1.43.1以上才可以。

在 CentOS 6.5 中, tune2fs 版本更低,是 1.41.12,也需要升级。

后记

如果确认是新旧版本的问题导致的无法挂载,那么上述方法就可以解决了。

如果不是新旧版本的问题,那么还有一种可能,就是磁盘坏了,在这种情况下可以使用下列命令尝试修复。

特别提示,磁盘修复请慎重选择。本文不保证数据安全性和完整性,只提供一个可供参考的选择。

1
2
3
4
5
[root@localhost ~]# e2fsck -f -c -v /dev/sdb1
e2fsck 1.42.9 (28-Dec-2013)
/dev/sdb1 has unsupported feature(s): metadata_csum
e2fsck: Get a newer version of e2fsck!
[root@localhost ~]#

该提示显示 e2fsck 工具不支持 新的特性,meadata_csum , 解决版本是 升级 e2fsck 工具的版本, e2fsck 工具由 e2fsprogs 和 e2fsprogs-libs 两个工具包来提供,升级这两个工具包的版本就可以,最少要升级到 1.43.1 版本以上才可以。

Ubuntu 可以参考如下链接进行解决。

https://askubuntu.com/questions/1053404/e2fsck-how-to-handle-the-metadata-csum-error-by-advancing-the-e2fsck-version?noredirect=1&lq=1

关于 CentOS 可以去下列地址查找对应的 rpm 包来进行升级。

http://www.rpmfind.net/linux/RPM/index.html

更推荐的方法是用源码进行编译。过程如下

安装 GCC 编译器

1
yum install gcc -y

下载源码包,

1
wget http://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.43.1/e2fsprogs-1.43.1.tar.gz

解压安装包进行编译

1
2
3
4
tar -zxf e2fsprogs-1.43.1.tar.gz
cd e2fsprogs-1.43.1
./configure
make

此时已经编译好了,进入 e2fsck 文件夹就可以看到新编译的版本了,

1
2
3
4
[root@loaclhost ~]cd e2fsck
[root@localhost ~]# e2fsck -V
e2fsck 1.43.1 (08-Jun-2016)
Using EXT2FS Library version 1.43.1, 08-Jun-2016

如果希望替换系统的 e2fsck 工具,那么执行 make install 。

1
2
cd e2fsprogs-1.43.1
make install

总结

出现上述问题的主要原因是,新版的操作系统默认支持了很多新的特性,这些新特性在旧版本的操作系统上是不支持的。
如果在磁盘使用前就已经知道了磁盘将要使用的操作系统,应该依据操作系统的差别,然后有意的关闭一些参数,使得新旧操作系统的磁盘是兼容的。

如果无法预知操作系统,那么在实际使用中遇到了问题,可以查找是哪个新的特性导致的该问题,尝试移除这个文件系统的特性,之后就可以正常使用了。但是贸然移除某个特性,可能会导致磁盘上的数据丢失,这个应该做过充分的调研确认以后再操作。

======================
Erdong, A Linux user !

坚持原创技术分享, 您的支持将鼓励我继续创作!