e2fsck命令内幕
e2fsprogs工具包里提供的e2fsck可以用来检测并修复ext2/3/4文件系统,但比较遗憾的是它的检测修复比较发费时间,特别是大容量的长期使用的磁盘分区,其检测修复甚至会发费1个小时以上的时间。e2fsck的使用示例如下:
[root@localhost e2fsck]# ./e2fsck -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/sdb1: 78942/16777216 files (0.1% non-contiguous), 2517270/67107513 blocks [root@localhost e2fsck]#
e2fsck每一个阶段所做的具体检测工作如下:
阶段1
扫描所有的inode(对应结构体ext2_inode),并且对每一个inode做如下检测:
a),mode字段(这个字段记录文件类型,比如文件夹、普通文件、软链接文件等)是否合法。
b),size字段(文件大小,单位为字节)和blocks字段(文件占用的block块数)是否正确。
c),检测对应的数据块(data block)没有被其它inode占用。
另外,阶段1还会收集如下这些信息,以便后续阶段使用,这样做的好处是提升fsck整体速度,避免多次读取inode信息:
a),标记哪些inode处于使用状态的位图(inode_used_map)
b),标记哪些inode是目录文件的位图(inode_dir_map)
c),标记哪些inode是普通文件的位图(inode_reg_map)
d),标记哪些inode有错误字段的位图(inode_bad_map)
e),标记哪些inode处在错误块(bad block)里的位图(inode_bb_map)
f),标记哪些inode是魔术inode(imagic inode)的位图(inode_imagic_map)
g),标记哪些block块处于使用状态的位图(block_found_map)
h),标记哪些block块处于被两个inode使用的位图(block_dup_map)
i),标记目录inode的数据块(data block)的位图(dir_map)
在阶段1检测过程中,如果发现block块被多个inode使用,那么将触发阶段1B、阶段1C、阶段1D。
阶段1B扫描所有inode的数据块,生成一个完整的记录被重复使用的block和与之对应的inode的链表。
阶段1C扫描整个文件系统的目录树结构,确定这些inode(即阶段1B里链表里记录的那些inode)的父目录,以便在下一步中用完整路径提示用户进行操作抉择。
阶段1D为修复阶段,对于每一个被重复使用的block和与之对应的inode,根据用户的选择是进行数据拷贝还是直接进行文件删除。
阶段2
遍历所有活动的目录inode,并且对每一个目录inode的目录块(directory block)内的每一个目录项(directory entry,对应结构体ext2_dir_entry)做如下检测:
a),目录项的长度(rec_len)要大于等于8字节,并且小于目录块剩余空间大小。
b),目录项的name字段长度(name_len)要小于rec_len – 8。
c),目录项的inode字段要处在合法范围之内。
d),目录项的inode字段指向的inode必须处于使用状态。
e),第一个子文件项必须是“.”,并且它的inode指向当前目录项inode自身。
f),第二个子文件项必须是“..”。
阶段2也会收集一些信息:每一个目录文件的所有子目录文件的inode号。
阶段3
阶段3用以检测并确保所有的目录文件都被正确的连接到文件系统树(filesystem tree,即是目录树,一个目录文件也就是这颗目录树里的一个节点),具体的算法如下:
首先,检测根节点是否存在,如果不存在,e2fsck则会新创建一个,标记根节点为“done”状态。
接着,遍历所有目录inode,对每一个目录inode,通过使用dirinfo.parent尝试去回溯目录树,如果这个目录文件被正确的被连接到文件系统树上,那么通过回溯必定达到被标记为“done”状态的根节点;如果回溯失败,则表示这个目录文件没有被正确的被连接到文件系统树上,e2fsck将把它连接到/lost+found目录树下。另外,在向上回溯的过程中,如果发现某一个目录文件(假设为目录文件A)出现了两次,那么表明出现了树回环,e2fsck同样将把这个目录文件(目录文件A)连接到/lost+found目录树下,以便打破树回环。
阶段4
阶段4扫描所有的inode(对应结构体ext2_inode),并且对每一个inode的引用计数做正确性检测(通过比较阶段1扫描出来的count值与阶段2和阶段3计算出来的count值),并尝试修正inode的links_count字段。在扫描过程中发现的引用计数为0的文件,e2fsck会将它们连接到/lost+found目录树下。
阶段5
阶段5验证块组(block group)的统计信息是否正确,这主要通过对前面几个阶段计算得到的位图块(包括data block bitmap、inode bitmap)与磁盘上位图块的比较进行判断,如有必要会尝试修复磁盘上的位图块。
其中阶段1是最消耗时间的,约占整个e2fsck执行时间的70%-90%;而阶段2也比较消耗时间,约占整个e2fsck执行时间的10%-25%;
这里有个表格显示了各个阶段的时间占用情况(来之:http://www.linux-kongress.org/2009/slides/ext4-fast-fsck_ted_tso.pdf):
e2fsck | on ext3 | e2fsck | on ext4 | |
---|---|---|---|---|
time | MB read | time | MB read | |
Pass 1 | 192.3 | 1324 | 9.87 | 203 |
Pass 2 | 11.81 | 260 | 6.34 | 261 |
Pass 3 | 0.01 | 1 | 0.01 | 1 |
Pass 4 | 0.13 | 0 | 0.18 | 0 |
Pass 5 | 6.56 | 3 | 2.24 | 2 |
Total | 211.1 | 1588 | 18.75 | 466 |
参考链接:http://e2fsprogs.sourceforge.net/ext2intro.html
http://e2fsprogs.sourceforge.net/
pdf本地下载:ext4-fast-fsck_ted_tso
转载请保留地址:http://www.lenky.info/archives/2012/02/1060 或 http://lenky.info/?p=1060
备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来信讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。
法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。
@lenky
好的,多谢博主
inode_loop_detect 这个bitmap记录的是个啥,一直搞不明白
这种太细节了,我不清楚了,gdb调下吧,单步查看肯定可以知道的
博主我再看e2fsck代码的时候遇到了一些问题,想咨询一下,可以有偿
用gdb调起来,一步一步看,啥都不是问题。
求助