一、文件系统框架:
从下图可以看到整个文件系统包含:
- 用户层:用户空间对文件的读写操作open/read/write等;
- VFS层:虚拟文件系统层,承上启下,为上下层提供接口;
- 文件系统层:可以存在很多类型的文件系统,VFS层的接口会调用到不同的文件系统层的接口;
- 缓存层:文件系统底下有缓存,Page Cache,加速性能;
- 块设备驱动层:对硬盘进行读写操作进行管理;
二、EXT4文件系统布局
linux ext4 文件系统,将磁盘分成一系列块组,磁盘的布局可以用如下图显示:
1、超级块(SuperBlock):
用于描述文件系统的配置信息:block的总数量和空闲数量、块组的数量、inode的数量等,存储这些
占用1kb的大小,只有块组号是3, 5 ,7的幂的块组(譬如说1,3,5,7,9,25,49…)才备份这个拷贝。通常情况下,
只有主拷贝(第0块块组)的超级块信息被文件系统使用,其它拷贝只有在主拷贝被破坏的情况下才使用。
可以使用dumpe2fs来查看超级快的内容如下:
对应的描叙超级块信息的结构体:./kernel-4.9/fs/ext4/ext4.h
2、块组描述符(GDT):
块组描叙符用保存开组的信息,其占用一个或者多个数据块,具体取决于文件系统的大小,
它主要包含块位图,inode位图和inode表位置,当前空闲块数,inode数以及使用的目录数:
3、数据块位图(Block Bitmap):
块位图用于描述该块组所管理的块的分配状态。如果某个块对应的位未置位,那么代表该块未分配,
可以用于存储数据;否则,代表该块已经用于存储数据或者该块不能够使用(譬如该块物理上不存在)。由
于块位图仅占一个块,因此这也就决定了块组的大小;
4、inode位图(Inode Bitmap):
Inode位图用于描述该块组所管理的inode的分配状态。我们知道inode是用于描述文件的元数据,每个inode
对应文件系统中唯一的一个号,如果inode位图中相应位置位,那么代表该inode已经分配出去,否则可以使用;
5、节点表(Inode Table):
为了找到与一个文件相关的信息,必须遍历目录文件找到与文件相关的目录项,然后加载inode找到该文件
的元数据。inode存储了inode号、文件属性元数据、指向文件占用的block的指针,每一个inode占用128字节或
256字节。举例:每一个家庭都要向派出所登记户口信息,通过户口本可以知道家庭住址,而每个镇或街道的派
出所将本镇或本街道的所有户口整合在一起,要查找某一户地址时,在派出所就能快速查找到。inode table就是
这里的派出所。其中inode结构体如下:
作者:frank_zyp