ext4文件系统错误处理机制
4月 23rd, 2013 | Filed under FileSystem发表评论
目前内核对ext4文件系统错误处理机制分为三种:1.不处理;2.内核panic;3.错误分区remount成只读形式。

处理机制的设定是在两个地方处理的,一个是在文件系统物理分区上设置,通过设置ext4文件系统分区的超级块中的“Errors behavior”参数,可以配置错误处理方式,一般默认处理方式是Continue(不处理),具体配置通过tune2fs搞定:

oen@oen ~ $ sudo tune2fs -l /dev/sda3 | head -n 10
tune2fs 1.42.5 (29-Jul-2012)</pre>
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linuxoen@oen ~ $ sudo tune2fs -l /dev/sda3 | head -n 10
tune2fs 1.42.5 (29-Jul-2012)</pre>
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux

另外一种方式则是通过配置mount参数搞定,参看man手册:

errors=continue / errors=remount-ro / errors=panic
Define the behaviour when an error is encountered. (Either ignore errors
and just mark the file system erroneous and continue, or remount the file
system read-only, or panic and halt the system.) The default is set in
the filesystem superblock, and can be changed using tune2fs(8).
errors=continue / errors=remount-ro / errors=panic
Define the behaviour when an error is encountered. (Either ignore errors
and just mark the file system erroneous and continue, or remount the file
system read-only, or panic and halt the system.) The default is set in
the filesystem superblock, and can be changed using tune2fs(8).

mount参数通常情况下在fstab中mount参数中直接设定,一般情况下服务器环境中的系统分区都是通过mount设置错误处理参数,一般都要设定为errors=panic,如此宁可让系统重启,让双机保持系统稳定,也不能让业务进程挂死在只读分区上。

但很多情况下,没有设置挂载参数,最后文件系统错误也导致了分区只读,具体就要分析内核的实现了。

文件系统问题出错最终都要有ext4_handle_error函数处理:


static void ext4_handle_error(struct super_block *sb)
{if (sb->s_flags & MS_RDONLY)return;if (!test_opt(sb, ERRORS_CONT)) {journal_t *journal = EXT4_SB(sb)->s_journal;EXT4_SB(sb)->s_mount_flags |= EXT4_MF_FS_ABORTED;if (journal)jbd2_journal_abort(journal, -EIO);}if (test_opt(sb, ERRORS_RO)) {ext4_msg(sb, KERN_CRIT, "Remounting filesystem read-only");sb->s_flags |= MS_RDONLY;}if (test_opt(sb, ERRORS_PANIC))panic("EXT4-fs (device %s): panic forced after errorn",sb->s_id);
}static void ext4_handle_error(struct super_block *sb)
{if (sb->s_flags & MS_RDONLY)return;if (!test_opt(sb, ERRORS_CONT)) {journal_t *journal = EXT4_SB(sb)->s_journal;EXT4_SB(sb)->s_mount_flags |= EXT4_MF_FS_ABORTED;if (journal)jbd2_journal_abort(journal, -EIO);}if (test_opt(sb, ERRORS_RO)) {ext4_msg(sb, KERN_CRIT, "Remounting filesystem read-only");sb->s_flags |= MS_RDONLY;}if (test_opt(sb, ERRORS_PANIC))panic("EXT4-fs (device %s): panic forced after errorn",sb->s_id);
}

在代码第6行的判断中,如果系统默认不处理,则将journal置为aborted状态,然后结束;如果是挂载方式是只读,则将超级块的挂载标志位为MS_RDONLY;如果是panic,则打印panic告警并复位。

虽然系统默认不处理的情况下ext4_handle_error处理函数完美结束,但系统还在正常运行,如果系统需要对问题分区写入一些文件,此时IO会走JBD,获取handle原子操作,在ext4_journal_start_sb中判断journal状态,如果是aborted,则进入ext4_abort。

journal = EXT4_SB(sb)->s_journal;
if (is_journal_aborted(journal)) {ext4_abort(sb, __func__,"Detected aborted journal");return ERR_PTR(-EROFS);}journal = EXT4_SB(sb)->s_journal;
if (is_journal_aborted(journal)) {ext4_abort(sb, __func__,"Detected aborted journal");return ERR_PTR(-EROFS);}
在ext4_abort中,如果分区状态不是只读,则将其分区置为只读。void __ext4_abort(struct super_block *sb, )
{if ((sb->s_flags & MS_RDONLY) == 0) {ext4_msg(sb, KERN_CRIT, "Remounting filesystem read-only");sb->s_flags |= MS_RDONLY;EXT4_SB(sb)->s_mount_flags |= EXT4_MF_FS_ABORTED;if (EXT4_SB(sb)->s_journal)jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO);save_error_info(sb, function, line);}if (test_opt(sb, ERRORS_PANIC))panic("EXT4-fs panic from previous errorn");
}void __ext4_abort(struct super_block *sb, )
{if ((sb->s_flags & MS_RDONLY) == 0) {ext4_msg(sb, KERN_CRIT, "Remounting filesystem read-only");sb->s_flags |= MS_RDONLY;EXT4_SB(sb)->s_mount_flags |= EXT4_MF_FS_ABORTED;if (EXT4_SB(sb)->s_journal)jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO);save_error_info(sb, function, line);}if (test_opt(sb, ERRORS_PANIC))panic("EXT4-fs panic from previous errorn");
}

