2026 年 9 月 8 日,工程师 Rohan Adwankar 在 rohanadwankar.github.io 发表《The box an agent runs in》一文,系统拆解了 Instinct 和 Claude Code 移动版背后的 VM 运行时架构,文章 78 分上 Hacker News 首页,6 条讨论质量极高。这篇文章把一个长期被消费市场模糊处理的事实摆到了桌面上——任何一款今天能跑在用户手机上的"个人 AI Agent",背后都是一台真实运行在数据中心里的虚拟机。用户看到的"AI 在帮我订餐",实际是 E2B 或 Anthropic 自营的 Firecracker microVM 在跑 Ubuntu 22.04,在跑 bash、在跑工具调用、在写 git 仓库、在给 api.anthropic.com 发 SSE 请求。把这件事的工程细节摊开来看,正好可以回答一个企业落地最核心的问题——端侧 AI 智能体为什么必须靠服务端 VM 持续运行,而不是真的跑在用户手机上,以及企业 Agent 平台在自研时应该照搬哪一部分、坚持哪一部分、放弃哪一部分。 ## 一、为什么端侧 Agent 必须有服务端 VM 消费级 AI 智能体最近一波集体迁移到手机,典型代表是 Anthropic 的 Claude Code 移动版和初创公司 Instinct。它们看起来是"装在手机里的 app",但实际架构是用户手机端只做 UI 输入和结果渲染,所有真正的执行——读写文件、跑 bash、调外部 API、维护长期记忆——都在服务端的 VM 里跑。 这件事不是技术限制,是商业策略限制。任何一款个人 Agent,如果真的把执行环境跑在用户手机上,会立刻撞到五个硬约束。第一,手机的 CPU、内存、电量不足以支撑长任务,跑一个跨 30 步的工具链基本必然崩溃或超时。第二,手机的本地存储不具备跨设备持久化能力,用户在 iPhone 上开始的对话不可能直接续到 Android 上,而个人 Agent 的核心价值恰好就是这种跨设备的连续性。第三,手机的沙箱权限模型是按 app 隔离的,无法支持 Agent 调用任意外部 API、跨 app 抓取数据、读写文件这种深度集成。第四,手机的本地状态无法做云端备份,手机丢了 Agent 状态全丢。第五,手机执行环境无法被服务商监管和审计,任何对齐失范行为都失去追溯能力。 服务端 VM 恰好把五个约束一次性解决掉。VM 的算力按需分配,长任务可以跑到分钟级甚至小时级;VM 的存储在云端持久化,跨设备续接就是数据同步问题;VM 的网络出口可被网关控制,既能调用任何外部 API,又能强制走 MITM 审计;VM 的状态天然云端备份;VM 的执行可被服务商完全监管。代价是延迟比本地略高、运维成本上升、数据合规边界要重新划定。 把这件事看清楚,才能理解为什么 Claude Code 和 Instinct 在架构上高度相似——都是服务端 VM + 客户端 UI 的模式,差异只在 VM 内部的具体设计。 ## 二、Claude Code 的服务端 VM 怎么搭 Claude Code 的服务端 VM 是一台自营的 Firecracker microVM,跑在 KVM 之上,自带内核 6.18.5-fc-v20(-fc- 后缀标识 Firecracker 定制版)。guest 内部 PID 1 不是 systemd,而是一个用 Rust 写的 process_api 二进制,它做三件事:挂载磁盘、监听 vsock 端口 2024 与 host 通信、作为 host 控制代理活在 tenant 空间。 这种"operator-in-guest"的设计是 Claude Code 平台的关键特质——平台运营方的控制代理活在用户租户空间内部,并且专门做了一系列密封化处理(PID 1 不可 dump、敏感能力被显式 deny、shell 缺 CAP_SYS_RESOURCE 之类特权)。换句话说,host 能从外部通过 vsock 控制整个 VM 的生命周期,但用户在 VM 内部几乎摸不到 host 控制代理,这是一个典型的最小特权原则实现。 磁盘分两类。一类是用户可写、跨 reclaim 持久化的 vda(256G),挂载在 /,这是用户的根文件系统,任务执行产生的所有文件都在这里。另一类是平台方只读、共享挂载的 vdc(341M, /opt/claude-code,324 MB 的 claude Bun harness)/ vdd(45.6M, /opt/env-runner,任务启动器)/ vde-vdf(/mnt/skills/...)——后者是 skills,Anthropic 注入的可复用工具描述和 prompt 模板。claude harness 是一个 324 MB 的编译 Bun 二进制,跑在只读盘上,负责响应工具调用和驱动整个 Agent 循环。 模型推理出口通过 Server-Sent Events over HTTPS/2,所有流量走 443,经过一个强制 MITM 的 egress gateway,网关 CN 显示为 production。VM 内部没有任何 inbound——1.0.0.1 都被防火墙拦死,这是 RFC 5737 测试地址,所以 VM 只能在收到 host 主动连接时响应。鉴权用 host 铸造的 OAuth token,缓存到 disk,每次 reboot 重置。 整个生命周期是 host 驱动的。空闲 reclaim 由 host 决定,reclaim 之后 vda 完整 detach,下次冷启动 reattach。这件事意义重大——compute 是 destroyed 的,但 conversation state 保留下来,这就是为什么用户感觉对话是连续的,而背后计算是被反复销毁重建的。整个冷启动链路大约 430 ms 到 init,6.4 秒到 harness 启动。 把 Claude Code 这一段抽象成一句话:VM 是用户私有但 host 控制的密封沙箱,内置 harness,只走出站推理,所有状态在 vda 上可重建。 ## 三、Instinct 的服务端 VM 怎么搭 Instinct 是新晋创业公司,9 月初拿了几百万美元融资,主打"个人助理真的懂你"——它的核心差异在记忆设计上,VM 本身反而是租的。 具体说,Instinct 不运营自己的 VM fleet,而是租用 E2B 的 sandbox-as-a-service——一个一次性的 Ubuntu box,跑出 30 分钟到 1 小时就被销毁,用户每开一个会话分配一个新的 box。E2B 给的规格是 Ubuntu 22.04.5、2 vCPU、1.9 GB RAM、29 GB 磁盘,用户 uid 1001,启动用 systemd-detect-virt 返回 kvm,/proc/cmdline 里看到 virtio-over-MMIO + 空 DMI + i8042 关闭等典型 Firecracker 签名。也就是说,虽然 Instinct 不运营 fleet,但底层 VM 仍然是 Firecracker。 关键差异在 guest 内部。Claude Code 的 guest 是 stripped custom init(Rust process_api 跑在 PID 1),Instinct 的 guest 是完整 Ubuntu + systemd + XFCE 桌面。systemd-analyze 显示 Startup finished in 265ms (kernel) + 992ms (userspace) = 1.258s,graphical.target reached after 977ms——1.26 秒冷启动到图形桌面。这种"全 Ubuntu + 桌面"模板的好处是 agent 可以直接调用标准 Linux 工具、跑图形界面应用、甚至装额外软件;坏处是攻击面比 Claude Code 的极简 guest 大得多,任何 Ubuntu 默认装的软件漏洞都可能被利用。E2B 自己也提供了 vCPU/RAM/磁盘/idle timeout/pause-resume 能力的可配置性,Instinct 选了 2 vCPU / 1.9 GB 这种 modest 模板。 但 Instinct 最核心的设计不是 VM 本身,而是它的记忆系统。VM 是一次性可丢弃的,记忆活在 /memory 目录里——一个 git 仓库,装满 Markdown 文件,被 Instinct Agent 当作 git 用户 agent@instinct.com 写入并提交。仓库结构按时间粒度划分 raw → hourly → daily → weekly → monthly,接近人类记忆的遗忘曲线。agent 不调任何 memory API,直接写 Markdown 并自己 commit——这是 HN 评论里 hypendev 调侃的"三份 Markdown 假装数据库"的来源。 仓库的远端是 S3,不是普通 git host。具体 URL 是 s3://instinct-prod-agent-memory/filesystem-memory/user-01M1VW7.../——S3 桶里存的不是单个文件,而是 refs/heads/main/.bundle,整个 vault 被打成一个 bundle 文件存进 S3。AWS 凭证用短时 STS(ASIA 前缀 + session token),过期后 sandbox 自动失效——这是典型的"凭证随 sandbox 寿命绑定"设计,即使 sandbox 被入侵,凭证很快失效,损失被时间窗限制。 整个存储架构可以概括为:durable thing = a git repo in S3;the machine is throwaway。这是 Instinct 与 Claude Code 最大的架构差异——Claude Code 把 conversation state 留在 VM 自己的 vda 上,通过 reattach 实现跨 reclaim 持久化;Instinct 把所有有意义的数据推到 S3 的 git bundle,VM 本身可以被任意销毁而不丢失任何状态。 ## 四、两个 VM 架构横向对比 Rohan 在文章末尾给了一张对照表,把 Claude Code 和 Instinct 的关键差异铺得很清楚: 隔离原语两家用的是同一个东西——Firecracker microVM (KVM)。区别在谁运营 fleet——Anthropic 自营,Instinct 租 E2B。Guest 内部差异最大——Claude Code 是 stripped custom init,Rust 写的 process_api 是 PID 1;Instinct 是完整 Ubuntu + systemd + XFCE 桌面。冷启动时间差别也大——Claude Code 约 430 ms 到 init、6.4 秒到 harness 启动;Instinct 约 1.26 秒到图形桌面。Conversation state on disk 方面,Claude Code 在 vda(本地 virtio-block),Instinct 是 Markdown vault 在 S3(per-user id keyed)。认证 token——Claude Code 用 host 铸造的 OAuth,写到磁盘,每次 boot 轮换;Instinct 用短时 STS,role-scoped,过期即失效。Harness 位置——Claude Code 把 324 MB 的 claude Bun 二进制装在 VM 内;Instinct 把 harness 放在 VM 外面,VM 里只跑两个执行 shim(agent-exec-server 和 tools __internal_daemon)。模型通道——Claude Code 通过 egress gateway 走 api.anthropic.com;Instinct 不在 box 里发任何推理请求,所有工具调用通过 GraphQL 到 api.instinct.com 服务端执行。 ## 五、Harness 在内 vs 在外的设计哲学 最后一个对比是 Harness 在 VM 内还是外。Claude Code 把 harness 装在 VM 内部,意味着所有 agent 循环代码都在 sandbox 里跑,只有推理请求出 VM,工具调用也在 VM 里执行。Instinct 把 harness 放在 VM 外部,VM 内部只有 agent-exec-server(Go 写,跑它收到的 bash)和 tools __internal_daemon(Rust 写,负责把工具调用转成 GraphQL 到 api.instinct.com)。 这两种设计各有取舍。Harness 在内,意味着每个 VM 都是一个完整的 agent runtime,延迟低、独立性强,但模型供应商要维护 N 个 runtime 的兼容性和升级。Harness 在外,意味着 VM 只是个执行沙箱,所有"智能"逻辑在中心服务,好处是升级不影响用户 session、坏处是每次工具调用多一跳网络、中心服务成为单点。 Claude Code 选择 Harness 在内,Anthropic 自营平台足够强可以承担这种运维复杂度,换来的是推理延迟最低、隐私边界最清晰(只有 inference 请求出 VM)。Instinct 选择 Harness 在外,初创公司运维资源有限,把复杂度堆到中心服务,换来的是升级灵活、成本可控。这种选择直接决定了你做企业 Agent 平台时应该如何设计——如果你的 Agent 平台是主营产品,就走 Claude Code 路线,把 runtime 装到 VM 里;如果你的 Agent 平台是某个产品的辅助功能,就走 Instinct 路线,VM 只做执行。 ## 六、企业 Agent 平台能照搬什么 把这套架构反过来看,企业自研 Agent 平台时能照搬的工程经验至少有六条。 第一条,选 Firecracker 作为隔离原语。Firecracker 在两个完全不同的厂商架构里同时被选,说明它在 VM 级隔离 + 冷启动速度 + 运维成熟度上是当前最佳折中,任何企业 Agent 平台不应该考虑更复杂的 hypervisor 方案。 第二条,VM 内部分两类磁盘。平台方只读、共享挂载的盘装 runtime、tools、skills;用户可写、跨 reclaim 持久化的盘装用户自己的状态。这个分层是 Claude Code 的核心设计,直接照搬即可。 第三条,init 系统应该尽量精简。Claude Code 用 Rust 自定义 init 替代 systemd,把 init 本身变成 sealed 的 PID 1,可以拒绝大量容器逃逸攻击。完整 Ubuntu + systemd 虽然对开发者友好,但对生产 Agent 平台是攻击面炸弹。 第四条,持久化用 push 出去的 git repo 或独立对象存储,而不是依赖 VM 内文件。Instinct 的 S3 + git bundle 设计让 VM 完全可以抛弃,这种"无状态 VM + 远端持久化"对企业 Agent 平台非常关键,因为 Agent 的执行环境应该能被任意销毁重建。 第五条,凭证用短时 STS / OAuth,绑定 VM 寿命。Claude Code 的 OAuth 每次 boot 轮换、Instinct 的 STS 过期即失效,两种方案都做到了凭证寿命不超过 VM 寿命,即使 VM 被攻破,凭证很快失效,损失窗口被限定。 第六条,所有推理和工具调用走 outbound,VM 内零 inbound。Claude Code 的 1.0.0.1 都拒,Instinct 的所有调用都从 VM 出去到中心服务。这条原则让网络 ACL 简单到极致——只允许出站 443,所有入站拒绝。 把这六条加起来,企业 Agent 平台可以搭出一个比 Claude Code 简单、比 Instinct 安全的中间态——Firecracker + 精简 init + 双盘分层 + push-based persistence + 短时凭证 + 出站 only 网络。这套架构既能满足消费级产品的体验需求,又能满足企业 IT 的合规需求,是把端侧 Agent 真正落地到生产环境的最小可行工程方案。