博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决 EXT4 使用无法挂载
阅读量:7010 次
发布时间:2019-06-28

本文共 4695 字,大约阅读时间需要 15 分钟。

现象

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

[root@localhost ~]# mount -t ext4 /dev/sdb1 /root/testmount: 文件系统类型错误、选项错误、/dev/sdb1 上有坏超级块、       缺少代码页或助手程序,或其他错误       有些情况下在 syslog 中可以找到一些有用信息- 请尝试       dmesg | tail  这样的命令看看。

按照提示查看日志发现

Mar 12 01:12:20 localhost kernel: JBD2: Unrecognised features on journalMar 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 。

那么查看文件系统特性:

#tune2fs -l /dev/sdb1Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file

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

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

验证是否删除:

#tune2fs -l /dev/sdb1Filesystem features: ext_attr resize_inode dir_index filetype

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

[root@localhost ~]# mount -t ext4 /dev/sdb1 /root/test[root@localhost ~]# cd test/[root@localhost test]# lslost+found  test_dir  test_file.txt[root@localhost test]# cat test_file.txtkkdkdkdkkakkldkjfalkfkjfklafkjafkdj[root@localhost test]#

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

couldn't mount RDWR

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

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.

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

[root@localhost ~]# tune2fs -O ^metadata_csum /dev/sdb1tune2fs 1.43.1 (08-Jun-2016)请在这个文件系统上运行 e2fsck.

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

[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

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

[root@localhost ~]# tune2fs -O ^metadata_csum /dev/sdb1tune2fs 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]# lslost+found  test_dir  test_file.txt[root@localhost test]#

tune2fs 版本较低

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

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

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

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

后记

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

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

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

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

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

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

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

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

安装 GCC 编译器

yum install gcc -y

下载源码包,

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

解压安装包进行编译

tar -zxf e2fsprogs-1.43.1.tar.gzcd e2fsprogs-1.43.1./configuremake

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

[root@loaclhost ~]cd e2fsck[root@localhost ~]# e2fsck -Ve2fsck 1.43.1 (08-Jun-2016)    Using EXT2FS Library version 1.43.1, 08-Jun-2016

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

cd e2fsprogs-1.43.1make install

总结

出现上述问题的主要原因是,新版的操作系统默认支持了很多新的特性,这些新特性在旧版本的操作系统上是不支持的。

如果在磁盘使用前就已经知道了磁盘将要使用的操作系统,应该依据操作系统的差别,然后有意的关闭一些参数,使得新旧操作系统的磁盘是兼容的。

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

======================

Erdong, A Linux user !

转载地址:http://zintl.baihongyu.com/

你可能感兴趣的文章
Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{...
查看>>
怎样在SharePoint 2010网站中启用匿名访问
查看>>
Maven概述
查看>>
java 枚举类型enum 的使用
查看>>
解决兼容的方式
查看>>
畅通工程
查看>>
CentOS 安装MySQL(rpm)提示错误Header V3 DSA/SHA1 Signature
查看>>
Object-C runtime programming guide学习笔记
查看>>
Unity背包/商城物品逐个显示缓动效果-依次显示
查看>>
Spring c3p0连接池无法释放解决方案
查看>>
c#读取excel到dataset
查看>>
java使用Redis
查看>>
使用批处理设置、启动和停止服务
查看>>
测试报告 之 testNG + Velocity 编写自定义html测试报告
查看>>
openstack中文文档
查看>>
C++ 术语(更新中..)
查看>>
Developer Tools(开发工具)
查看>>
C#winform中ListView及ContextMenuStrip的使用
查看>>
WPF/Silverlight HierarchicalDataTemplate 模版的使用
查看>>
Leetcode | Longest Substring Without Repeating Characters
查看>>