“Extent映射能使用这里交付的区间,但映射连续性与空闲连续性是两个不同状态。文件删去中间一段后,物理空间是否能立即回收,还要检查快照、未完成I/O与恢复根是否仍引用它;本页只能合并已经真正…”
连续1000个文件块若恰好存放在连续1000个设备块中,逐块记录1000个地址显得重复。文件块映射理路文件块映射与空间分配File block mapping · Direct and indirect blocks · 文件块位图分配由文件字节偏移经过inode直接和间接指针找到设备块,并把数据、大小、指针和空闲位图的共同恢复义务列全。可以改记“从哪里开始、连续多少块、落在设备哪里”。这样的记录叫 extent;它压缩的是连续映射关系,文件内容本身没有被压缩。
形式陈述
一条记录对应两个等长区间
设块大小为
教学表按
对字节偏移
本例采用单文件私有数据块,extent的物理区间也不得重叠,且不占用保留元数据块。支持reflink或快照的系统可以允许受管理的共享物理块,但那需要额外引用与写入规则,不能直接沿用“旧块释放后立即复用”的私有所有权判断。
直觉
压缩连续关系,保留随机定位
记录
大文件可能需要树形索引。树只是帮助找到那条前驱记录,叶子记录的区间含义不变。实际ext4把文件逻辑起点、长度、物理起点放在extent叶子中,内节点负责下一层定位;文件很连续时,一条extent能替代很多逐块指针。外部碎片严重时,记录数量仍会增长,不能假定任何大文件都只有一条记录。
两边连续才有合并意义
相邻记录
且初始化、共享等属性兼容时,才可合成
例子与边界
1553号字节在哪里
重置DISK-32教学快照:设备块0到31,每块256字节,文件长度
| 文件逻辑块 | 设备块或含义 |
|---|---|
| 0、1、2 | 8、9、10 |
| 3、4 | 洞,读零 |
| 5、6、7、8 | 20、21、22、23 |
| 9、10 | 洞,读零 |
偏移1553满足
覆盖中间两块会把一条记录拆开
现在为文件块6和7取得两个新设备块12和13,并准备把它们改映射到新位置。原记录
一般覆盖
上面的三片不能重新合并:20之后应是21,但中间实际从12开始;中间12、13之后应是14,右片却在23。映射记录变多,是这次实际物理布局的结果。洞3、4、9、10完全未动;已用设备块总数仍是7,但从21、22换成12、13。
一张正确的新表还不等于安全落盘
发布前,旧表仍指向21、22。若先把它们交给另一文件覆盖,再发生崩溃恢复旧表,旧文件就会读到别人的内容。因此,新数据写入、映射发布、旧块回收必须服从已有持久化协议;本页的区间计算只决定新表应当是什么。
实际ext4还区分未初始化extent。这样的extent已经拥有物理空间,但不能因此把盘上的旧字节暴露为文件内容;读取语义仍需要按未初始化状态处理。它与“没有物理分配”的稀疏洞都可能读出零,空闲空间扣账却不同。扩大本页模型时应把这个状态写进记录,并禁止随意跨状态合并。
推论与应用
检查映射可以分成三张账
第一张是文件语义:每个有效字节要么由恰好一个已初始化extent提供,要么属于明确的洞。第二张是物理所有权:所有引用的设备块确实归本文件使用,新旧版本过渡中尚不能回收的块也仍被保留。第三张是持久性:恢复选中的映射只能指向已经完整持久的数据。这三项可分别检查,少一项都可能造成错误。
分配连续物理区间的具体选择可见文件系统空闲区间管理理路文件系统空闲区间管理Free-space extent management · 空闲区间双索引 · First fit and best fit ranges把设备空闲块组织成最大连续区间,维护地址和长度两种索引,执行首次适配、最佳适配与左右合并,并用双向反例区分策略。。如果底层只能交付若干分散区间,文件仍可用多条extent表示;连续性关系到元数据数量和I/O形状,不是文件能否具有连续字节地址的前提。
迁移练习:把新物理起点12改成21,覆盖内容更新但布局回到原来的连续位置。新表三片此时可以合回
参考资料
- Linux内核文档,ext4 “The Contents of inode.i_block”,§4.2.3 Extent Tree,查阅于2026-10-09:叶子和内节点字段、初始化状态与小文件根内记录。DISK-32、拆分公式及寻址数值为本页自定模型与推导。