Ext扩展文件系统 篇1
1 问题提出
硬盘在长期的使用过程中, ext3文件系统经常由于异常断电引起各种问题, 如: 1文件系统崩溃, 所有数据丢失; 2删除的文件断电后会再次出现; 3创建的文件断电后又消失; 4部分文件丢失, input/output error问题。出现上述问题, 对于存储着重要数据的硬盘而言, 需要重做硬盘或者人为恢复硬盘数据, 严重影响了产品质量的可靠性。且现有ext3文件系统在挂载磁盘分区时, 只进行一次尝试, 缺乏相应的容错处理机制。
解决文件系统的稳定性可以从软件和硬件两个方面进行改进。
( 1) 硬件上常用的方法是加上UPS或者采用单片机。UPS的作用是将系统断电之前提醒用户安全关机备份数据; 单片机的作用是在断电之前, 通过电容延时关机, 同时通知主板安全关机备份数据。这两种方法成本都较高。
( 2) 软件上采用从应用程序层对硬盘数据进行双机备份; 或者采用私有文件系统, 通过一定的校验机制进行处理; 或者借助第三方工具, 如fsck、e2fsck等, 对文件系统进行自检和修复, 但这种工具会导致丢失文件或丢失目录, 且修复时间很长。
为克服上述问题, 本文提出一种基于嵌入式Linux的提高ext3文件系统稳定性的方法。这是一种备份文件系统信息和基于备份信息挂载磁盘分区的方法。
2 提高 ext3 文件系统稳定性的方法描述
2. 1 ext3 文件系统基本概念
对于ext3文件系统来说, 硬盘分区被划分为一个个的块 ( block) , 一个ext3文件系统上的每个块都是一样大小的, 块大小在创建ext3文件系统的时候被确定[2]。
分区的第一块作为引导块, 存放引导程序 ( boot) , 不受ext3文件系统管理。其余部分分成块组, 其分布图见图1。
挂载磁盘分区就是驱动程序对磁盘分区操作, 即通常的块设备驱动程序读取请求操作, ext3文件系统的正常读取操作具体包括如下步骤:
( 1) 读取超级块信息, 验证文件系统类型。超级块含有整个文件系统的一些全局参数, 如: 卷名、全局唯一标识符、状态、块大小、总块数、每组inode数, 总inode数、每组块数等等, 超级块在文件系统挂载时被读入内存, 直到卸载时被释放, 超级块对于文件系统来说至关重要[3]。
( 2) 读取并验证组描述符信息。组描述符描述某个块组的整体信息, 如块位图起始块号、索引节点位图起始块号、索引节点表起始块号等等。
( 3) 读取和验证journal inode。journal inode: 日志档案的inode编号。
( 4) 读取和验证root inode。在ext3文件系统中, 必须有一个root inode, 该inode在磁盘上的位置是固定的, 在文件系统启动的时候, root inode是文件系统的入口。Root inode描述的是一个目录项, 即其指向的数据块中存储着的目录项。每个目录项会指向下一个inode, 如果目录项描述的是一个普通文件, 则下一个inode会分配物理块, 并且将文件数据存储到物理块中; 如果目录项描述的是下一级目录, 那么, 下一个inode分配的块中会存储下一级目录的目录项。通过inode和目录项, ext3构建起了一颗庞大的文件树。
另外, ext3文件系统为超级块预留了备份区域, 一般在第1、3、5、7、9块组的首块中, 可以采用预留备份区域中的任意一组块组 ( block group) 作为备份区域。块组的编号从0开始, 即首个块组为第0个块组[4]。
因此, 要提高ext3文件系统的稳定性可从两方面进行: 1周期性备份或者卸载磁盘时备份磁盘文件系统的重要信息, 如超级块、组描述符、root inode、日志inode信息; 2当挂载磁盘分区时, 如果挂载过程失败, 依据1) 的文件系统备份信息, 恢复文件系统, 再一次尝试挂载, 如果再次失败, 则退出挂载流程。
2. 2 备份文件系统信息
周期性备份或卸载 ( do_mount) 硬盘时备份超级块、组描述符、root inode、日志inode信息, 确保磁盘崩溃时也可以正常挂载。备份地址可以是ext3文件系统为管理员保留的磁盘管理空间。本文中采用第三个块组作为备份区域, 见图2备份文件系统信息流程图。
步骤1: 备份root inode至第三个块组的相应root节点信息存放处, 并置一个标识, 如“Intellix - root”, 来标示是否备份过root inode。
步骤2: 备份journal inode至第三个块组的相应日志节点信息存放处, 并置一个标识, 如“Intellix - journal”, 来标示是否备份过journal inode。
步骤3: 备份组描述符至第三个块组的组描述符存放处。
步骤4: 备份超级块至第三个块组的首块。
2. 3 文件系统挂载过程
挂载磁盘分区时, 若能够正常挂载, 则返回挂载成功, 退出挂载流程; 若第一次挂载失败, 则从备份区域恢复超级块、组块信息、root节点信息和日志节点信息, 再进行挂载, 挂载成功, 退出挂载流程, 返回挂载成功; 否则返回挂载失败, 停止再次挂载尝试; 基于文件系统备份信息挂载磁盘分区流程图, 见图3所示。
步骤1: 读取第0个块组的超级块, 读取成功, 进入下一步; 否则读取备份超级块 ( 第三个块组的首块) , 读取备份超级块失败退出挂载流程; 若读取备份超级块成功, 将备份超级块恢复到第0个块组的超级块位置, 重新读取第0个块组的超级块, 读取成功进入下一步, 否则退出挂载流程。
步骤2: 读取第0个块组的组描述符, 验证成功进入下一步; 如果失败读取备份组描述符信息 ( 第三个块组的第二个块) , 验证失败退出挂载流程; 验证成功则将备份组描述符恢复到第0个块组内, 并重新读取第0个块组的组描述符, 读取成功进入下一步, 否则退出挂载流程;
步骤3: 读取第0个块组的日志节点信息, 如果成功进入下一步; 如果失败, 判断备份标识, 看是否存在备份日志节点信息, 不存在退出; 存在则将备份日志节点信息恢复到第0个块组内, 读取第0个块组的日志节点信息, 读取成功进入下一步, 否则退出挂载流程。
步骤4: 读取第0个块组的root节点信息, 如果成功进入下一步; 否则判断备份标识, 看备份root节点信息是否存在, 不存在则退出挂载流程; 若存在, 则将备份root节点信息恢复到第0个块组的相应root节点信息位置。读取第0个块组的root节点信息, 读取成功进入下一步, 否则退出挂载流程。
4 结束语
本文介绍了一种基于嵌入式Linux的ext3文件系统提高稳定性的方法, 此方法相对于现有技术采用的硬件上策略, 成本低, 实现简单, 时间短; 而相对于其它软件上解决的方法, 不需要专门编写新的应用程序, 机制简单, 不需要复杂的校验机制, 只需要在原有磁盘驱动程序的基础上稍作调整就可以提高磁盘文件系统的稳定性; 大大降低了开发的难度和开发周期, 方便, 简单。
参考文献
[1]陈莉君.深入分析Linux内核源代码[M].北京:人民邮电出版社, 2002.
[2]马琳.数据重现:文件系统原理精解与数据恢复最佳实践[M].北京:清华大学出版社, 2009.
[3]涂健, 孙辉.Linux2.6内核下Ext3文件系统的数据结构及性能分析[J].南昌水专学报, 2004, 23 (2) :8-10
Ext扩展文件系统 篇2
ext3是由开放资源社区开发的日志文件系统,主要开发人员是redhat的 高手stephen tweedie。ext3被设计成是ext2的升级版本,尽可能地方便用户从ext2fs向ext3fs迁移。ext3在ext2的基础上加入了记录元数据的日志功能,努力保持向前和向后的兼容性。这个文件系统也许称为ext2的下一个版本更为合适些。
ext3fs工作得很好。ext3fs最大的优点是向下兼容ext2。而且ext3fs还支持异步的日志,这意味着它的性能可能比ext2还好。但是使用ext3文件系统时要注意硬盘限额问题,在这个问题解决之前,不推荐在重要的应用上采用ext3+disk quota
ext3最新版本是针对kernel 2.4.8的ext3-2.4-0.9.6-248.gz
新推出的redhat 7.2B上正式启用了ext3,Turbolinux Server 6.5则同时支持 ReiserFS 及 ext3.
一、安装ext3文件系统(以redhat 7.1为例)
首先下载ext3-2.4-0.9.6-248.gz和linux-2.4.8.tar.gz并把它们拷贝到/usr/src/目录下.
你可能要下载最新版的util-linux(www.kernel.org/pub/linux/utils/util-linux/)和e2fsprogs
(e2fsprogs.sourceforge.net/)
要确保e2fsprogs的版本>1.22,redhat 7.1也需要升级.怕麻烦的可下载redhat 7.2b的相应rpm包e2fsprogs-1.22-3.i386.rpm和util-linux-2.11f-5.i386.rpm
rpm -Uhv e2fsprogs-1.22-3.i386.rpm
rpm -Uhv util-linux-2.11f-5.i386.rpm
tar zxvf linux-2.4.8.tar.gz
mv kernel linux-2.4.8
rm linux-2.4
ln -s linux-2.4.8 linux-2.4
cd /usr/src/linux-2.4
gunzip < ../ext3-2.4-0.9.6-248.gz | patch -p1
make mproper
make menuconfig(在文件系统栏目中选上ext3,作为模块也可以.再选上“JBD debugging support”项,如果出错的话,可提供有用的信息;通常不要选上“Buffer head tracing”,因为这样的话会使用大量的内存.)
make dep
make clean
make bzImage
make modules
make modules-install
cp System.map /boot/System.map-2.4.8
cp arch.i386/boot/bzImage /boot/vmlinuz-2.4.8
cd /boot
rm System.map
ln -s System.map-2.4.8 System.map
vi /etc/lilo.conf
lilo
reboot
二、把ext2文件系统转换成ext3文件系统
通过在已有的ext2文件系统上添加日志文件可把ext2文件系统转换成ext3文件系统.假设打算把原/back (/dev/hda4)从ext2文件系统转换成ext3文件系统.
1、卸载/back目录
umount /back
2、转换
tune2fs -j /dev/hda4
3、安装/back目录
mount -t ext3 /dev/hda4 /back
4、修改/etc/fstab文件.
三、创建新的ext3文件系统
假设打算把/dev/hda4)创建为ext3文件系统.
1、创建
mke2fs -j /dev/hda4
2、安装/back目录
mount -t ext3 /dev/hda4 /back
3、修改/etc/fstab文件.
四、在ext2与ext3之间切换
你可以把一个文件系统在ext3和ext2自由切换.因为在ext2文件系统上的ext3日志文件仍然存在,只是ext2不能认出而已.
umount /back
mount -t ext3 /dev/hda4 /back
umount /back
mount -t ext2 /dev/hda4 /back
五、文件系统修复
新的e2fsprogs中的e2fsck支持ext3.当一个ext3文件系统被破坏时,先卸载该设备,在用e2fsck修复.
umount /back
e2fsck -fy /dev/hda4
六、其它事项
用ext3可以避免重启动时长时间的文件系统检查.用下面的名令:
tune2fs -i 0 -c 0 /dev/hda4来关闭文件系统检查.