第84期 | 一个路径,要走多少步才到文件

操作系统 · · 九羲科技

上一期讲了翻译表本身:四个物件把名字和文件分开。这一期讲翻译的过程:你敲下一个路径,内核不是一下子跳到文件面前,而是一级一级走过去,每一级都要认人、查岗、决定要不要换条路。

一、路径是一场接力,不是直达

内核把“名字变文件”这件事,古早就叫 namei,意思直白:给一个名字,还你一个索引节点。Unix 1974 年的论文把文件、目录与打开读写这套规矩定死之后¹,名字到索引节点的转换就成了每个 Unix 系统都必须回答的问题。做法直白得近乎笨拙:从根目录或者当前目录出发,把路径按斜杠切开,一段一段往下认。

每一段的认法都一样。先拿父目录加这一段名字,去目录项缓存里按哈希查。查到了,别急着信:还要对一遍序号,确认这段路在你查的当口没被人改名、删掉或者换掉指向的文件。查不到,就下潜到具体文件系统,让它到磁盘或者内存里把这一段找出来,顺手放进缓存,给下一次走的人省点事。找了半天确认没有,也会记一笔“此路不通”的缓存,下次再问同一个不存在的名字,不必重新下潜。

路上还有两种改道。走到一个挂载点,脚下的树就换了:你以为还在同一棵树上,其实已经踩进了另一块盘、另一台机器的根。走到一个符号链接,剩下的路要重写:链接指向哪,路就拐向哪,拐多了,内核会报“符号链接层数太多”,不陪你兜圈子。走到“..”,要回到父目录;如果正站在挂载点的根上,“..”得先回到挂载点本身,再往上走——树和树交接的地方,最容易走错。

为了走得快,内核还练了一手轻功。正常走法每级都要加锁、加引用计数,稳,但慢。于是有了 RCU 走法:不加锁、不加计数,只凭每级目录项上的一串序号做快照,像一架梯子一级一级搭下去²。只要中途发现哪一级变了、缺了,或者这一步必须停下来睡觉(比如要读盘),就立刻认栽,报错重走稳妥的老路;要是连缓存都信不过了,再强制重验一次。快有快的代价:快走法只能做“看看、不动手”的事,一到要真正动手改东西,就得换回慢路。

这里藏着一层平时看不见的东西。路径解析表面上是找东西,实际上是逐级放哨:每一级目录都要有执行权限,缺一级,整条路都不通。也就是说,一个文件对你“存在不存在”,不是由文件本身决定的,而是由你能不能一路走过去决定的。能改名、能挂载、能换掉中间某一级目录的人,改写的不是一个文件,而是所有后来者脚下的路。翻译表决定东西以什么样子被看见,路径解析决定谁有资格走到东西面前。

一条路径的四步接力:每一步先查目录项缓存,查不到下潜,遇挂载点换树,遇符号链接改道。程序绘制概念示意图。

二、如果权限长在每一步上

把这套走法搬到智能体身上,问题会立刻变尖锐。智能体要的路径往往不是“/home/user/report.txt”这种死地址,而是“上周那份报价”“客户刚发来的那张图”——名字会漂移,指向的东西会换人。今天刚落地的工具已经把一半的答案摆出来了:2026 年 10 月 24 日,Anthropic 开源了 sandbox-runtime,给智能体进程套上操作系统级的沙箱,macOS 上用 Seatbelt,Linux 上用 bubblewrap,默认读放行、写禁止、网络只放行白名单域名³。它的思路仍然是“在进程外面再围一圈”:路径该怎么走还怎么走,走到不该碰的地方,外面那圈再拦下来。

原生 AI 操作系统的走法可以更往里一步:把权限检查长进每一步目录项里。智能体每走一级,内核就对一次身份、任务范围和新鲜度:这一级是不是这个任务能看的,这一绑定是不是刚才那次查询绑定的那一份。检查不过,这一级在智能体眼里就跟“不存在”一样——不是“权限不足”的报错,而是路到这里就断了,少泄露一点内部结构。还有一层:名字漂移时,解析结果必须当场钉住。打开文件拿到的描述符钉住的是索引节点,路径本身钉不住任何东西;智能体今天按名字找到的文件,明天按同一个名字再走一遍,可能是另一份。名字是问路的方式,身份才是文件本身,这一点,上一期的翻译表已经说过,路径解析把它变成了每天都会踩到的坑。

再往外推一格:向量世界里的“找”本来就不必按路径走。按内容哈希找、按意思找,是另一套寻址法。路径是给人走的,哈希是给机器认的,AI 原生系统大概率两套并存——人走名字,机器认身份,中间仍是同一张翻译表在换算。

三、亲手走一遍,名字才算数

手边任何一台 Linux 机器,先让系统把一路的哨卡摊开给你看:

namei -l /etc/passwd

每一级目录的权限、属主、最后一级文件的类型,一行行列出来。哪一级缺了执行权限,路就断在哪一级。再看一眼缓存里现在记了多少条走过的路:

cat /proc/sys/fs/dentry-state

第一串数字就是目录项的总数,机器跑得越久,这个数越能说明“系统是靠记路走路的”。

再做一个最小的兜圈实验:

ln -s loop /tmp/loop

cat /tmp/loop

内核不会陪你无限拐下去,报“符号链接层数太多”就收手。符号链接是指路牌,不是传送门。

落到常见的四类部署,同一套走法都能套。本地模型服务上,权重目录可以只读绑定挂载给推理进程,解析到权重的那条路天然就是只读的;边缘设备上,日志走内存文件系统,掉电就清,重要结果才落盘,路径的“存在”本身就有保质期;视频 AI 平台里,摄像头和推理结果可以扮成现算文件,读的时候才生成,不必先存一份再指路;企业私有智能中心里,每家企业的命名空间是一棵独立的树,智能体只能在自己被允许的那几枝里走,树的边界就是权限的边界——走不出去,比拦下来更干净。

觉 然 小 注

路要一级一级走,心却不必住在哪一级。应无所住而生其心⁴:目录项缓存记得走过的路,却也随时准备重验——记得而不执着,系统才走得又快又稳。

引 用 与 出 处

  1. [1] Ritchie, D. M., Thompson, K. The UNIX Time-Sharing System. Communications of the ACM, 1974. https://dl.acm.org/doi/10.1145/361011.361061
  2. [2] Linux 内核文档. Documentation/filesystems/path-lookup.txt. https://mjmwired.net/kernel/Documentation/filesystems/path-lookup.txt
  3. [3] MarkTechPost. Meet Anthropic's sandbox-runtime: OS-Level Sandboxing for AI Agents, No Containers. MarkTechPost, 2026. https://www.marktechpost.com/2026/10/24/anthropic-sandbox-runtime-ai-agent-sandbox/
  4. [4] 鸠摩罗什译. 《金刚般若波罗蜜经》.

· · ·

← 返回资讯中心