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 等技术实现, 确保容器在一个独立的文件系统视
   462   463   464   465   466   467   468   469   470   471   472