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 耗尽时,即使磁盘还有空闲空间,也无法创建新文件。
inode 内部结构(256 字节) 元数据区(~128 字节) • st_mode(文件类型 + 权限) • st_nlink(硬链接计数) • st_size(文件大小) • st_uid / st_gid • atime / mtime / ctime • flags / generation • xattr 指针 • i_block 预留(15 个指针槽) 数据块指针区(~120 字节) 直接块指针 0-11(12 × 4 字节) 间接块指针(1 级) 双重间接块指针(2 级) 三重间接块指针(3 级) 支持最大文件:ext4 默认 16TB

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 才会被回收。
inode 与 dentry 关系 dentry: "/etc/hosts" 父目录指针 | inode 指针 dentry: "/etc/hosts" (硬链接副本) inode #2c3e50 st_nlink = 2 权限 | 大小 | 数据块指针 数据块 文件内容 两个 dentry 指向同一个 inode,st_nlink = 2;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 在修复阶段会尝试重建间接块树,但若损坏严重,可能导致文件截断或数据丢失。
inode 多级指针 → 数据块映射 inode 直接块 0 直接块 1 ... 直接块 11 1 级间接 2 级间接 3 级间接 数据块 0 数据块 1 间接块 数据块 N 双重间接 间接块 数据块 M 直接指针:小文件零跳转;间接指针:通过中间块扩展寻址,支持大文件

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 编号可以快速判断是否为同一文件。
inode 编号唯一性(文件系统内) 文件系统 A(/dev/sda1) inode /etc/hosts inode /var/log/syslog inode (硬链接) 文件系统 B(/dev/sdb1) inode /mnt/data/file1 inode /mnt/data/file2 不同文件系统允许 inode 编号重复;同一文件系统内 inode 编号唯一,硬链接共享编号

2.5 核心概念总结

概念 一句话定义 故障排查关联
inode 存储文件元数据和数据块指针的磁盘结构 inode 耗尽 → 无法创建文件;inode 损坏 → 文件丢失
dentry 内存中文件名到 inode 的映射缓存 dcache 问题 → 路径查找异常;硬链接管理
数据块指针 inode 内多级指针,映射逻辑偏移到物理块 指针损坏 → 文件空洞或数据错乱
inode 编号 文件系统内唯一标识文件的整数 编号冲突 → 文件系统严重损坏;硬链接识别
工程实践: 在运维监控中,建议对根文件系统和关键数据文件系统的 inode 使用率设置告警阈值(如 80% 警告、95% 严重)。使用 df -i 快速查看 inode 使用情况,避免因 inode 耗尽导致服务中断。