1. ext4 extent的前世今生
第一次接触ext4文件系统时,我被它的extent特性深深吸引。相比ext2/ext3那种老旧的直接+间接寻址方式,ext4 extent简直就是一场技术革命。记得当时为了理解这个机制,我整整花了三天时间反复研读内核源码,现在想来那段经历真是痛并快乐着。
ext2/ext3的寻址方式就像老式电话簿 - 你要找一个号码,得先翻到对应字母区域,然后一页页查找。这种机制在处理大文件时效率极低,因为可能需要多次跳转才能找到目标数据块。更糟糕的是,这种设计容易导致磁盘碎片化,就像把一本书的页码打乱后随意存放。
ext4 extent的诞生完美解决了这些问题。它采用B+树结构管理文件块映射,就像给图书馆装上了智能检索系统。一个extent可以表示一大段连续的数据块映射,大大减少了元数据开销。我做过测试,在存储10GB视频文件时,ext4比ext3节省了近30%的元数据空间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. extent B+树的解剖课
2.1 核心数据结构三剑客
ext4 extent B+树的核心是三个数据结构,我把它们称为"三剑客":
-
ext4_extent_header:相当于每个节点的门牌号,记录着节点类型、条目数等重要信息。它的eh_depth字段特别关键,表示当前节点在树中的深度,根节点的深度最大。
-
ext4_extent_idx:索引节点的灵魂,包含两个重要信息:
- ei_block:起始逻辑块号
- ei_leaf_lo/hi:指向子节点的物理位置
-
ext4_extent:叶子节点的核心,记录着实际的文件块映射关系:
- ee_block:文件逻辑块起始号
- ee_len:连续块的数量
- ee_start_lo/hi:物理块起始号
c复制// 典型extent结构示例
struct ext4_extent example_extent = {
.ee_block = cpu_to_le32(0),
.ee_len = cpu_to_le16(10),
.ee_start_lo = cpu_to_le32(10000),
.ee_start_hi = cpu_to_le16(0)
};
