路径查找从根目录或当前目录开始逐段解析组件,优先查询 dentry cache,未命中时调用具体文件系统查找 inode,并处理挂载点、符号链接和权限。像 /a/b/c 这样简单的字符串,在内核里不是一次哈希查找,而是一连串带边界条件的目录遍历。

选择起始目录逐段解析路径查询 dcache必要时读取文件系统元数据得到最终 path/inode
路径图一个路径组件会经过 dentry、inode、挂载和权限等多层检查。
起始 path绝对路径从根开始,相对路径从 cwd 或 `dirfd` 开始。dentry cache缓存“名称到 inode”的关联,也可缓存不存在的负结果。inode提供对象元数据和具体文件系统的 lookup 操作。挂载点解析途中可能切换到另一个挂载的根目录。符号链接会引入新的路径解析,次数和边界都需要限制。权限检查目录搜索权限和最终对象权限都可能让查找失败。

快路径依赖缓存,慢路径才会访问文件系统

常见路径的组件往往已在 dcache 中,内核可快速完成查找;缓存未命中、目录发生变化或遇到需要引用计数保护的情况时,会走更重的路径并调用文件系统操作。负 dentry 缓存“不存在”也很重要,否则频繁探测缺失文件会反复触发底层查找。

遇到路径性能问题时,要区分是大量组件解析、符号链接、挂载穿越、权限检查,还是缓存频繁失效。盲目增加缓存或把路径拼得更短,都不一定解决真正的 I/O 或锁竞争。

路径约束是服务安全边界

当服务代表用户访问文件时,../ 过滤远远不够,符号链接和目录替换仍可能越出预期目录。openat2 提供解析约束,能限制链接、挂载穿越等行为;无论使用何种接口,都应从受控目录 fd 出发,并明确哪些路径操作被允许。

参考:Linux 路径名查找过程