如何入手才能更好的理解一个文件系统呢?个人认为首先应该从文件系统在磁盘上的元数据分布入手,其次再看文件系统的软件实现,例如内存中的结构以及元数据操作方式等等。这里我想通过ext3在磁盘上的元数据信息来认识一下ext3文件树。
考虑一下,如果想要实现一个文件系统,我们需要在磁盘上存储哪些基本要素?通过何种方式组织起文件与目录之间的关系?如何管理实际的物理资源块?在ext3文件系统中,inode这个数据结构承担了重要角色,组织起了整个ext3文件系统框架。另外,在ext3文件系统中采用物理资源分组管理的办法,并采用bitmap位图信息描述物理块被使用情况。
文件系统在磁盘上的数据分布如下图所示:
Ext3采用块组的方式组织所有的物理磁盘空间,superblock和block set description信息可以采用稀疏存储的方式在块组中保存。每个块组中有两个最重要的成员:
1,inode块及其bitmap。Inode Bitmap用于描述这个块组中inode资源块的使用情况,blk for inodes是用来存储inode的资源块。需要分配一个inode时,文件系统需要将对应的bitmap置位。
2,blks块及其bitmap。在每个块组中绝大部分的空间被数据资源块占有,并且采用block bitmap对其使用情况进行描述。需要分配一个资源块时,文件系统需要将对应的bitmap置位。
Inode是ext3文件系统的纽带,其采用何种方式将文件系统表述出来的呢? 下图说明了采用inode建立的文件系统树。
在ext3文件系统中,必须有一个root inode,该inode在磁盘上的位置是固定的,在文件系统启动的时候,root inode是文件系统的入口。Root inode描述的是一个目录项,即其指向的数据块中存储着目录项。每个目录项会指向下一个inode,如果目录项描述的是一个普通文件,那么下一个inode会分配物理块,并且将文件数据存储到物理块中;如果目录项描述的是下一级目录,那么,下一个inode分配的block中会存储下一级目录的目录项。通过inode和目录项,ext3构建起了一颗庞大的文件树。
一旦脑海中拥有以inode为基础的文件树之后,阅读分析ext3的软件实现代码就相对容易了。另外,如果我们想要做ext3的文件系统数据恢复,那么我们也需要理解这样一颗文件树,以及数据结构的详细定义。