ext4提供有很多特性,当然有一些是前一代文件系统ext3本身就具有的,比如日志功能,但有时候我们却并不需要这些特性,则我们可以禁用它们。ext4文件系统的日志功能就是在牺牲一定性能的情况下增强稳定性的一种手段,但在一些情况,比如Web Server上存在的大量小文件所在的文件系统就是一个典型示例,此时可以禁用ext4的日志功能。

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

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

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

按照提示查看日志发现

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 。

那么查看文件系统特性:

#tune2fs -l /dev/sdb1
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize

关闭EXT4日志功能:

[root@localhost ext4]# tune2fs -O ^has_journal /dev/sdb1
tune2fs 1.42 (29-Nov-2011)

#再次查看系统特性,已经没有这个特性了
[root@localhost ext4]# dumpe2fs /dev/sdb1 | grep 'Filesystem features' | grep 'has_journal'
dumpe2fs 1.42 (29-Nov-2011)

再次尝试挂载即可。


#如果想开启EXT4日志功能:

[root@localhost ext4]# tune2fs -O has_journal /dev/sdb1
tune2fs 1.42 (29-Nov-2011)
Creating journal inode: done
[root@localhost ext4]# dumpe2fs /dev/sdb1 | grep 'Filesystem features' | grep 'has_journal'
dumpe2fs 1.42 (29-Nov-2011)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize

动态关闭和打开日志功能后可能需要对文件系统进行fsck检查,避免出错:

[root@localhost ext4]# fsck.ext4 -f /dev/sdb1
e2fsck 1.42 (29-Nov-2011)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sdd1: 11/262144 files (0.0% non-contiguous), 18510/1048233 blocks

更多ext4特性的开启与关闭可以查看man手册:“man mkfs.ext4”的-O选项

禁用ext4的日志功能后有少许的性能提升:http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=0390131ba84fd3f726f9e24fc4553828125700bb


制作ext4文件系统时,关闭64bit选项

最近遇到启动盘格式化为ext4文件系统,syslinux无法启动的问题。查看其官网(https://www.syslinux.org/wiki/index.php?title=Filesystem),指出6.03版本不支持64bit的ext4文件系统,官网上提示在6.04版本会修复此问题。找半天没看到有6.04版本。而且6.03版本已经是2014-10-06发布的了,看来已经没有人维护了。

mke2fs -O ^64bit /dev/sdb1

查看配置文件/etc/mke2fs.conf,显示对于ext4文件系统64bit选项是默认打开的状态。

[defaults]
    blocksize = 4096

[fs_types]
    ext4 = {
        features = has_journal,extent,huge_file,flex_bg,metadata_csum,64bit,dir_nlink,extra_isize
        inode_size = 256
    }

也可通过删除此配置文件中的64bit,禁用64bit。与使用mke2fs的-O选项效果相同。


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/sdb1
Couldn'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/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 编译器

yum install gcc -y

安装编译

[root@loaclhost ~]# wget http://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.43.1/e2fsprogs-1.43.1.tar.gz
[root@loaclhost ~]# tar -zxf e2fsprogs-1.43.1.tar.gz
[root@loaclhost ~]# cd e2fsprogs-1.43.1
[root@loaclhost ~]# ./configure
[root@loaclhost ~]# make   
[root@loaclhost ~]# make install总结

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

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