Appearance
文件元数据与索引节点
考情分析
inode 属于文件管理基础知识,在 408 真题中常作为选择题考点出现,考查 inode 的内容、inode 与文件名的关系等。属于 🔥🔥 中高频考点。
文件的属性信息(大小、权限、位置……)总得有地方存,但如果全塞进目录项里,目录检索就会慢得离谱。inode 就是为了解决"元数据放哪儿"这个问题。
文件控制块 FCB
每个文件都有一个文件控制块(File Control Block, FCB),它是文件存在的唯一标志。FCB 中存储了文件的所有管理信息:
| 字段类别 | 包含信息 |
|---|---|
| 基本信息 | 文件名、文件物理位置、文件逻辑结构、文件物理结构 |
| 存取控制信息 | 文件所有者、访问权限(读/写/执行) |
| 使用信息 | 创建时间、最后修改时间、最后访问时间、当前使用状态 |
FCB 的有序集合称为文件目录。一个 FCB 就是一个目录项。
索引节点 inode
在 Unix/Linux 文件系统中,为了提高目录检索效率,将 FCB 拆分为两部分:
- 目录项:仅保存
(文件名, inode 号)的映射关系 - 索引节点 inode:保存除文件名外的所有文件元数据。inode 就像房产证——记录了房子的面积、位置、权限等所有信息,但不包含房子里的家具(数据)
c
// inode 的典型结构(简化)
struct inode {
uint16_t i_mode; // 文件类型与权限 (rwxrwxrwx)
uint16_t i_uid; // 文件所有者 ID
uint32_t i_size; // 文件大小(字节)
uint32_t i_atime; // 最后访问时间
uint32_t i_mtime; // 最后修改时间
uint32_t i_ctime; // inode 修改时间
uint16_t i_links; // 硬链接计数
uint32_t i_blocks; // 占用的磁盘块数
uint32_t i_direct[12]; // 12 个直接块指针
uint32_t i_indirect; // 一次间接块指针
uint32_t i_double_indirect; // 二次间接块指针
uint32_t i_triple_indirect; // 三次间接块指针
};为什么要拆分
一个 FCB 可能占 64 字节甚至更多,而目录项只需 文件名 + inode 号(如 16 字节)。检索目录时只需要读取目录项,大大减少了磁盘 I/O:
| 方案 | 目录项大小 | 一个磁盘块可存储的目录项数 |
|---|---|---|
| 不使用 inode(完整 FCB) | 64B | 4096/64 = 64 个 |
| 使用 inode(文件名+inode号) | 16B | 4096/16 = 256 个 |
同样的磁盘块,使用 inode 后可存放的目录项数量翻了 4 倍,目录检索速度大幅提升。
磁盘 inode 与内存 inode
- 磁盘 inode:存放在磁盘的 inode 区域中,是 inode 的持久化形式
- 内存 inode:文件被打开时,将磁盘 inode 读入内存,增加一些管理字段
内存 inode 比磁盘 inode 多出的字段:
| 附加字段 | 说明 |
|---|---|
| inode 编号 | 磁盘上不需要存(由位置隐含),内存中需要显式记录 |
| 引用计数 | 当前有多少进程打开了该文件 |
| 状态标志 | inode 是否被修改过(脏位)、是否被锁定 |
| 设备号 | 该 inode 所属的文件系统/设备 |
inode 编号与文件名的关系
一个关键概念:inode 中不包含文件名,文件名保存在目录项中。
这意味着:
- 一个 inode 可以对应多个文件名(硬链接)
- 删除一个文件名只是删除一个目录项,inode 引用计数减 1
- 只有当引用计数减为 0 且没有进程打开该文件时,才真正释放 inode 和数据块
这种"一个 inode 多个文件名"的机制,就是硬链接的基础,后面会详细展开。
考研高频考点
- 🔥🔥🔥 inode 与目录项的拆分思想及其好处(减少目录检索 I/O)
- 🔥🔥 inode 中包含哪些信息(不包含文件名)
- 🔥🔥 磁盘 inode 与内存 inode 的区别
- 🔥 inode 与硬链接的关系(一个 inode 对应多个文件名)
- 🔥 给定 inode 大小和磁盘块大小,计算一个磁盘块能存多少 inode
知道了文件的元数据怎么组织之后,下一篇来看用户对文件的具体操作——open、read、write 这些系统调用背后发生了什么。