2. inode 核心概念
inode(索引节点)是 Linux 文件系统的核心元数据结构,它记录了文件或目录的“身份信息”与“物理存储映射”。理解 inode 的定义、与 dentry 的协作关系、与数据块的映射机制以及编号的唯一性,是诊断文件系统故障、优化存储性能的基础。
2.1 inode 定义
inode 是一个固定大小的磁盘数据结构,每个文件或目录都对应一个唯一的 inode。inode 不存储文件名,而是存储除文件名之外的所有元数据,包括:
- 文件类型与权限(st_mode)
- 硬链接计数(st_nlink)
- 文件大小(st_size)
- 时间戳:访问时间(atime)、修改时间(mtime)、状态变更时间(ctime)
- 数据块指针:指向文件实际数据所在的磁盘块
- 扩展属性(xattr)指针
关键指标: 默认 ext4 文件系统 inode 大小为 256 字节,每个块组预分配固定数量的 inode(通常每 16KB 数据空间分配 1 个 inode)。inode 耗尽时,即使磁盘还有空闲空间,也无法创建新文件。
2.2 inode 与 dentry 的关系
dentry(目录项)是内存中的路径组件缓存,负责将文件名映射到 inode 编号。inode 与 dentry 的关系可以概括为:
| 维度 | inode | dentry |
|---|---|---|
| 存储位置 | 磁盘(inode table)+ 内存缓存 | 仅内存(dcache) |
| 核心内容 | 元数据 + 数据块指针 | 文件名 + 父目录指针 + inode 指针 |
| 生命周期 | 文件创建到删除 | 路径查找期间,可被 LRU 回收 |
| 数量关系 | 1 个 inode 可对应多个 dentry(硬链接) | 每个路径分量对应 1 个 dentry |
| 故障影响 | inode 损坏 → 文件不可访问 | dentry 缓存过期 → 重新从磁盘读取 |
工程启示: 硬链接的本质是多个 dentry 指向同一个 inode。删除一个 dentry 只会减少 inode 的硬链接计数(st_nlink),只有当 st_nlink 降为 0 且没有进程打开该文件时,inode 才会被回收。
2.3 inode 与数据块的关系
inode 通过多级指针结构将逻辑文件偏移映射到物理磁盘块。这种设计兼顾了小文件的快速访问和大文件的扩展性:
- 直接块指针(12 个):每个指针直接指向一个数据块,适合小文件(≤ 48KB,块大小 4KB)。
- 间接块指针:指向一个包含块指针的磁盘块,支持更大的文件。
- 双重间接块指针:两级间接,进一步扩展寻址范围。
- 三重间接块指针:三级间接,支持超大文件(ext4 默认上限 16TB)。
| 指针类型 | 数量 | 寻址范围(4KB 块) | 典型用途 |
|---|---|---|---|
| 直接块指针 | 12 | 0 – 48 KB | 小文件、配置文件 |
| 1 级间接 | 1 | 48 KB – 4 MB + 48 KB | 中等日志文件 |
| 2 级间接 | 1 | ~4 MB – ~4 GB | 数据库文件 |
| 3 级间接 | 1 | ~4 GB – ~16 TB | 大视频、磁盘镜像 |
故障场景: 当 inode 的间接块指针损坏时,文件系统会丢失大范围的数据块映射。fsck 在修复阶段会尝试重建间接块树,但若损坏严重,可能导致文件截断或数据丢失。
2.4 inode 编号的唯一性
inode 编号(inode number)是文件系统内部唯一标识一个文件的整数。其唯一性规则如下:
- 文件系统内唯一:同一个文件系统挂载点下,每个 inode 编号只对应一个文件。
- 跨文件系统不唯一:不同文件系统(如 /dev/sda1 与 /dev/sdb1)可以拥有相同的 inode 编号。
- 0 号 inode 保留:inode 0 通常表示空或未使用,inode 1 用于坏块列表,inode 2 为根目录。
- 硬链接共享编号:硬链接文件与原始文件共享同一个 inode 编号。
排查技巧: 使用
ls -li 查看文件的 inode 编号;使用 stat 命令查看 inode 的详细元数据。当怀疑文件被替换时,对比 inode 编号可以快速判断是否为同一文件。
2.5 核心概念总结
| 概念 | 一句话定义 | 故障排查关联 |
|---|---|---|
| inode | 存储文件元数据和数据块指针的磁盘结构 | inode 耗尽 → 无法创建文件;inode 损坏 → 文件丢失 |
| dentry | 内存中文件名到 inode 的映射缓存 | dcache 问题 → 路径查找异常;硬链接管理 |
| 数据块指针 | inode 内多级指针,映射逻辑偏移到物理块 | 指针损坏 → 文件空洞或数据错乱 |
| inode 编号 | 文件系统内唯一标识文件的整数 | 编号冲突 → 文件系统严重损坏;硬链接识别 |
工程实践: 在运维监控中,建议对根文件系统和关键数据文件系统的 inode 使用率设置告警阈值(如 80% 警告、95% 严重)。使用
df -i 快速查看 inode 使用情况,避免因 inode 耗尽导致服务中断。