在基于 inode 的 Unix 文件系统中,目录会把每个条目名称映射到一个 inode 编号。Inode 表示文件系统对象,并记录定位和解释其数据所需的元数据。因此,路径名并不作为对象自身的主要身份存储。
文件系统 · 第 11 课
Inode
了解 inode 编号如何把目录名称与文件系统对象的元数据和数据联系起来。
Inode 存储的元数据
通常与 inode 关联的元数据包括:
- 对象类型和权限模式
- 用户和组所有权
- 逻辑大小与已分配数据块统计
- 硬链接数
- 访问、修改和状态变更时间戳
- 指向文件数据或文件系统特定区段结构的引用
Inode 通常不存储目录条目名称。文件系统还可能通过特定格式的结构保存扩展属性、访问控制列表、创建时间、内联数据或其他信息。
ctime 是 inode 状态变更时间,不一定是文件创建时间。单独的出生或创建时间戳是可选的,可能并不存在。
普通文件的路径名组成部分通常在哪里与其 inode 编号关联?
Inode 编号与文件系统范围
使用以下命令显示 inode 编号:
$ ls -li
第一个字段就是 inode 编号。可以用以下命令更详细地检查一个对象:
$ stat path
Inode 编号只在某个文件系统的特定时刻内唯一。另一个文件系统可以使用相同编号,inode 释放后也可能复用该编号。要稳健地标识对象,应同时使用文件系统身份和 inode 编号,而不能只看 inode 编号。
Inode 编号在哪个范围内可以作为对象标识符?
硬链接与打开引用
多个目录条目可以指向同一个 inode,这些条目称为硬链接。创建另一个硬链接会增加对象的链接数。只要仍有其他链接存在,移除一个名称只会减少链接数,不会删除数据。
即使最后一个目录条目已经删除,只要文件仍处于打开状态,它就会继续占用空间,直到最后一个进程引用关闭。其链接数可以为零,但文件描述符仍能访问它。这解释了为什么删除仍处于打开状态的大型日志后,df 用量可能不会立即下降。
已取消链接文件的资源通常在何时释放?
Inode 容量
对于 inode 池有限或能够报告 inode 容量的文件系统,数百万个小文件可能在数据块填满前耗尽元数据容量。使用以下命令检查已挂载文件系统的 inode 统计:
$ df -i
如果没有可用 inode,即使 df -h 显示还有可用数据块,创建文件也可能失败。分配策略有所不同:某些文件系统在创建时预分配 inode 结构,另一些动态管理元数据,并可能以不同方式报告 inode 容量。
对于提供 inode 统计的文件系统,df -i 报告什么?
文件系统特有的数据映射
不要假设每个 inode 都严格包含 12 个直接指针和 3 个间接指针。这可以描述某些经典文件系统布局,但现代 ext4 可以使用区段,XFS、Btrfs 和其他文件系统也采用不同结构。内联数据、压缩区段或写时复制区段会进一步改变这种关系。
需要研究内部映射时,只能以只读模式或文档规定的模式使用文件系统专用诊断工具。对于普通管理,stat、find -inum、df -i 和能够识别链接的工具提供了更安全的抽象。
为什么不能假设每个 inode 都采用同一种固定指针布局?
可以在在 Linux 中管理文件和目录实验中,使用可丢弃文件比较 inode 编号和链接数。
课程已完成
你已完成 Inode
现在,你可以理解路径名、inode、链接与文件系统容量之间的关系。
将目录条目视为从名称到 inode 编号的映射。
阅读元数据和时间戳时,不要把 ctime 误认为创建时间。
把 inode 编号限定在一个文件系统和某个时刻内。
同时考虑硬链接和打开的文件描述符。
使用文件系统特有模型,而不是套用一种通用指针布局。