第83期 | 一张翻译表,装下所有文件系统
第 8 章开篇。上一章讲地址,这一章讲名字。地址可以骗,名字更可以骗:同一个文件能有好几个名字,同一个名字在不同的文件系统里能指向完全不同的东西。中间隔着的那层翻译,叫 VFS。
一、一张翻译表,装下所有文件系统
1974 年,Ritchie 与 Thompson 在 UNIX 的论文里把规矩定死了:文件就是字节流,目录也是文件,打开、读写、关闭,同一套动词走天下¹。规矩越简单,麻烦来得越快。到了 1980 年代,本地磁盘是一种文件系统,网络上的 NFS 是另一种,MS-DOS 的盘又是第三种——每多一种,内核里就得多一套调用,程序员迟早要疯。
Sun 在 1985 年先动手,把翻译层从文件系统里抽了出来;1986 年 Kleiman 的论文把这层说透了,四个设计目标:无关层与有关层分开、接口定死;本地盘、NFS、MS-DOS、RFS 都能接;服务端也能接;跨接口操作要是原子的²。这层翻译,从此叫 VFS。
Linux 起步时还没有这张表,0.01 只有 Minix 一种文件系统。翻译层进来之后,局面变了:1992 年 4 月,为 Linux 而写的第一个文件系统 ext 出现,跑在 VFS 之上³;再往后,ext2、proc、tmpfs、NFS 全挂在同一棵树上,用户程序只管 open、read、write。
今天的 VFS 靠四个物件撑着⁴:超级块,代表一个已经挂载的文件系统本身;索引节点,代表文件本身——大小、权限、时间、数据块指针都在,唯独没有名字;目录项,代表名字到索引节点的连线,查得多了就缓存在手边;文件对象,代表一次打开,带着偏移量和打开方式。名字和文件分开,是整套设计里最狠的一刀:同一个索引节点可以挂好几个名字,删掉一个名字,文件还在。名字与实体分开,和 Codd 1970 年的关系模型⁵是同一个直觉:键可以换,行不动。
挂载把这张表拼成一棵树:磁盘上的 ext4、内存里的 tmpfs、内核现算的 proc、网络那头的 NFS 同处一个根下,程序不用问底下是谁。这和 Windows 的盘符是两种世界观:那边先问东西在哪个盘,这边先问东西叫什么名字。
翻译从来不是免费的。它决定什么能留下来,什么会被悄悄丢掉。FAT 没有 Unix 权限,挂上来只能硬凑一串 rwxrwxrwx。“一切皆文件”是一句承诺,不是一句事实:套接字、设备、管道都扮成文件,各自的脾气还是会从接口的缝里漏出来。藏起来的差别,就是以后出问题的地方。
二、如果 AI 先写操作系统,文件会先是一张权限表:2026 年 10 月 18 日发布的 Linux 7.3 里,有一个看起来像笑话的新文件系统 failfs:挂上去,任何操作都失败⁶。一个“什么都不干”的文件系统进内核,恰好证明了 VFS 的本质:文件系统可以只是一份接口承诺,不必有磁盘,不必有数据,连成功都不必保证。
6 天后,2026 年 10 月 24 日,Anthropic 开源的 sandbox-runtime 把同一层翻译推到了智能体面前⁷。默认值很有意思:读默认放行,写默认禁止,网络只放行白名单域名。文件系统在这里不再是“东西放在哪”,而是“这个智能体、这次任务,允许碰什么”。VFS 当年回答的是多磁盘的问题,今天回答的是多智能体的问题,问题变了,翻译层的位置没变。
照这个方向推,AI 原生操作系统的 VFS 会换一套物件。超级块不再是一块盘,而是一个任务的世界:数据集、工具、记忆拼成的一界。索引节点不再是磁盘块号,而是一份资源的身份,与名字无关。目录项不再是路径,而是一次可撤销的绑定:今天叫“上周那份报价”,明天查到的可能是另一份,名字会漂移,身份不能漂移,来源得记在索引节点里。文件对象不再是偏移量,而是会话预算:走到哪一步,还剩多少。
MemGPT 当年已经把一半的路走通了:上下文窗口当主存,外部存储当磁盘,摘要换入换出就是换页⁸。VFS 是给名字做换页:名字可以换,身份不换。翻译层最大的权力也在这里:它决定一次“打开”到底意味着什么。磁盘时代,打开成功意味着数据在;智能体时代,打开成功意味着权限、能力、新鲜度三件事同时成立。哪一环被翻译丢掉了,审计就得记下来。
VFS 分层示意:同一套 open/read/write 动词,经 VFS 四个物件翻译,落到 ext4、tmpfs、proc、NFS 乃至全部拒绝的 failfs。程序绘制概念示意图。
三、今晚用两个名字,验证一个文件
手边任何一台 Linux 机器,先看它挂了多少种文件系统:
cat /proc/filesystems
findmnt -o TARGET,SOURCE,FSTYPE | head -20
nodev 那几行最值得看:proc、sysfs、tmpfs 没有磁盘,照样有名字、有内容、有读写。再做一个最小的实验,验证名字和文件分家:
echo hello > /tmp/vfs-a.txt
ln /tmp/vfs-a.txt /tmp/vfs-b.txt
ls -i /tmp/vfs-a.txt /tmp/vfs-b.txt
两个名字后面的索引节点号是一样的。删掉一个名字:
rm /tmp/vfs-a.txt
cat /tmp/vfs-b.txt
内容还在。删名字不是删文件,名字删尽、打开的进程都退出,文件才真正消失。名字是路标,文件是房子,拆路标拆不掉房子。
落到普遍场景,同一张翻译表都能套。本地大模型服务上,权重目录可以只读挂载给推理进程,写权限只留给更新任务;边缘小设备上,日志和缓存走内存文件系统,掉电就清,重要结果才落盘;视频 AI 平台里,摄像头和推理结果可以扮成 proc 那样的现算文件,读的时候才生成,不必先存一份;企业私有智能中心里,每家企业的命名空间是一棵独立的树,智能体只能看见自己被允许的那几枝,翻译层就是权限表。
觉 然 小 注
翻译表自己不存东西,却决定了东西以什么样子被看见。孙过庭说“贵能古不乖时,今不同弊”⁹:不泥古,不趋时,中间那层薄薄的翻译,才是系统活下来的地方。
引 用 与 出 处
- [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] Kleiman, S. R. Vnodes: An Architecture for Multiple File System Types in Sun UNIX. USENIX Summer Conference Proceedings, 1986.
- [3] Network World. Understanding Linux file system types. Network World. https://www.networkworld.com/article/972156/understanding-linux-file-system-types.html
- [4] Robert Love. Linux Kernel Development. Addison-Wesley, 2010.
- [5] Codd, E. F. A Relational Model of Data for Large Shared Data Banks. Communications of the ACM, 1970. https://dl.acm.org/doi/10.1145/362384.362685
- [6] Linux 7.3 released with fchroot, failfs and faster Btrfs. DEV Community, 2026. https://dev.to/techaiwire/linux-73-released-with-fchroot-failfs-and-faster-btrfs-ijo
- [7] 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/
- [8] Packer, C. et al. MemGPT: Towards LLMs as Operating Systems. arXiv:2310.08560, 2023. https://arxiv.org/abs/2310.08560
- [9] 孙过庭. 《书谱》. 垂拱三年(687).
· · ·