Page 467 - 《软件学报》2026年第3期
P. 467
1430 软件学报 2026 年第 37 卷第 3 期
于每个进程都有自己的文件描述符表, 所以不同进程可以拥有相同的文件描述符, 这些文件描述符可能指向相同
或不同的文件. 如果进程多次打开同一文件, 它的不同文件描述符可能指向相同文件. 文件描述符的生命周期与打
开它的进程相关, 当进程关闭文件描述符或进程终止时, 文件描述符会被释放.
● dentry
dentry (即 directory entry) [14] 是 Linux 内核对文件系统中目录项的抽象, 该结构体用于关联文件或目录的名称
与对应的 inode, 并被缓存在内存中以提高目录项的查找与访问效率. 此外, dentry 结构体还记录了目录项间的层
级关系. 遵循目录项间的父子关系, dentry 结构体中包含指向其父 dentry 和子 dentry 列表的指针, 从而将内存中各
目录项的 dentry 组织成了一棵目录树. 当内核解析应用层传入的文件路径时, 内核会以“/”为边界将文件路径分割
为多个路径组件, 继而在目录树中递归查找各路径组件对应的 dentry, 直到完成对最后一项路径组件的解析. 由于
内存中缓存了大部分常用目录项的 dentry, 路径解析过程无需频繁进行磁盘 I/O 以读取文件相关信息, 提高了目录
项查找效率. 而当系统内存紧张或文件状态改变时 (删除或重命名等), 部分 dentry 将会从内存中回收. 若路径解析
过程中未查找到路径组件对应的 dentry, 则需从磁盘上重新读取目录项并创建相关 dentry 加入缓存.
● inode
文件系统将文件数据和文件元信息分开存放, 以提高文件系统的性能和灵活性. 文件数据保存在数据块 (data
block) 中, 文件元信息则保存在 inode 中. 文件元信息是对文件属性的描述信息, 包括文件大小、拓展属性、链接数
量和文件数据的块位置等 [13] . 在文件存取过程, 内核需要找到文件的实际数据块来读取或写入文件内容, 该过程首先
通过文件名逐步查找到文件对应的 dentry, dentry 中有指向文件 inode 的指针, 再根据 inode 中文件数据块的磁盘位
置信息, 查找到文件的实际数据块, 实现文件的读写操作. 这样可以提高文件系统的性能, 减少文件查找的时间.
符号链接是一种特殊的文件类型, 其 inode 结构中存储的是指向目标文件路径名的指针, 而不是目标文件的
inode 号. 因此, 符号链接与目标文件之间的关系是通过路径名解析的, 而不是通过 inode 号直接关联, 目标文件
inode 号的链接数量不变. 当访问符号链接时, 文件系统会首先读取符号链接文件的 inode, 从 inode 中获取路径名,
然后对路径名进行解析, 最终找到目标文件的 inode, 访问目标文件.
● 文件操作流程
通过路径名操作文件时, 会触发路径查找 (path lookup), 这是 VFS 中的关键功能. 它对路径字符串进行一层层解
析, 最终找到对应文件的 dentry 和 inode. 路径查找过程中会将路径名分割成各个路径组件, 每个组件是由“/”字符分
隔的子字符串. 在初始化查找过程中, 内核会创建一个 nameidata 临时结构, 主要作用是保存查找过程中的中间结果.
nameidata 结构由查找过程的初始组件初始化, 如果路径名以“/”字符开头, 则起点是调用进程根目录的 dentry. 对于每
个路径组件, 内核会查找对应的 dentry. 如果找到, 则更新 nameidata 结构中的信息, 包括当前 dentry 和 inode 等; 如
果找不到组件的 dentry, 则路径查找过程返回失败. 如果路径组件是一个符号链接, 内核会读取符号链接的目标路径,
并递归解析该目标路径, 以确保找到最终的文件 inode. 内核还会检测是否存在循环符号链接, 以防止无限递归.
当用户通过文件描述符对文件进行操作时, 内核会直接通过文件描述符从当前进程的文件描述符表找到系统
级打开文件表中对应的文件信息, 其中包括指向文件 inode 的指针, 通过该指针访问缓存数据, 不需要经过路径解
析. 图 1 展示了以上两种操作文件方式的过程.
文件描述符 进程文件描述符表 系统打开文件表
文件操作 文件 inode
路径查找 文件 dentry
文件路径
图 1 两类文件操作流程示意图
1.2 容器文件系统隔离机制
容器与主机的文件系统隔离机制通过挂载命名空间、chroot 等技术实现, 确保容器在一个独立的文件系统视

