一、文件系统框架:

  从下图可以看到整个文件系统包含:

  • 用户层:用户空间对文件的读写操作open/read/write等;
  • VFS层:虚拟文件系统层,承上启下,为上下层提供接口;
  • 文件系统层:可以存在很多类型的文件系统,VFS层的接口会调用到不同的文件系统层的接口;
  • 缓存层:文件系统底下有缓存,Page Cache,加速性能;
  • 块设备驱动层:对硬盘进行读写操作进行管理;

xfs文件系统架构 文件系统的架构_xfs文件系统架构

二、EXT4文件系统布局

 linux ext4 文件系统,将磁盘分成一系列块组,磁盘的布局可以用如下图显示:

xfs文件系统架构 文件系统的架构_位图_02

xfs文件系统架构 文件系统的架构_文件系统_03

 

1、超级块(SuperBlock):

  用于描述文件系统的配置信息:block的总数量和空闲数量、块组的数量、inode的数量等,存储这些

占用1kb的大小,只有块组号是3, 5 ,7的幂的块组(譬如说1,3,5,7,9,25,49…)才备份这个拷贝。通常情况下,

只有主拷贝(第0块块组)的超级块信息被文件系统使用,其它拷贝只有在主拷贝被破坏的情况下才使用。

可以使用dumpe2fs来查看超级快的内容如下:

xfs文件系统架构 文件系统的架构_xfs文件系统架构_04

对应的描叙超级块信息的结构体:./kernel-4.9/fs/ext4/ext4.h

xfs文件系统架构 文件系统的架构_文件系统_05

2、块组描述符(GDT):

  块组描叙符用保存开组的信息,其占用一个或者多个数据块,具体取决于文件系统的大小,

它主要包含块位图,inode位图和inode表位置,当前空闲块数,inode数以及使用的目录数:

xfs文件系统架构 文件系统的架构_元数据_06

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结构体如下:

xfs文件系统架构 文件系统的架构_xfs文件系统架构_07

xfs文件系统架构 文件系统的架构_xfs文件系统架构_08

作者:frank_zyp