02.07.2013 Views

文件系统检查工具—fsck 研究

文件系统检查工具—fsck 研究

文件系统检查工具—fsck 研究

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

当文件系统中有很多 inode 存在的时候(即很多文件),有可能会有几个 inode corrupt。<br />

文件系统中的 inode 链表是从 inode2 开始顺序被检查的(inode0 标记没有用过的 inode,inode1<br />

用来将来的扩展),直到文件系统中的最后一个 inode。Inode 的状态检查包括:format and type,<br />

link count, duplicated blocks, bad blocks, and inode size。<br />

每个 inode 都有一个 mode word,它描述了 inode 的 type 和 state。Inode 必须处于六种类<br />

型之一:普通 inode,目录 inode,symbolink inode,special block inode,special character inode,<br />

或者是 socket inode。<br />

Indoe 有三种 allocation 状态:unallocated,allocated 和不属于前两种情况的情况。在第<br />

三种状态的 inode 就是不正确的 inode,当 inodes 链表被写入坏的数据的时候,inode 有可能<br />

进入这种状态。唯一可能修复的方法是 fsck 清空这个 inode(在链表中删除之)。<br />

4. inode links<br />

连接数是计算每一个 inode 与其相连的目录项的数目。fsck 从文件系统的 root 目录开始<br />

检查每一个 inode 的连接数,并沿着目录树依次查找。每个 inode 的实际 link count 在遍历的<br />

时候计算得到。<br />

如果存储的 link count 非 0,而计算的 link count 为 0,则此 inode 没有对应的目录项。这<br />

种情况下,fsck 将把这个对应的文件放入 lost+fount 目录中。如果存储的 link count 与实际<br />

计算所得的值非 0 且不相等,那么可能是 inode 的 link count 在有一个目录加入或删除的时<br />

候没有被相应更新。这种情况下,fsck 会用计算得到的值更新存储的值。<br />

每个 inode 都包含一个列表或者是列表的指针,上面记录着这个 inode 所使用的数据块。<br />

因为 inode 是这些列表的拥有者,因此,当这些列表存在不一致的情况时,就直接影响到拥<br />

有它的 inode。<br />

Fsck 会将一个 inode 声明的 block number 与列表中已经分配的 block number 比较。如果<br />

另一个 inode 已经声明了一个 block number,那么这个 block number 就被加入到一个 duplicate<br />

block 链表中。否则,已分配的 block list 中会将这个 block number 加入。<br />

对任何 duplicate blocks,fsck 将会遍历 inode list 找到拥有 duplicated block 的 inode。一般<br />

而言,拥有最早修改时间的 inode 坏掉的可能性比较大,需要被 clear。如果是这种情况,fsck<br />

将执行操作,clear 这两个 inodes。操作必须决定,哪个该留,哪个该 clear。<br />

Fsck 检查每个 inode 声明的 block number 的范围,如果 block number 比文件系统中第一<br />

个数据块的块号低,或者比文件系统中的最后一个数据块的块号大,则称为 bad block<br />

number。一个 inode 中许多的 bad blocks 经常是由于一个 indirect block 没有被写入到文件系<br />

统中,发生这种情况的前提是由于有硬件异常的产生。如果一个 inode 含有 bad block<br />

numbers,fsck 会将其 clear。<br />

5. inode data size<br />

每个 inode 包含一定数量的 data blocks。实际 data block 的数量是所有 allocated data blocks<br />

和 indirect blocks 的总和。Fsck 计算实际的 data blocks 的数量,并与 inode 所记录的数值进<br />

行比较。如果两者不一致,fsck 会进行修正。<br />

每个 inode 包含了一个 32 位的 size 域。这个数是 inode 对应的文件所含有的字节数。这<br />

个 size 域的一致性检查是通过计算与 inode 对应的最大数量的 blocks 数,与实际 inode 保存<br />

的数值比较。<br />

6. checking the data with an inode<br />

一个 inode 可以直接或间接的 reference 三种类型的 data blocks。所有的 referenced blocks<br />

必须是同种类型。这三种类型是:plain data blocks, symbolic link data blocks 和 directory data<br />

blocks。Plain data blocks 包含文件中保存的信息。symbolic link data blocks 包含一个 link 中

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!