首页 > *nix技术, Shell命令, 文件系统 > e2fsck命令内幕

e2fsck命令内幕

2012年2月10日 发表评论 阅读评论 15,726 次浏览

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/1060http://lenky.info/?p=1060


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。