文件系统与VFS
文件系统不仅负责存储文件,还负责路径解析、权限、元数据、缓存、一致性和设备差异。VFS 让不同文件系统呈现统一接口。
# 1. 学习目标
- 理解 VFS、inode、dentry、文件描述符和挂载。
- 能解释打开文件、读写文件、删除文件的内核路径。
- 能排查文件句柄泄漏、权限异常、磁盘满和删除不释放空间。
# 2. 知识框架
文件系统与VFS
├─ 入门:建立术语、对象和日常操作的直觉
├─ 进阶:理解机制、边界和跨平台差异
└─ 专家:能排障、能设计、能阅读实现和研究材料
文件访问路径可以拆成:路径字符串 -> dentry 缓存 -> inode 元数据 -> file 对象 -> Page Cache -> 文件系统 -> 块设备。
# 3. 核心概念
| 主题 | 说明 | 工程关注 |
|---|---|---|
| VFS | 虚拟文件系统层,屏蔽具体文件系统差异 | 统一 open/read/write 接口 |
| 文件描述符 | 进程打开文件后的整数句柄 | 句柄泄漏、连接也是文件 |
| dentry | 目录项缓存,保存路径名称关系 | 路径查找性能 |
| 挂载 | 把文件系统接入统一目录树 | 容器卷、网络文件系统、只读挂载 |
# 4. 机制与实践
- 排查 too many open files 时查看进程句柄数量、ulimit 和连接泄漏。
- 删除日志前确认是否被进程持有,必要时重启或重新打开日志文件。
- 生产关键数据目录要明确文件系统、挂载参数、备份和恢复策略。
# 5. 常用命令与工具
| 命令或工具 | 作用 | 使用建议 |
|---|---|---|
lsof -p pid | 查看进程打开的文件 | 排查句柄泄漏 |
mount | 查看挂载信息 | 确认文件系统类型和挂载参数 |
find . -xdev -type f -size +1G | 查找当前文件系统内大文件 | 避免跨挂载点误扫 |
# 6. 常见误区
- 以为删除文件一定释放空间:打开句柄未关闭时,目录项没了但数据块仍被占用。
- 忽略文件描述符限制:高并发网络服务连接数也会消耗文件描述符。
- 把所有文件系统能力视为一致:本地盘、网络盘、容器 overlay 的语义和性能不同。
# 7. 进阶研究方向
- 阅读 VFS 中 inode、dentry、file 的关系。
- 研究 Page Cache、脏页和 fsync 的一致性语义。
- 观察容器 overlayfs 对文件写放大的影响。
# 8. Tips 快问快答
Q:Socket 为什么也算文件?
A:类 Unix 系统把很多资源抽象成文件描述符,Socket 也通过类似 read/write 的接口操作。
Q:什么是 VFS?
A:VFS 是内核中的统一抽象层,让不同文件系统对应用呈现相似接口。
Q:如何排查文件句柄泄漏?
A:用 lsof 或系统指标查看进程打开文件增长,再结合应用连接池、日志和资源关闭路径定位。
# 9. 总结
文件系统是应用最常用的系统抽象之一。理解 VFS、文件描述符和缓存之后,空间、权限、句柄和一致性问题都会更容易定位。
上次更新: 2026/06/25, 10:02:19