一、宏观认识
磁盘的空间一般都非常大,操作系统想要直接进行管理就比较困难,这时候就可以借鉴'分治'的管理思想。
比如国家的管理:先划分省,再由省划分市,再由市划分乡镇...,这样只要管理好乡镇,就相当于管理好了市,管理好了市,就相当于管理好了省,以此类推,就管理好了整个国家。
操作系统对磁盘的管理也是这样,先将磁盘进行划区(Partition),然后对一个区引入文件系统进行管理,其他区复制该管理方式即可实现对整盘的管理。本质就是将区格式化为某种格式的文件系统。

上图中启动块(Boot Sector)的大小是确定的,为 1KB,由 PC 标准规定,用来存储磁盘分区信息和启动信息,任何文件系统都不能修改启动块。启动块之后才是 ext2 文件系统的开始。
二、Block Group
前面讲到磁盘的最小存储单元是扇区(0.5KB),但如果以扇区为单位向磁盘读写数据就会导致效率太低,所以Ext2 文件系统以数据块(常见为 4KB,8 个扇区)为单位进行数据的读写。而系统默认的一个 Block Group 包含 8192 个数据块,即 32MB。
以最小数据块为单位访问磁盘,不仅能一次性读写更多数据,还能利用数据的局部性原理提前缓存相关数据,从而显著提高内存缓存命中率和操作系统的整体效率。
所以,Ext2 文件系统将区又划分块进行管理,类似于省分治市。每个块都有相同的结构,最小数据块的大小在格式化时进行配置,常见的块大小有 1KB、2KB、4KB,部分架构下最大支持 8KB,Block Group 的大小根据数据块大小而异。通常情况下块的大小为 4KB(8 个扇区)。
注意:
文件系统最小存储单位为 数据块(假设 4KB),所以在 Block Group 中所有的结构都是以 最小数据块为单位进行存储的。即超级块,位图,inode 节点表,inode 节点,数据块的大小都是以 最小数据块(4KB)为单位的。
三、Block Group 内部结构
3.1、超级块——Super Block
存放文件系统本身的结构信息,描述整个分区的文件系统信息。
记录的信息主要有:block 和 inode 的总量,未使用的 block 和 inode 的数量,一个 block 和 inode 的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。
可见其重要性,如果 Super Block 的信息被破坏,可以说整个文件系统结构就被破坏了。所以,Super Block 没有放在区分里,而是放在块中,相当于有多个备份,这些 Super Block 中的数据保持一致。
/* * Structure of the super block */ // 超级块的结构定义
struct ext2_super_block {
__le32 s_inodes_count; // 索引节点(inode)总数
__le32 s_blocks_count; // 数据块总数
__le32 s_r_blocks_count; // 保留数据块总数(预留供超级用户/系统使用,防止磁盘占满导致系统异常)
__le32 s_free_blocks_count;
__le32 s_free_inodes_count;
__le32 s_first_data_block;
__le32 s_log_block_size;
__le32 s_log_frag_size;
__le32 s_blocks_per_group;
__le32 s_frags_per_group;
__le32 s_inodes_per_group;
__le32 s_mtime;
__le32 s_wtime;
__le16 s_mnt_count;
__le16 s_max_mnt_count;
__le16 s_inode_size;
__le16 s_block_group_nr;
s_last_mounted[];
};







