
Firecracker를 간단하게 만듭니다. 설치부터 대화형 셸까지 한 명령어로 수 밀리초 안에 안전한 마이크로VM을 실행하세요.
🔥 Firecracker microVM 샌드박스 툴킷
명령줄에서 격리된 Firecracker 마이크로VM을 생성, 관리, 연결하세요. 샌드박싱된 VM을 밀리초 단위로 부팅하고, 명령을 실행하고, 파일을 전송할 수 있습니다 — SSH가 필요 없습니다.
--from-image를 사용하여 모든 OCI 이미지에서 rootfs 구축base, node22, node24, python3.13--json 플래그--from-image 필요)curl -fsSL https://vmsan.dev/install | bash
이 명령은 모든 것을 ~/.vmsan/에 다운로드하여 설치합니다:
node22, node24, python3.13)를 사전 빌드된 아티팩트로 다운로드표준 릴리스 설치 시 내장 런타임을 https://artifacts.vmsan.dev/에서 다운로드하며 Docker가 필요하지 않습니다. 소스 설치는 여전히 런타임을 로컬에서 빌드합니다.
curl -fsSL https://vmsan.dev/install | bash -s -- --uninstall
소스에서 빌드하려면:
# 의존성 설치
bun install
# VM 내 에이전트 빌드
cd agent && make install && cd ..
# CLI 빌드
bun run build
# 로컬 빌드 연결
mkdir -p ~/.vmsan/bin
ln -sf "$(pwd)/dist/bin/cli.mjs" ~/.vmsan/bin/vmsan
# VM 생성 및 시작
vmsan create --runtime node22 --memory 512 --cpus 2
# Docker 이미지에서 VM 생성
vmsan create --from-image node:22-alpine
# 모든 VM 나열
vmsan list
# VM 내에서 명령 실행
vmsan exec <vm-id> ls -la
# PTY를 이용한 대화형 실행
vmsan exec -i <vm-id> bash
# 실행 중인 VM 셸에 연결
vmsan connect <vm-id>
# VM에 파일 업로드
vmsan upload <vm-id> ./local-file.txt /remote/path/file.txt
# VM에서 파일 다운로드
vmsan download <vm-id> /remote/path/file.txt ./local-file.txt
# 실행 중인 VM 스냅샷
vmsan snapshot create <vm-id>
# 스냅샷 목록
vmsan snapshot list
# 스냅샷에서 VM 복원
vmsan create --snapshot <snapshot-id>
# VM 중지
vmsan stop <vm-id>
# VM 제거
vmsan remove <vm-id>
| Flag | 설명 |
|---|---|
--json | 구조화된 JSON 출력 |
--verbose | 상세 디버그 출력 표시 |
vmsan.toml 없음 (0.5.0에서 계획)nftables 사용 (0.2.0 이후)# 빌드
bun run build
# 로컬 빌드 연결
ln -sf "$(pwd)/dist/bin/cli.mjs" ~/.vmsan/bin/vmsan
# 개발 모드 (감시)
bun run dev
# 테스트 실행
bun run test
# 타입 체크
bun run typecheck
# 린트 및 포맷
bun run lint
bun run fmt
bin/ CLI 진입점
src/
commands/ CLI 하위 명령
services/ Firecracker 클라이언트, 에이전트 클라이언트, VM 서비스
lib/ 유틸리티 (jailer, 네트워킹, 셸, 로깅)
errors/ 타입화된 오류 시스템
generated/ Firecracker API 타입 정의
agent/ VM 내에서 실행되는 Go 에이전트
docs/ 문서 사이트 (vmsan.dev)
/30 서브넷(198.19.{slot}.0/30)을 가진 TAP 네트워크 장치를 얻습니다.상태는 ~/.vmsan/에 유지됩니다:
~/.vmsan/
vms/ VM 상태 파일 (JSON)
jailer/ Chroot 디렉터리
bin/ 에이전트 바이너리
kernels/ VM 커널 이미지
rootfs/ 기본 루트 파일시스템
registry/ Docker 이미지 rootfs 캐시
snapshots/ VM 스냅샷
vmsan을 선택해야 하는 이유? Docker는 호스트 커널을 공유합니다 — 컨테이너 이스케이프는 게임 오버를 의미합니다. gVisor는 사용자 공간에서 시스템 콜을 가로채 공격 표면을 줄이지만 완전히 제거하지는 않습니다. Kata Containers는 실제 VM 격리를 제공하지만 복잡한 오케스트레이션(containerd, shimv2, K8s)이 필요합니다. Vagrant는 30초 이상, 수백 MB를 소비하는 전체 VM을 부팅합니다.
vmsan은 Firecracker의 최소 공격 표면(코드 50,000줄 미만)으로 하드웨어 수준 격리를 제공하고 밀리초 단위로 부팅하며 구성 불필요 — 설치 후 바로 사용 가능합니다.
APACHE-2.0 라이선스에 따라 게시되었습니다.
@angelorc 및 커뮤니티가 만들었습니다 💛
🤖 automd로 자동 업데이트됨
| Command | Alias | 설명 |
|---|
create | 새 마이크로VM 생성 및 시작 | |
list | ls | 모든 VM 나열 |
start | 중지된 VM 시작 | |
stop | 실행 중인 VM 중지 | |
remove | rm | VM 제거 |
exec | 실행 중인 VM 내에서 명령 실행 | |
connect | VM에 대화형 셸 열기 | |
upload | VM에 파일 업로드 | |
download | VM에서 파일 다운로드 | |
network | 실행 중인 VM의 네트워크 정책 업데이트 | |
snapshot | VM 스냅샷 관리 (생성, 목록, 삭제) | |
doctor | 시스템 사전 요구 사항 및 설치 상태 확인 |
| vmsan | Docker | gVisor | Kata Containers | Vagrant |
|---|
| 격리 수준 | ✅ 하드웨어 (KVM) | ❌ 공유 커널 | ⚠️ 사용자 공간 커널 | ✅ 하드웨어 (QEMU/CH) | ✅ 하드웨어 (VBox/VMware) |
| 부팅 시간 | ✅ ~125ms | ✅ ~50ms | ✅ ~5ms | ⚠️ ~200ms+ | ❌ 30-60s |
| 설정 복잡성 | ✅ 하나의 명령 | ✅ 낮음 | ⚠️ 중간 | ❌ 높음 | ⚠️ 중간 |
| 보안 모델 | ✅ Jailer + seccomp + cgroups + 전용 커널 | ⚠️ 네임스페이스 + cgroups | ⚠️ 시스템 콜 필터링 | ✅ 전체 VM + 중첩 컨테이너 | ✅ 전체 VM |
| 네트워크 격리 | ✅ 내장 정책 (허용/거부/사용자 지정) | ❌ 수동 (iptables) | ⚠️ Docker 상속 | ❌ 수동 | ⚠️ NAT/브리지 |
| Docker 이미지 지원 | ✅ --from-image | ✅ 네이티브 | ✅ runsc를 통해 | ✅ containerd를 통해 | ❌ |
| 대화형 셸 | ✅ WebSocket PTY | ✅ exec | ✅ exec | ✅ exec | ✅ SSH |
| 파일 전송 | ✅ 내장 업로드/다운로드 | ✅ cp | ✅ cp | ✅ cp | ⚠️ 공유 폴더 / SCP |
| JSON 출력 | ✅ 모든 명령 | ⚠️ 부분적 | ❌ | ⚠️ 부분적 | ❌ |
| 메모리 오버헤드 | ✅ ~5 MiB per VM | ✅ ~1 MiB | ⚠️ ~15 MiB | ❌ ~30 MiB+ | ❌ 512 MiB+ |
| 최적 용도 | 🏆 AI 샌드박싱, 신뢰할 수 없는 코드, 멀티 테넌트 | 일반 워크로드 | K8s 강화 | K8s 컴플라이언스 | 개발 환경 |