真正工作中,文件系统的读写次数非常高,如果挂着参数不是panic,则文件系统出现bug,内核会将其置为只读状态。

—结束—

ext4文件系统错误处理机制相关推荐

  1. 【java学习】系统错误处理机制:异常(Exception)、断言(assert)和日志(log)

    java语言中,给出了3种处理系统错误的机制:抛出一个异常.日志.使用断言. 1,异常 1)概念 当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常. 处理异常的一 ...

  2. [Ext4] Ext4文件系统分析系列文章

    1.  Linux 文件系统概述 http://blog.csdn.net/younger_china/article/details/7068773 2. [ext4] 磁盘布局 - block分析 ...

  3. J2EE JVM加载class文件的原理机制

    JVM加载class文件的原理机制 1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中 2.java中的 ...

  4. JVM加载class文件的原理机制

    阅读目录 1.JVM 简介 2.JVM 的组成部分 3.JVM加载class文件的原理机制 在面试java工程师的时候,这道题经常被问到,故需特别注意. 回到顶部 1.JVM 简介 JVM 是我们Ja ...

  5. Linux 文件系统错误的修复方法 ddrescue替代dd的恢复软件 备用超级块

    Linux 文件系统错误的修复方法  ddrescue替代dd的恢复软件  备用超级块 http://www.mamicode.com/info-detail-1372846.html 最近处理的一件 ...

  6. 一个关于linux文件预读机制问题

    一个关于linux文件预读机制问题 曾经,有人问我这样一个问题: 一个Native 程序 mmap 了一个文件,如果什么都不读 RSS是0,但是读一个字节,RSS就变成64k,这个在哪儿能控制大小? ...

  7. java虚拟机及加载class文件的原理机制

    2019独角兽企业重金招聘Python工程师标准>>> (点击获取更多资料的下载) java 虚拟机 ‎2007‎年‎4‎月‎23‎日,‏‎14:18:00 | chenweicai ...

  8. python做公司内部系统错误_Python程序可能导致文件系统错误?

    概述: 你好.我有一个python程序,在9-5小时之间控制一个运动传感器.该程序在树莓派上运行,存储在带有西方人v2.1 Debian OS的SD媒体上.该计划在很大程度上依赖于time.sleep ...

  9. 常见Java面试题之JVM加载class文件的原理机制

    JVM加载class文件的原理机制 JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的 ...

  10. 描述一下JVM加载class文件的原理机制

    Java中的所有类,都需要由类加载器装载到JVM中才能运行.类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中.在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的 ...

最新文章

  1. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )
  2. 五.Java IO、NIO、文件、通讯
  3. tamper绕WAF小结
  4. linux中probe函数中传递的参数来源(上)
  5. PyQt5 技巧篇-窗口置顶设置,如何使窗口始终显示在最前面
  6. S5PV210开发 -- I2C 你知道多少?(二)
  7. ICA独立成分分析—FastICA基于负熵最大
  8. String s = new String(xyz);创建了几个对象?
  9. (转)用DynamicMethod提升ORM系统转换业务数据的性能
  10. react-navigation createBottomTabNavigator 刷新问题
  11. 【Python】打开/查看 pkl csv json txt 文件
  12. uva 11916 Emoogle Grid (BSGS)
  13. dedecms安全提示解决方法
  14. cad计算机快捷键命令大全,2016cad快捷键命令大全,AutoCAD快捷键命令大全
  15. DJ Mix Pads 2 - Remix Version for Mac(独特DJ混音创作软件)
  16. matlab插值拟合
  17. VulkanAPI架构
  18. Python|泰坦尼克号幸存者画像
  19. Android模拟器编程,Android模拟器入门[转]
  20. Surface Slim Pen吸附在Pro 8上的尝试

热门文章

  1. W: Possible missing firmware /lib/firmware/i915/skl_guc_49.0.1.bin for module i915
  2. 何谓Palm size-PC及Pocket PC?
  3. CityEngine--comp() operator
  4. Zabbix实现短信报警设置(实战)
  5. 无人机生成地图_无人机配方向传感器可自行创建地图+规划路线
  6. [2017BUAA软工助教]博客格式的详细说明
  7. mac的 tr命令_tr命令 - Holy_Shit - 博客园
  8. python f检验 模型拟合度_模型评估指标(RMSE、MSE、MAE、R2准确率、召回率、F1、ROC曲线、AUC曲线、PR曲线)...
  9. 零基础HTML入门教程(14)--水平线
  10. 使用Zend Expressive快速进行企业应用开发