第 4 章 文件系统
从文件命名、结构、类型和操作进入目录、文件与目录实现、共享、日志结构/日志文件系统、VFS、空间管理、备份与一致性。覆盖34个正式目录坐标。
直觉起点
、、、、共同构成本页坐标。从文件命名、结构、类型和操作进入目录、文件与目录实现、共享、日志结构/日志文件系统、VFS、空间管理、备份与一致性。 学习时先预测内核下一状态,再运行样本;最终输出正确不能证明调度、地址、设备、持久化与清理都正确。
六阶段资源链
1. 解析路径名
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“第4章 文件系统”先在“解析路径名”写出输入与预测,再推进到“定位目录项”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
2. 定位目录项
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.1 文件”先在“定位目录项”写出输入与预测,再推进到“读取文件元数据”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
3. 读取文件元数据
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.1.1 文件命名”先在“读取文件元数据”写出输入与预测,再推进到“映射数据块”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4. 映射数据块
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.1.2 文件结构”先在“映射数据块”写出输入与预测,再推进到“提交日志事务”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
5. 提交日志事务
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.1.3 文件类型”先在“提交日志事务”写出输入与预测,再推进到“检查崩溃一致性”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
6. 检查崩溃一致性
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.1.4 文件访问”先在“检查崩溃一致性”写出输入与预测,再推进到“解析路径名”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
核心机制深挖
从文件命名、结构、类型和操作进入目录、文件与目录实现、共享、日志结构/日志文件系统、VFS、空间管理、备份与一致性。 本页把每个目录概念放回“解析路径名 → 定位目录项 → 读取文件元数据 → 映射数据块 → 提交日志事务 → 检查崩溃一致性”的资源状态机。输入可能是系统调用、地址、字节流、中断、资源请求或远程消息;状态可能位于进程表、页表、驱动队列、文件元数据、虚拟机或保护域;输出必须同时说明返回值、资源所有权与下一阶段可依赖的承诺。
本页签发的不变量是:路径解析得到唯一受权限约束的对象;元数据与数据块引用保持一致,崩溃恢复后已提交事务存在、未提交事务不暴露半成品。。不变量在正常路径与错误路径都应成立。一次成功运行只证明一个样本可用,不能证明边界安全;因此目录中的机制都要进入正常、边界、失败和恢复四条轨迹,并明确谁检测、谁阻塞或重试、谁逆序清理、谁向上报告。
构造目录树与索引块映射,模拟创建、写入、链接、删除和崩溃,比较位图、空闲链表、日志与备份恢复。 运行前把预期写成状态快照,运行后逐字段比较。并发实验记录同步边,地址实验记录位宽与权限,I/O 实验记录缓冲区和完成事件,持久化实验区分提交与落盘,分布式实验记录丢失、重复和重排。
注入断电、重复块、孤儿块、共享引用和空间耗尽,确定损坏发生在目录、元数据、分配器还是日志提交次序。 删除故障后用完全相同的输入重放,确认返回值、内核对象、外部结果和清理状态一起恢复。只修正界面结果却留下线程、页、设备请求、文件引用、虚拟机状态或权限污染,仍然不通过。
原书第4版使用 Linux、Android、Windows 8.1、VMware 和当时的多处理机技术作为实例。现代内核和云平台会改变接口版本与性能数值,但进程状态、地址翻译、I/O 分层、资源死锁、虚拟化隔离和保护域仍可验证。现代对照必须写明差异,不能覆盖2017年中文版本的目录身份。
正式目录逐项讲解
第4章 文件系统
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“第4章 文件系统”先在“解析路径名”写出输入与预测,再推进到“定位目录项”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.1 文件
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.1 文件”先在“定位目录项”写出输入与预测,再推进到“读取文件元数据”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.1.1 文件命名
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.1.1 文件命名”先在“读取文件元数据”写出输入与预测,再推进到“映射数据块”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.1.2 文件结构
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.1.2 文件结构”先在“映射数据块”写出输入与预测,再推进到“提交日志事务”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.1.3 文件类型
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.1.3 文件类型”先在“提交日志事务”写出输入与预测,再推进到“检查崩溃一致性”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.1.4 文件访问
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.1.4 文件访问”先在“检查崩溃一致性”写出输入与预测,再推进到“解析路径名”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.1.5 文件属性
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.1.5 文件属性”先在“解析路径名”写出输入与预测,再推进到“定位目录项”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.1.6 文件操作
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.1.6 文件操作”先在“定位目录项”写出输入与预测,再推进到“读取文件元数据”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.1.7 使用文件系统调用的一个示例程序
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.1.7 使用文件系统调用的一个示例程序”先在“读取文件元数据”写出输入与预测,再推进到“映射数据块”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.2 目录
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.2 目录”先在“映射数据块”写出输入与预测,再推进到“提交日志事务”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.2.1 一级目录系统
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.2.1 一级目录系统”先在“提交日志事务”写出输入与预测,再推进到“检查崩溃一致性”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.2.2 层次目录系统
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.2.2 层次目录系统”先在“检查崩溃一致性”写出输入与预测,再推进到“解析路径名”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.2.3 路径名
从文件命名、结构、类型和操作进入目录、文件与目录实现、共享、日志结构/日志文件系统、VFS、空间管理、备份与一致性。 对“4.2.3 路径名”先在“解析路径名”写出输入与预测,再推进到“定位目录项”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.2.4 目录操作
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.2.4 目录操作”先在“定位目录项”写出输入与预测,再推进到“读取文件元数据”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.3 文件系统的实现
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.3 文件系统的实现”先在“读取文件元数据”写出输入与预测,再推进到“映射数据块”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.3.1 文件系统布局
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.3.1 文件系统布局”先在“映射数据块”写出输入与预测,再推进到“提交日志事务”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.3.2 文件的实现
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.3.2 文件的实现”先在“提交日志事务”写出输入与预测,再推进到“检查崩溃一致性”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.3.3 目录的实现
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.3.3 目录的实现”先在“检查崩溃一致性”写出输入与预测,再推进到“解析路径名”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.3.4 共享文件
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.3.4 共享文件”先在“解析路径名”写出输入与预测,再推进到“定位目录项”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.3.5 日志结构文件系统
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.3.5 日志结构文件系统”先在“定位目录项”写出输入与预测,再推进到“读取文件元数据”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.3.6 日志文件系统
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.3.6 日志文件系统”先在“读取文件元数据”写出输入与预测,再推进到“映射数据块”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.3.7 虚拟文件系统
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.3.7 虚拟文件系统”先在“映射数据块”写出输入与预测,再推进到“提交日志事务”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.4 文件系统管理和优化
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.4 文件系统管理和优化”先在“提交日志事务”写出输入与预测,再推进到“检查崩溃一致性”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.4.1 磁盘空间管理
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.4.1 磁盘空间管理”先在“检查崩溃一致性”写出输入与预测,再推进到“解析路径名”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.4.2 文件系统备份
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.4.2 文件系统备份”先在“解析路径名”写出输入与预测,再推进到“定位目录项”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.4.3 文件系统的一致性
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.4.3 文件系统的一致性”先在“定位目录项”写出输入与预测,再推进到“读取文件元数据”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.4.4 文件系统性能
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.4.4 文件系统性能”先在“读取文件元数据”写出输入与预测,再推进到“映射数据块”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.4.5 磁盘碎片整理
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.4.5 磁盘碎片整理”先在“映射数据块”写出输入与预测,再推进到“提交日志事务”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.5 文件系统实例
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.5 文件系统实例”先在“提交日志事务”写出输入与预测,再推进到“检查崩溃一致性”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.5.1 MS-DOS文件系统
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.5.1 MS-DOS文件系统”先在“检查崩溃一致性”写出输入与预测,再推进到“解析路径名”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.5.2 UNIX V7文件系统
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.5.2 UNIX V7文件系统”先在“解析路径名”写出输入与预测,再推进到“定位目录项”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.5.3 CD-ROM文件系统
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.5.3 CD-ROM文件系统”先在“定位目录项”写出输入与预测,再推进到“读取文件元数据”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.6 有关文件系统的研究
沿请求、控制器、数据搬运、完成通知和持久化逐层追踪;缓冲区生命周期、元数据一致性和错误传播不能省略。 对“4.6 有关文件系统的研究”先在“读取文件元数据”写出输入与预测,再推进到“映射数据块”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
4.7 小结
本节用“路径解析得到唯一受权限约束的对象;元数据与数据块引用保持一致,崩溃恢复后已提交事务存在、未提交事务不暴露半成品。”回查正常、边界、失败和恢复四条轨迹,而不是只重复术语。 对“4.7 小结”先在“映射数据块”写出输入与预测,再推进到“提交日志事务”并比较内核可见状态。实验固定版本、输入和环境,只改变一个条件;发生偏离时保存首个分叉、责任层和逆序清理结果。
状态与失败矩阵
| 对象 | 正常状态 | 边界样本 | 失败证据 | 恢复条件 |
|---|---|---|---|---|
| 进程与同步 | 状态转换和同步边明确 | 抢占、竞争、低容量 | 调度与等待图 | 唤醒并回收全部流 |
| 地址与存储 | 映射、权限、元数据有效 | 缺页、空间耗尽、断电 | 页表与日志轨迹 | 重建一致映射或事务 |
| 设备与虚拟化 | 请求和完成一一对应 | 超时、迁移、过量提交 | 控制器与客户机状态 | 清理后相同输入重放 |
| 分布式与安全 | 所有权、身份、协议明确 | 节点失联、越权、重放 | 消息与审计记录 | 恢复隔离和最小权限 |
先预测:若在“读取文件元数据”注入失败,哪个内核状态应最先变化,后续哪个阶段必须停止提交副作用?写出答案后再操作实验控件。
可重放实验记录
trace = []
for stage in ["解析路径名", "定位目录项", "读取文件元数据", "映射数据块", "提交日志事务", "检查崩溃一致性"]:
expected = predict(stage, kernel_state)
actual = execute(stage, kernel_state)
trace.append({ stage, expected, actual, owner, cleanup })
stop_at_first_divergence(expected, actual)book: 现代操作系统(原书第4版)
edition: 2017-07-19
page: mos-04-file-systems
formal_scope: 34条
sample: normal | boundary | failure | recovery
predict_before_run: true
capture_first_divergence: true
replay_same_input: truefreeze version, input, workload, and environment
record system calls, kernel state, resources, devices, and synchronization
change exactly one condition
stop at the first divergent boundary
clean up in reverse acquisition order
replay the same input and verify recovery常见误区与故障注入
四类样本与验收
| 样本 | 注入方式 | 必查证据 | 通过条件 |
|---|---|---|---|
| 正常 | 固定版本、负载和输入 | 全阶段状态与输出 | 与预测一致 |
| 边界 | 极值、空输入、低容量 | 终止、权限与资源状态 | 不越界不泄漏 |
| 失败 | 错地址、设备超时、断连或竞争 | 首个错误与责任层 | 失败被隔离 |
| 恢复 | 逆序清理后重放 | 状态、输出、持久化和审计 | 回到受控结果 |
练习
小结
- 文件:连接“解析路径名”的请求与内核状态。
- 目录:连接“定位目录项”的资源所有权。
- 索引节点:连接“读取文件元数据”的同步或权限边界。
- 日志:连接“映射数据块”的失败传播。
- 虚拟文件系统:连接“提交日志事务”的恢复证据。
- 34个正式目录坐标已进入本页或全书资源链,不以泛化主题替代原书章节。
- 返回值只是证据之一,内核状态、资源、持久化和清理共同决定是否通过。