文件存储与磁盘
文件是操作系统给应用提供的核心抽象之一。应用看到的是路径和字节流,系统内部则涉及文件系统、块设备、缓存、日志、权限和一致性。
# 1. 学习目标
- 理解文件、目录、inode、块设备和挂载的基本关系。
- 能区分 HDD、SSD、网络存储和对象存储的性能特征。
- 能分析空间不足、IO 慢、文件句柄泄漏和数据一致性问题。
# 2. 知识框架
文件存储与磁盘
├─ 入门:建立术语、对象和日常操作的直觉
├─ 进阶:理解机制、边界和跨平台差异
└─ 专家:能排障、能设计、能阅读实现和研究材料
文件存储的核心链路是:路径解析 -> 文件系统元数据 -> Page Cache -> 块层队列 -> 存储设备。每一层都可能成为性能或一致性问题的来源。
# 3. 核心概念
| 主题 | 说明 | 工程关注 |
|---|---|---|
| 文件系统 | 组织文件、目录、元数据和空间分配的规则 | ext4、XFS、APFS、NTFS 差异 |
| inode/元数据 | 描述文件权限、大小、块位置等信息 | 小文件过多、inode 耗尽 |
| 日志机制 | 记录元数据或数据变更以便崩溃恢复 | 一致性、写入放大、fsync |
| 挂载点 | 把文件系统接入目录树的位置 | 容器卷、网络盘、权限边界 |
# 4. 机制与实践
- 生产系统要监控磁盘容量、inode、IO 延迟、文件句柄和错误日志。
- 数据库、消息队列等关键组件要理解 fsync、刷盘策略和文件系统选型。
- 不要把本地磁盘、网络盘、对象存储当成同一种文件系统使用。
# 5. 常用命令与工具
| 命令或工具 | 作用 | 使用建议 |
|---|---|---|
df -h | 查看文件系统容量 | 排查磁盘满 |
df -i | 查看 inode 使用 | 小文件过多时尤其重要 |
du -sh * | 统计当前目录各项大小 | 定位空间占用来源 |
# 6. 常见误区
- 只看磁盘容量不看 inode:大量小文件可能先耗尽 inode,即使容量还有剩余也无法创建文件。
- 认为写入返回就等于落盘:很多写入会先进入缓存,真正持久化与 fsync、挂载参数和硬件缓存有关。
- 滥用网络文件系统:网络盘延迟和一致性语义不同,不能无脑替代本地盘。
# 7. 进阶研究方向
- 阅读 ext4、XFS、APFS、NTFS 的设计差异。
- 研究数据库为什么重视顺序写、预写日志和 fsync。
- 用 fio 对不同块大小、队列深度、读写模式做基准测试。
# 8. Tips 快问快答
Q:文件和目录本质有什么区别?
A:目录也是特殊文件,保存名称到文件元数据的映射。
Q:为什么删除大文件后空间没有释放?
A:文件可能仍被进程打开,目录项删除了但文件句柄还在,空间要等句柄关闭后释放。
Q:什么是 inode 耗尽?
A:文件系统可用元数据节点用完,常见于海量小文件场景。
# 9. 总结
文件系统把复杂存储设备抽象成路径和文件,但容量、元数据、缓存、一致性和设备性能依然会影响应用。成熟工程师要能从文件路径一路追到块设备。
上次更新: 2026/06/25, 10:02:19