
一、宏观认识
为了方便理解,前文将 LBA 地址直接对应到扇区进行讲解。但在虚拟文件系统(VFS)的视角下,磁盘的最小管理单位并非扇区,而是块(Block)。通常一个块大小为 4KB,由多个连续扇区组成(8 个)。以块为单位访问磁盘,不仅能一次性读写更多数据,还能利用数据的局部性原理提前缓存相关数据,从而显著提高内存缓存命中率和操作系统的整体效率。
例如我们面对 800GB 这样庞大的磁盘空间,直接管理非常困难,因此我们采用分层抽象与间接管理的策略,这与行政区域的划分逻辑类似:
- 磁盘抽象与分区(Partition):
首先,我们将物理上由多个盘面组成的磁盘抽象为一个线性的 LBA 地址空间。接着,借鉴'国家分省'的思路,将 800GB 空间逻辑划分为若干分区(例如一个 200GB 的分区)。- 实现方式: 使用
partition结构体记录每个分区的起始和结束 LBA 地址(整数),并通过part结构体集合来管理所有分区。
- 实现方式: 使用
struct partion{ int begin; int end; }
struct partion part[]
注意: 分区仅是逻辑划分,不改变物理盘面结构,底层仍通过 LBA 转换为 CHS 地址访问物理扇区。
-
块组划分(Block Group):
即便 200GB 的分区,直接管理依然复杂。我们继续沿用'分治'思想,将其细分为更小的单元(例如 20 个 10GB 的组)。只要掌握了管理一个 10GB 组的方法,就能复制该逻辑管理其余 19 个组,进而管理整个分区,最终实现对 800GB 磁盘的全盘管理。 -
文件系统介入:
当空间被细化到 10GB 的块组级别后,如何具体管理这些块组内的文件、目录和空闲空间?这就需要引入具体的文件系统实现,在 Linux 中,这正是 ext2 文件系统 发挥作用的地方。 -
在硬盘上存储文件前,必须先将其格式化为某种文件系统,以便系统组织和管理文件。
-
在 Linux 系统中,最常见的是 ext2 系列文件系统,包括早期的 ext2 以及后来的 ext3 和 ext4。
-
尽管 ext3 和 ext4 在功能上有所增强,但它们的核心设计仍基于 ext2,因此我们以 ext2 为例进行说明。
-
ext2 文件系统将整个分区划分为若干大小相同的块组(Block Group)。只要掌握了单个块组的管理方式,就可以管理整个分区,从而实现对磁盘上所有文件的统一管理。
注意:上图中的启动块(Boot Block/Sector)的大小是确定的为 1KB。由 PC 标准规定,用来储存磁盘分区信息和启动信息,任何文件系统都不能修改启动块,启动块之后才是 Ext2 文件系统的开始。
二、Block Group 内部构成
我们上面说到 Ext2 文件系统会根据分区的大小划分为数个 Block Group,且每个块组内的结构组成相同,所以我们管理好了一个块组就能管理好其他块组。那我们就来看看他的内部结构究竟是如何组成的?







