上一篇简单介绍了一下什么是文件系统,最后我们尝试自己在一张A4纸上构造了一个属于我们自己的文件系统——happyfs。
可惜的是,我们这个 happyfs 并不为世人所知,它的闻名程度远不及大名鼎鼎的 ext2。ext2 是早期 linux 上使用的文件系统,堪称经典也不复杂。从它入手,比较简单,也方便以后我们学习更复杂的文件系统。
1 ext2 如何划分它的A4纸
图1 ext2全貌
看来 ext2 不太喜欢使用 A4 纸,它比较喜欢纸带。不过没关系,聪明的你一定也可以举一反三。从图1中可以看到,ext2 将纸带划分成了一个一个的“组”(除了第一个小方格外)。接下来,又把每个组具体再细分,划分出了超级块,组描述符表,块位图,inode 位图,inode 表,数据块。
别晕,这一堆名词我知道你很多看不懂,“数据块”你总能知道是什么吧。还记得上一篇文章中的图吗,那页A4纸从第11行开始存储数据,那一块就是数据块。
而从1到10行,保存是只是文件名称,位置等等相关信息,这种信息,通常只是为查找数据块在哪个位置和大小设定的,它有一个让人听起来不太爽的名字——元数据(metadata)。只不对对应到了 ext2 上,元数据变复杂了,于是就有了inode,超级块等等这些概念了。
2 何为 block
block 中译名叫块。物理磁盘是由一个个的区(所谓的扇区)连接成一片,每个区是 512 字节。为了能有组织,有计划的使用磁盘,设计者把连续若干个(比如2个,4个,8个)区连成一组,抽象出 block 的概念。如果使用 2 个区为一组,那一个 block 的大小就是 1KB。
如今,磁盘也不在是什么昂贵资源,动辄就是几百G大小,通常在设计 block 的时候都使用 8 区连成一组,即一个 block 是 4KB。
图1中虽然没有明确的划出一个个的 block,但是你心里要知道,这个纸带就是由一个个的 block 拼接而成的,只是接缝实在太完美,你看不见而已。
3 Boot Block
无论如何,Boot Block 都占用 1KB,它并不以你划分的 block 大小来改变自己。即使你划分的 block 大小是 4KB,Boot Block 也只占用 1KB 大小。这个块,是专门为启动CPU的时候保留的(我没说是启动操作系统)。
在你摁下开机键的那一刻,CPU 一上电,硬件会主动把 Boot Block 复制到内存的0x7c00这个位置,然后CPU 就从这个位置开始执行,后面的事情,就是一步一步的把操作系统引导起来。
4 ext2 元数据
4.1 inode 表和 inode 节点
凡是以后提到表的概念,都可以把它理解成数组。
如同上一篇中的第1行到第10行,它就是一个简化版本的 inode 表,而 inode 表里存放的就是一个个的 inode 节点。在 ext2 中,inode 表可能要占用若干个 block.
实际上,inode 节点就是一个比较大的结构体。
ext2 的 inode 节点里存储了更加丰富的内容,除了记录文件在哪个block上,还包含了文件的权限位,最近访问时间,最近修改时间等等。有一点比较特殊的是,文件的名字并没有保存在 inode 节点里,而是保存在一个称为目录项的结构体里。
4.2 inode 位图和 block 位图
位图,是一种常见的数据结构。它就好像是一张地图,每个 bit 位代表一个位置,如果为 0,表示这个位置没有被占用,如果为 1,表示该位置被占用。
那么 inode 位图就是用来记录 inode 表中哪个位置被占用了,block 位图,就是记录哪个 block 被占用了。等到后面的实验中,你就会深刻理解这一点。
4.3 组描述符表
一个组描述符表,它不仅存储当前组的信息,也会保存其它组的信息。这是一种备份思想。组描述符表中存储的组描述符。
组描述符中保存了 inode 位图和 block 位图在哪个 block 上。除此还有 inode 表的位置等等。
4.4 超级块
超级块记录了一全局信息,比如 inode 节点的个数,第一个数据块的位置,block 的大小(是1KB还是2KB还是4KB?),block 的个数等等。
5 总结
本篇介绍了 ext2 是如何划分磁盘的,以及一些常见的概念。这些概念看起来对于新手来说可能过于抽象,别担心,后面有实验部分。
需要注意的是:
- 不是所有的组都有块组描述符
- 块组描述符描述的是所有组的信息,一般来说只使用第0组中的就够了,其它组都只是备份而已。