本文将介绍Ext3文件系统的磁盘存储组织与实现,这里的表述将不涉及file system在内核中的内存表示和使用方法。
Ext3 Disk Layout:
首先我们来看一下在一个磁盘上面的结构:
这张图说明了一整块磁盘的组织结构,整个磁盘可以分为MBR,Partition table和Disk partition三个部分组成。MBR(Master Boot Record)是用来引导计算机的。Partition table是记录每个disk partition的起始和结束位置。其中有一个disk partition是活动分区(marked as active)。当计算机启动时,BIOS读入并执行MBR。由MBR确定哪个分区是活动分区,并读入其第一个block(即boot block),并且执行。在boot block中的程序会装载该分区中的操作系统。
Disk Partition的结构如下图所示: (你可能发现是ext2的结构,这里要说明的是ext3和ext2在磁盘结构上基本没有区别,唯一的不同是ext3加入了日志系统)
你可能会问磁盘分区是什么?我的理解是磁盘分区是将一整块磁盘按照用户不同的意愿来划分的一个个区域,不同的磁盘分区可以安装不同的文件系统。
在ext3中Disk Partition由以下部分组成,这里我们将一一介绍:
1. boot block
boot block是用于启动系统的,在前面我已经提到:当计算机启动时,BIOS读入并执行MBR。由MBR确定哪个分区是活动分区,并读入其第一个block(即boot block),并且执行。在boot block中的程序会装载该分区中的操作系统。
2. super block
你可能会奇怪在上图中Boot Block之后应该是一个个Block Group,没错,但那是物理上的存储方式,而逻辑上super block是整个partitioin一个的,而上图中把super block放在每个block group中的原因是由于super block记录着整个分区的元信息非常重要,所以这里通过冗余的存储使得磁盘修复程序可以修复磁盘的错误。 也就是说这里每个block group中存储的superblock是完全相同的,而且通常情况下只有第一个group的superblock会被用到。这里提一下的是具体的实现中也不一定是每个group都复制super block,而是有选择性的进行冗余,这里我们就不再深入这些细节了。
为了更直观的看到一个superblock记录哪些信息,我们来看一下通过dumpe2fs工具看到的有关superblock的信息,我们在shell下执行 dumpe2fs /dev/sda3。 这里/dev/sda3是一个磁盘分区。
3. group descriptors
group descriptors其实与super block一样是每个分区一份。这里要注意的是descriptor使用的是复数形式,也就是说这里存储着分区中所有的group的描述信息。而为什么要将他们也每个group复制一份呢,这里的理由我认为是:按理说应该每个group保存自己的group descriptor,不过由于一个descriptor非常小只有32B,将所有的都存在一起每16GB的磁盘才会占用一个block,所以对磁盘的占用来说基本没有什么影响,另一个原因也是为了便于修复。同样和super block一样在具体实现中也不一定是每个group都做冗余。
4. block group
接下来我们终于要介绍block group这个概念了,其实如果不分group,而是每个分区的作为一个group,这样的设计同样可以工作,事实上早期的一些file system设计就是没有group概念的。但是这样会带来一个问题,就是如果一个文件的i-node和这个文件的磁盘块在磁盘上的物理存储相隔很远,或者是这个文件使用的不同块相隔很远,这样会导致大量的时间花在磁盘寻道上。而group概念的推出就是为了解决这个问题。我们可以看到,一个group中会包含inode和data block,这样就可以让一个文件的inode和它所用到的block都包含在一个group中。
为了更直观的看到一个group记录哪些信息,同样我们使用dump2ef来看一下:
上图显示了Group0-2的信息。这里先回答一下这样一个问题,在一个磁盘分区上有多少个group?我们可以看到在superblock的元信息中包含了blocks per group=32768,那么我们把partition size/32768就可以得出结论,这里你可能会有一个疑问,为什么不把boot block的大小减去呢?这里的原因是boot block的大小是1k,它和第一个group的superblock共用一个block。具体的细节查看另一篇文章:查看ext3文件系统分区的superblock
我们可以看到Group0按次序存储着:
superblock(0),group descriptors(1-17),Reserved block(18-1024),Block bitmap(1025),Inode bitmap(1026), Inode table(1027-2050),最后是Data Block
这里要解释下的是Block bitmap,Inode bitmap和Inode table
Block bitmap和Inode bitmap分别是用来记录在这个group中块的使用情况和inode的使用情况,而inode table是记录所有属于这个group的inode。