ext2文件系统
有了前面对"块","分区","inode"这些概念的铺垫,接下来我们可以正式来讲文件系统了。
我们想要在硬盘上存储文件,必须先把硬盘格式化为某种格式的文件系统,而文件系统的目的就是组织和管理硬盘中的文件。在 Linux 中,最常见的就是 ext2 文件系统,后面发展出的 ext3 和 ext4 对 ext2 进行了增强,但其核心设计未改变,所以相对简单的 ext2 是了解文件系统很好的一个起点。
我们通过一个图来慢慢梳理文件系统中的各种关系:

可以看到,硬盘的一个分区有对应的文件系统管理,而文件系统之下,由分为不同的块组,也就是 Block Group ,每个块组中有着相同的结构,我们一个一个来看。
Super Block(超级块)
超级块存放着文件系统本身的结构信息,描述着整个分区的文件系统信息 。超级块的重要性毋庸置疑,所以为了保证文件系统在磁盘部分扇区出问题的情况下还能正常工作,超级块在每个块组中都可能有备份(第一个组块必须有)。
超级块中存放的信息主要有:bolck 和 inode 的总量,未使用的 bolck 和 inode 的数量,还有最近一次挂载的时间,最近一次写入数据的时间等。
GDT(Group Descriptor Table 块组描述符表 )
块组描述符表用来描述块组的属性信息,每个块组都有其对应的块组描述符表。我们说一个分区中有多个组块,而超级块是管理一个分区,GDT是管理一个组块,还是挺好区分的,就是大队长和小队长的关系。
GDT中的数据包括从哪里开始是 inode Table,从哪里开始是 Data Blocks 等。
Block Bitmap(块位图)
块位图中记录着 Data Block 中哪个数据块已经被占用,哪些没有。
inode Bitmap(inode位图)
inode位图中的每一个 bit 位表示一个 inode 是否空闲可用。
inode Table(inode 节点表)
inode 节点表里存放着文件的属性,是当前分区所有 inode 属性的集合。
它的编号以分区为单位,整体划分,不可跨分区,意味着一个分区内不存在相同的 inode 编号。
Data Blocks(数据区)
数据区中存放的就是文件的内容,数据区中有一个个数据块。
对于普通文件,文件的数据存储在数据块中。
对于目录,该目录下的所有文件名和目录名存储在该目录的数据块中(回答了上一篇博客中文件名如何处置的问题)。
Block 号也是按分区划分,不可跨分区,和 inode 一样在同一个分区中属于独一无二的存在。
总结
分区之后的格式化操作,就是对分区进行分组,在每个分区中写入 Super Block,GDT 等管理信息,这些管理信息统称为:文件系统。
只要知道文件的 inode 号,就能在指定分区中确定是哪一个分组,进而在分组中确定是哪一个inode 。