Ext3日记文件系统为什么文件系统还会损坏?
问题提出
0:<2>EXT3-fs error (device sda1): ext3_valid_block_bitmap: 0:Invalid block bitmap - block_group = 2, block = 65538 0:0:<2>EXT3-fs error (device sda1): ext3_new_block: 0:Allocating block in system zone - blocks from 65680, length 1 0:0:<2>EXT3-fs error (device sda1): ext3_new_block: 0:Allocating block in system zone - blocks from 65682, length 1 0:0:<2>EXT3-fs error (device sda1): ext3_new_block: 0:Allocating block in system zone - blocks from 65686, length 1 0:0:<2>EXT3-fs error (device sda1): ext3_new_block: 0:Allocating block in system zone - blocks from 65688, length 1 0:0:<2>EXT3-fs error (device sda1): ext3_valid_block_bitmap: 0:Invalid block bitmap - block_group = 4, block = 131074 0:0:<2>EXT3-fs error (device sda1): ext3_new_block: 0:Allocating block in system zone - blocks from 131216, length 1 0:
fsck 1.38 (30-Jun-2005)
e2fsck 1.38 (30-Jun-2005)
fsck.ext3: while determining whether /dev/sda1 is mounted
/dev/sda1: recovering journal
/dev/sda1 contains a file system with errors, check forced.
Pass 1: Checking inodes, blocks, and sizes
Inode 171367, i_blocks is 1312, should be 1320. Fix? yes
Pass 2: Checking directory structure
Entry '..' in ??? (114307) has deleted/unused inode 114246. Clear? yes
Entry '..' in ??? (114308) has deleted/unused inode 114246. Clear? yes[ below is removed... ]
原因分析

