FUSE构建云端Agent虚拟文件系统,解决高并发Sandbox的文件访问难题

为满足 AI Agent 在沙箱中对 POSIX 文件接口的需求,开发者基于 FUSE 实现动态虚拟文件系统,将对象存储内容按任务会话动态映射为可读写路径,兼顾权限控制与资源隔离,避免传统 NAS 或...

人工智能

在构建云端托管的 AI Agent 平台时,一个看似基础却关键的技术挑战浮现:如何让运行在隔离沙箱(Sandbox)中的 Agent,像操作本地文件一样访问用户上传的输入文件、加载技能包(Skill),并保存任务产出?这并非简单的“挂载远程目录”,而是在高并发、短生命周期的会话场景下,对命名空间、权限边界、状态一致性与资源自动清理提出的系统性工程要求。

当前主流方案存在明显局限。传统分布式文件系统如阿里云 NAS,虽提供标准 POSIX 接口,但其设计面向长周期共享负载——单文件系统最多支持 1000 个挂载节点,单账号单地域通用型 NAS 限额仅 20 个。若每个 Sandbox 会话独立挂载,配额迅速成为横向扩展瓶颈。另一常见做法是使用 ossfs 等工具将对象存储 Bucket 直接挂载为本地目录,虽规避了实例数量限制,却暴露了对象存储的扁平本质:它仅依据 Key 中的 / 字符模拟目录结构,无法回答“当前任务应看到哪些文件”这一核心问题。Agent 所需的不是物理路径映射,而是按会话动态构建的、受控的逻辑视图。

正是在此背景下,FUSE(Filesystem in Userspace)成为关键突破口。FUSE 允许在用户态实现一个符合 POSIX 标准的文件系统,通过 /dev/fuse 将内核 VFS 层的 open、read、write、readdir 等系统调用路由至用户进程,再由该进程决定如何响应——数据可来自数据库、API 或对象存储,Agent 完全无感知。更重要的是,它规避了内核模块开发的复杂性与稳定性风险:即使挂载进程崩溃,也不会导致宿主机内核异常。

  • Runner:作为控制面入口,接收 Session 配置(含用户文件引用与 Skill 版本),解析后写入 PostgreSQL 中的文件系统元数据节点,并为读写与只读挂载分别签发短期、作用域受限的访问 Token;
  • agent-fuse-fs:部署于 Sandbox 内部,负责在固定路径(如 /mnt/filestore)建立 FUSE 挂载点,将系统调用转换为 HTTP 请求发往 Filestore;
  • Filestore:核心服务端组件,校验 Token 合法性与权限范围,处理目录遍历、元数据查询与文件 I/O 请求;
  • PostgreSQL:持久化存储逻辑命名空间结构,包括 filesystem、目录与文件节点的层级关系,决定当前会话可见的路径树;
  • 对象存储(如 OSS/S3):存放所有实际数据内容,包括用户输入文件、任务产物及未解压的 Skill ZIP 包。

文章配图

该设计带来三重实质性改进。其一,资源解耦:Skill 归档无需在 Agent 启动前解压,仅在首次访问时按需流式读取,显著降低冷启动延迟;其二,权限显式化:平台可将 /skills 挂为只读、/outputs 挂为可写,形成天然的沙箱边界;其三,生命周期对齐:Session 结束后,Runner 可触发清理流程,自动回收 PostgreSQL 中的节点记录与 Token,避免僵尸资源堆积。

FUSE 在用户态与内核间的交互示意

从技术演进看,此方案借鉴了 Anthropic Sandbox 的 rclone-filestore 思路,但进一步强化了会话粒度的抽象能力。rclone-filestore 侧重于将远程存储“映射为文件系统”,而此处的 agent-fuse-fs 更强调“为每个会话生成专属视图”。例如,同一用户两次执行不同任务时,其 /inputs 下的文件可能指向不同版本的对象 Key;同一 Skill 在不同会话中可被赋予不同路径别名或访问策略——这些动态性均由 PostgreSQL 中的元数据定义驱动,而非静态挂载配置。

值得注意的是,FUSE 的引入并未增加 Agent 的使用成本。Agent 仍可直接调用 git clone /inputs/repo、grep -r 'error' /outputs 等原生 CLI 工具,底层路径语义稳定且可预测。这种“透明性”至关重要:它使 Agent 开发者无需适配新 API,延续了 Unix 哲学中“一切皆文件”的简洁范式。

云端 Agent 文件系统整体架构

在更高层面,该实践揭示了一个趋势:随着 AI Agent 从单体工具走向可编程工作流,其运行环境正从“计算容器”向“具备完整 OS 语义的轻量虚拟机”演进。文件系统不再是辅助设施,而是承载任务上下文、权限策略与状态传递的核心抽象层。FUSE 在此扮演了“语义桥接者”角色——它不替代对象存储或数据库,而是将它们封装为符合 POSIX 规范的接口,使上层 Agent 能以最小改造代价获得类本地体验。

目前,该方案已应用于开源项目 superduck(github.com/superduck-a…),支撑其多租户、高并发的云端 Agent 运行时。未来,随着 Agent 对外部工具链依赖加深(如调用 LaTeX 编译器、Python 包管理器),此类虚拟文件系统的必要性将进一步凸显。它不仅是工程妥协的产物,更是构建可靠、可扩展 Agent 基础设施的关键一环。