모바일 에이전트를 구동하는 가상머신의 내부 구조
Claude Code와 Instinct 등 에이전트가 폰에서 동작하도록 클라우드 VM에서 실행되는데, 두 서비스 모두 Firecracker microVM을 기반으로 한다는 것이 분석으로 밝혀졌다. Claude Code는 Rust로 작성된 커스텀 PID 1과 읽기 전용 하네스 디스크, 호스트 주도 라이프사이클로 테넌트 격리에 집중한 반면, Instinct는 자체 VM 플릿 없이 E2B 샌드박스 서비스를 임대해 사용한다. 에이전트 인프라의 실제 아키텍처를 이해하는 데 유용한 기술 분석 글이다.
멋진 제품 진화 중 하나는 에이전트(Claude Code, Instinct, Poke 등)가 로컬 컴퓨터를 벗어나 폰에서도 사용할 수 있게 되었다는 점입니다. 결국 이는 고객에게 좋은 일입니다. 에이전트 회사들이 에이전트를 실행할 VM을 제공해주기 때문입니다! 다음은 ws-term에서 둘러본 내용을 바탕으로 주요 플랫폼이 어떻게 동작하는지에 대한 노트입니다.
폰에서의 Claude Code
Claude Code의 박스는 자체 Firecracker microVM입니다. 자체 커널을 가진 KVM 게스트로, Rust로 작성된 init로 부팅됩니다:
$ cat /proc/cmdline ... rdinit=/process_api ... --listen-vsock-port 2024 $ uname -r 6.18.5-fc-v20 # -fc- = Firecracker; 커스텀 빌드된 게스트 커널 $ ps -o comm -p 1 → process_api # PID 1은 systemd가 아니라 Rust/Tokio 바이너리
process_api가 PID 1이며, VM 내부에 살아있는 호스트의 제어 에이전트입니다. 디스크를 마운트한 뒤 vsock 포트 2024에서 대기하여 호스트가 외부에서 세션을 구동할 수 있게 합니다. 이것이 이 플랫폼의 핵심 특징입니다. 운영자가 당신의 테넌트 공간 안에 살아있으며, 이를 격리하기 위한 많은 엔지니어링이 투입됩니다 (PID 1은 non-dumpable, CAP_SYS_PTRACE가 있어도 /proc/1/mem 접근 거부, 셸에는 CAP_SYS_RESOURCE가 없음).
디스크는 당신 것(쓰기 가능, 영속적)과 그들 것(읽기 전용, 공유)으로 깔끔하게 분리됩니다:
$ lsblk -o NAME,SIZE,RO,MOUNTPOINT
vda 256G 0 / # 당신 것: 쓰기 가능, 회수 후에도 유지
vdc 341M 1 /opt/claude-code # 그들 것: 324MB짜리 claude 하네스 (Bun)
vdd 45.6M 1 /opt/env-runner # 그들 것: 태스크 런처
vde/vdf ... 1 /mnt/skills/... # 그들 것: 스킬들
하네스는 툴 콜을 실행하는 것으로, 읽기 전용 디스크에 있는 324MB 컴파일된 Bun 바이너리입니다. 모델은 다른 곳에서 실행되며, 추론 요청은 WebSocket이 아닌 HTTPS/2 위의 Server-Sent Events로 /v1/messages로 나가고, 443 포트만 허용하며 MITM되는 이그레스 게이트웨이(CN = Egress Gateway ... (production))를 거치며, api.anthropic.com은 /etc/hosts에 고정되어 있습니다. 인바운드는 전혀 없습니다 (192.0.2.2, RFC-5737 테스트 주소).
인증은 호스트가 발급한 OAuth 토큰으로, 디스크에 root만 읽을 수 있게 캐시되고 부팅마다 교체됩니다. 라이프사이클은 호스트가 주도하며 내부에서 측정한 결과: 초기화 약 430ms, 하네스 프로세스까지 약 6.4초. 시작은 인바운드 메시지로 트리거되고(호스트가 vsock으로 VM을 깨워 --session-mode resume 실행), 종료는 호스트가 결정하는 유휴 회수입니다. 회수되면 프로세스는 죽지만 vda는 온전히 분리되었다가 다음 콜드 부트에 다시 붙습니다. 그래서 컴퓨팅이 파괴되었는데도 대화가 연속적으로 느껴지는 것입니다.
(다이어그램: 사용자 키 입력 → session-ingress → Firecracker microVM 내부의 process_api(pid 1, Rust) → claude 하네스 → vda(당신 것, 영속) 및 읽기 전용 디스크들; 호스트 제어 평면이 vsock 포트 2024로 process_api에 연결; 하네스는 SSE로 이그레스 게이트웨이를 통해 api.anthropic.com으로 추론 요청)
Instinct
Instinct는 최근 출시된 새 스타트업으로, 메모리 측면에서 아주 훌륭한 작업을 하여 챗봇이 아닌 진짜 어시스턴트 같은 느낌을 줍니다.
$ hostname → e2b.local $ cat /.e2b → n038afjvewg7jnc9pwdz
e2b.local이라는 것은 Instinct가 자체 VM 플릿을 운영하지 않는다는 뜻입니다. E2B 샌드박스("sandbox-as-a-service")를 임대합니다. 에이전트에게 컴퓨터를 쥐어주기 위한 일회성 Ubuntu 박스입니다:
Ubuntu 22.04.5, 2 vCPU, 1.9GB RAM, 29GB 디스크, 약 30분 유지, sandbox 사용자(uid 1001)
후드 안을 들여다보면...
$ systemd-detect-virt → kvm $ cat /proc/cmdline → pci=off virtio_mmio.device=4K@... i8042.noaux i8042.nokbd reboot=k panic=1 clocksource=kvm-clock root=/dev/vda ip=169.254.0.21::...:eth0:off:tap0 $ cat /sys/class/dmi/id/product_name → (빈 값) # SMBIOS가 아예 없음 $ ps -o comm -p 1 → systemd # init=/sbin/init, 커스텀 PID 1이 아님
여기도 Firecracker입니다! pci=off + virtio-over-MMIO + 빈 DMI + tap0 네트워킹은 Firecracker의 시그니처입니다: PCI 버스 없음, SMBIOS 없음, 최소한의 디바이스. 따라서 두 앱 모두 같은 microVM 위에 있으며, 차이는 누가 플릿을 운영하느냐입니다...