硬件设备bug
硬件故障分为2部分:存储设备和控制器设备。存储设备作为黑盒设备,如果偶发故障固件SMART不上报、不记录,作为用户就无从得知。存储设备一般都有ECC、坏块管理等功能,但生产商水平参差不齐,这块做的不好,势必会影响文件系统的一致性。
相对来说,控制器的硬件接口标准化,驱动代码开源,出现问题较好定位,而且AHCI/EHCI等标准总线协议都支持CRC校验。
另外,电源设备故障造成的掉电也是造成数据一致性的重要来源,设备有UPS支持,或者设备上有大电容作为掉电应急支持,或者采购支持掉电保护的存储设备,这能从根源上大大减少文件系统破坏的可能性。
笔者在存储设备生产商工作过一段时间,深知存储设备固件里面的水很深。存储设备生产商为了在各种benchmark工具中提高竞争力,往往会针对benchmark工具的测试行为进行优化。而且为了提高存储读写性能,往往会对标准命令做手脚,比如下发了write cache关闭命令却实际上没有关闭、不支持cache同步命令(Sync Cache、Flush)命令(如创见 SLCFxxxM2TU型号的CF卡),或者下发了但并没有处理、不支持FUA等等,作为用户却无法感知。
为了提高写性能,标准命令提供了NCQ、TCQ命令,这些命令有多队列、写排序、异步返回等特性,进一步加重了数据写入存储介质的时机不可控。如果更看重文件系统的一致性,最好和设备厂商咨询,是否禁用这些特性。有些非标准存储设备,会强制对写请求进行排序,这种情况只能通过下发cache同步命令来保证数据写入存储介质中。
软件bug
拿ext3和ubifs 2种不同类型的文件系统横向对比来看,不管从代码量(23858 vs. 54844), 还是从开发历史(2001年 vs. 2008年),ext3文件系统应该比ubifs文件系统更加稳定,所以说文件系统bug基本上可以确认不是要因。
alex@alex-desktop:~/sc/bsp_dev/kernel/linux/linux-2.6.32-cgel$ find drivers/mtd/ubi/ fs/ubifs/ -name "*.[c|h]" | xargs cat | wc -l
54844
alex@alex-desktop:~/sc/bsp_dev/kernel/linux/linux-2.6.32-cgel$ find fs/ext3 fs/jbd -name "*.[c|h]" | xargs cat | wc -l
23858
从本文开头的2例故障日志可以看出,文件系统元数据损坏时,并没有看到日志错误。ext3文件系统不管采用哪种日志模式,文件系统元数据都是通过日志来保护的,所以可见,把日志模式改为journal还是writeback,并不能避免上面2例故障的发生。
所以说,ext3文件系统在文件系统一致性上存在较多不足。首先在文件系统模型上,journal-based文件系统无法从根本上提供文件系统更新的原子操作,而基于CoW技术(有的文件系统上叫做异地更新)的log-structure文件系统,从根本上解决了文件系统更新的原子操作。另外,ext3文件系统也缺少保证数据一致性的特性(很多特性ext4也没有),比如日志备份、日志支持校验、元数据块支持校验等等。所以不管应用程序bug还是文件系统bug导致的文件系统破坏,ext3文件系统都缺少有效的检测、恢复手段。
制定对策
- 加强存储设备的选型和验证,加强丰富存储设备的准入测试。
- 完善存储设备配置,关闭对数据一致性影响大的存储设备特性。
- 增加UPS、大电容,减少掉电对数据一致性的影响。
- 更换一致性更好的文件系统。
-EOF-
Ext3日记文件系统为什么文件系统还会损坏?的更多相关文章
- ext3是对ext2文件系统的一个扩展高性能日志文件系统
嵌入式开发者所做的最重要的决定之一就是部署哪种文件系统.有些文件系统性能比较高有些文件系统空间利用率比较高,还有一些文件系统设备故障或者意外断电后恢复数据比较方便. linux文件系统概念 分区 分区 ...
- Linux文件系统,ntfs分区显示只读文件系统,提示超级快损坏
背景:某天当我打开自己的设备,突然发现ntfs分区无法写入任何文件,提示为只读文件系统,具体现象如下: 修复过程:排除权限问题,使用fsck进行修复无果后,使用e2fsck进行修复 显示超级快损坏,这 ...
- 解析Linux中的VFS文件系统之文件系统的注册(二)
继上一篇文章:http://www.cnblogs.com/linhaostudy/p/7397024.html 3. 文件系统的注册 这里的文件系统是指可能会被挂载到目录树中的各个实际文件系统,所谓 ...
- 网络文件系统nfs文件系统使用(很全面)
一.NFS简介 1.NFS就是Network FileSystem的缩写,它的最大功能就是可以通过网络让不同的机器,不同的操作系统彼此共享文件(sharefiles)——可以通过NFS挂载远程主机的目 ...
- 网络文件系统nfs文件系统使用(比较全面)
一.NFS简介 1.NFS就是Network FileSystem的缩写,它的最大功能就是可以通过网络让不同的机器,不同的操作系统彼此共享文件(sharefiles)——可以通过NFS挂载远程主机的目 ...
- linux笔记:文件系统管理-分区、文件系统以及文件系统常用命令
linux分区类型: linux文件系统: df(查看文件系统容量和占用): du(统计文件或目录大小): 查询和自动挂载: 挂载命令格式: 挂载光盘: 卸载光盘: 挂载U盘:
- 嵌入式 hi3518c下ramdisk文件系统与文件系统烧写以及uboot中change-the-env
NULL RAM : mkdir ramdisk_test 临时挂在点 dd if=/dev/zero of=123 bs=1k count=10000 建立空硬盘 losetup /dev/loo ...
- 解析Linux中的VFS文件系统之文件系统的来源与简介(一)
最近挂载了N多的文件系统,大致了不同文件系统的相应特性及挂载方式,却还是对Linux的文件系统没有从源码方面去了解.不求甚解确实不好不好. 于是借鉴一些大牛的博客及自己的理解,总结了博客系列: 一.V ...
- ext3文件系统,reiserfs,xfs,jsf那种性能好点
ext2 是一个旧的 Linux 档桉系统,没有日志功能. 启用的时间通常需要很久.目前有许多 日志型态 的档桉系统可以以更快的速度及更好的效率完成系统启用和检查. ext3 为 ext2 的日志版, ...
随机推荐
- windows系统在python3.5环境下安装mysql组件
折腾了一个多小时,终于把连接Mysql的模块装好了,由于我的环境是python3.5,Mysql官方支持到python3.4,后面google查到有pymysql模快支持python3.5,这个模块是 ...
- 进入OS前的两步之System tick
OK,继续向操作系统迈进.由简入繁,先实现两个小功能.第一个是system tick,第二个是任务切换(PendSV).一个是操作系统的心跳,一个是操作系统的并发处理的具体实现. System tic ...
- Asp.net MVC Comet推送
一.简介 在Asp.net MVC实现的Comet推送的原理很简单. 服务器端:接收到服务器发送的AJAX请求,服务器端并不返回,而是将其Hold住,待到有东西要通知客户端时,才将这个请求返回. 客户 ...
- ThinkPHP3.2.3整合smarty模板(二)
前言:继ThinkPHP3.2.3整合smarty模板(一)之后,继续来探讨一下tp框架整合smarty模板,看到有人在群上问到怎么使用自定义的常量,今天就具体来谈谈: 一.开发一个项目,必不可少会用 ...
- [Math & Algorithm] 拉格朗日乘数法
拉格朗日乘数法(Lagrange Multiplier Method)之前听数学老师授课的时候就是一知半解,现在越发感觉拉格朗日乘数法应用的广泛性,所以特意抽时间学习了麻省理工学院的在线数学课程.新学 ...
- cf126b(kmp好题)
http://codeforces.com/contest/126/problem/B #include<bits/stdc++.h> using namespace std; const ...
- 一些PHP性能优化汇总
PHP优化对于PHP的优化主要是对php.ini中的相关主要参数进行合理调整和设置,以下我们就来看看php.ini中的一些对性能影响较大的参数应该如何设置. # vi /etc/php.ini (1) ...
- 关于vue指令(directive)
1.指令的注册 指令跟组件一样需要注册才能使用,同样有两种方式,一种是全局注册: Vue.directive('dirName',function(){ //定义指令 }); 另外一种是局部注册: n ...
- bash 语法使用
1.定义函数时,不需要使用function作为函数的命名. 函数不需要形参. 函数名不能以数字作为开头 main() { in ) 1_start ;; ) 1_start 5_start ;; ) ...
- Alpha版本十天冲刺——Day 5
站立式会议 会前小侃:今天是双11,也是恰逢组内秋鑫同学生日,本组同学祝他双11生日快乐.天气好冷,注意保暖. 会议总结 队员 今天完成 遇到的问题 明天要做 感想 鲍亮 json数据解析学习,完成注 ...