Chinaunix首页 | 论坛 | 博客
  • 博客访问: 51817
  • 博文数量: 9
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 87
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-04 23:05
文章分类

全部博文(9)

文章存档

2015年(7)

2014年(2)

我的朋友

分类: LINUX

2014-10-31 21:27:26

原文地址:fsck原理详解 作者:silence0607

要理解fsck的原理我们应该要了解一下i节点这种记录文件的机制。
linux系统给每个文件赋予了一个i节点的数据结构,其中列出了文件属性和文件块的磁盘地址,如下图:
文件属性
磁盘块0的地址
磁盘块1的地址
磁盘块2的地址
磁盘块3的地址
磁盘块4的地址
采用这种方式,在我们打开文件的时候,其对应的i节点才会加载到内存中,如果每个i节点占n个字节,最多k个
文件同时打开,则为打开文件而保留的数组所占据的全部内存为kn个字节。这种方式比在内存中使用文件分配表
效率高很多,同时占据的空间小,它的大小只与打开的文件数有关,与磁盘是100G还是1000G无关!(100G的磁盘
1KB大小的块,对应的文件分配表大小为600MB~800MB)
要对i节点有更多的了解,可以看下我转载的关于inode节点的那篇文章。
好了。现在回到我们的主题,很多文件系统读取磁盘块,进行修改后再写回磁盘。但是如果在修改过的磁盘块全部
写回之前系统崩溃怎么办?我们怎么去保证文件系统的一致性,如果没有被写回的块是i节点,目录块或者是包含
空闲表的块时这将会造成很大的麻烦!

为了解决这个问题,我们的工具—fsck出场了,下面我们来谈谈fsck是怎么工作的=。=
一致性的检查分为两种:块的一致性检查和文件的一致性检查。在检查块的一致性时,fsck程序构造两张表,
每张表为块设立一个计数器,都初始化为0。第一张表中的计数器跟踪该块在文件中出现的次数,第二张表中的计数器
跟踪空闲表中的出现次数。接着fsck程序使用原始设备读取全部的i节点,忽略文件的结构,只返回所有的磁盘块,从0
i节点开始,可以建立相应文件的全部块的块号表。每当读到一个块号时,该块在第一个表中的计数器加1,然后程序读
空闲表或位图,查找全部未使用的块,当在空闲表中找到一个块时,第二张表相应的计数器加1。

那么如何判断文件系统一致呢?
哈哈,如果我们的文件系统一致,每一个块要么在第一张表中计数为1,要么在第二张表中技术为1。那要是不是这样呢?
OK,我们再来看看出错的情况:
1101011110011100       使用的块
0000100001100011        空闲块
上面这种情况,磁盘块2没有出现在任何一张表中,称为块丢失,尽管它不会造成实际的损害,但是浪费磁盘空间啊
解决方法:fsck程序只需要将它加入到空闲表中即可。

1101011110011100       使用的块
0010200001100011        空闲块
这种情况磁盘块4在空闲表中出现2次(只在空闲表是真正意义上的一张表时,才会出现重复,在位图中,不会出现类似情况)
解决方法:fsck程序只要重新建立空闲表即可。

1101021110011100       使用的块
0010100001100011        空闲块
这种情况有点复杂,磁盘块5在表中出现两次,如果删除它对应的文件,那么磁盘块5在两张表中的计数都是1,同时处于使用
和空闲状态。若删除它对应的两个文件,则在空闲块出现2次,那我们的fsck程序如何解决呢?
解决方法:fsck程序先分配一空闲块,把磁盘块5中的内容复制到空闲块中,然后把它插到其中一个文件中。这样文件的内容未
,但是内容几乎是不正确的,但至少保证了文件系统的一致性。这一错误应该反馈给用户,让用户去检查文件的受损情况。

除了检查磁盘块的正确性之外,fsck程序还检查目录系统,这个..........还是留给自己去思考吧学习操作系统就是要学习它的设
思想,
理念,将它运用到实际的问题当中去解决问题!

阅读(1922) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:DRBD源码分析(一)——内核模块初始化

给主人留下些什么吧!~~