前言
在上一节中,我们留下了两个未解之谜:
- 问题一:块是如何在分区上排布的?我们该如何高效地找到目标块?
- 问题二:inode 又存放在分区的什么位置?
其实,这两个问题的答案都指向同一个核心概念——文件系统。
还记得我们在 inode 结构定义中看到的 ext2_inode 吗?这个 ext2 就是我们要介绍的第一个真正意义上的 Linux 文件系统——Ext2(Second Extended File System)。
Ext2 的历史地位:
- 1993 年由 Rémy Card 设计开发
- 是 Linux 历史上第一个高性能的文件系统
- 虽然现在已被 Ext3/Ext4 取代,但其核心设计思想影响深远
一、宏观认识
为了方便理解,前文将 LBA 地址直接对应到扇区进行讲解。但在虚拟文件系统(VFS)的视角下,磁盘的最小管理单位并非扇区,而是块(Block)。通常一个块大小为 4KB,由多个连续扇区组成(8 个)。以块为单位访问磁盘,不仅能一次性读写更多数据,还能利用数据的局部性原理提前缓存相关数据,从而显著提高内存缓存命中率和操作系统的整体效率。
例如我们面对 800GB 这样庞大的磁盘空间,直接管理非常困难,因此我们采用分层抽象与间接管理的策略,这与行政区域的划分逻辑类似:
- 磁盘抽象与分区(Partition):
首先,我们将物理上由多个盘面组成的磁盘抽象为一个线性的 LBA 地址空间。接着,借鉴'国家分省'的思路,将 800GB 空间逻辑划分为若干分区(例如一个 200GB 的分区)。- 实现方式: 使用
partition结构体记录每个分区的起始和结束 LBA 地址(整数),并通过part结构体集合来管理所有分区。
- 实现方式: 使用
struct partition { int begin; int end; }
struct partition part[];
注意: 分区仅是逻辑划分,不改变物理盘面结构,底层仍通过 LBA 转换为 CHS 地址访问物理扇区。
- 块组划分(Block Group):
即便 200GB 的分区,直接管理依然复杂。我们继续沿用'分治'思想,将其细分为更小的单元(例如 20 个 10GB 的组)。只要掌握了管理一个 10GB 组的方法,就能复制该逻辑管理其余 19 个组,进而管理整个分区,最终实现对 800GB 磁盘的全盘管理。 - 文件系统介入:
当空间被细化到 10GB 的块组级别后,如何具体管理这些块组内的文件、目录和空闲空间?这就需要引入具体的文件系统实现,在 Linux 中,这正是 ext2 文件系统 发挥作用的地方。








