Skip to content

angelorc/vmsan

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

157 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

vmsan

πŸ”₯ Firecracker microVM sandbox toolkit

npm version npm downloads bundle size install size license

Create, manage, and connect to isolated Firecracker microVMs from the command line. Boot a sandboxed VM in milliseconds, run commands, transfer files β€” no SSH required.

πŸ“š Read the full documentation at vmsan.dev

vmsan demo

✨ Features

  • ⚑ Millisecond boot β€” Firecracker microVMs start in < 200ms
  • πŸ”’ Security isolation β€” jailer, seccomp, cgroups, and per-VM network namespaces
  • πŸ–₯️ Interactive shell β€” WebSocket PTY with full terminal support
  • πŸ“‚ File transfer β€” upload and download without SSH
  • 🐳 Docker images β€” build rootfs from any OCI image with --from-image
  • πŸƒ Command execution β€” run commands with streaming output, env injection, and sudo
  • 🧩 Multiple runtimes β€” base, node22, node24, python3.13
  • πŸ“Έ VM snapshots β€” save and restore VM state
  • πŸ“Š JSON output β€” --json flag for scripting and automation

πŸ“‹ Prerequisites

  • Linux (x86_64 or aarch64) with KVM support
  • Root/sudo access (required for TAP device networking and jailer)
  • Docker (for source installs, local runtime rebuilds, and --from-image)

πŸš€ Install

curl -fsSL https://vmsan.dev/install | bash

This downloads and installs everything into ~/.vmsan/:

  • Firecracker + Jailer (latest release)
  • Linux kernel (vmlinux 6.1)
  • Ubuntu 24.04 rootfs (converted from squashfs to ext4)
  • vmsan CLI + in-VM agent
  • Runtime images (node22, node24, python3.13) downloaded as prebuilt artifacts

Standard release installs download built-in runtimes from https://artifacts.vmsan.dev/ and do not require Docker. Source installs still build runtimes locally.

Uninstall
curl -fsSL https://vmsan.dev/install | bash -s -- --uninstall
Development setup

If you want to build from source:

# Install dependencies
bun install

# Build the in-VM agent
cd agent && make install && cd ..

# Build the CLI
bun run build

# Link local build
mkdir -p ~/.vmsan/bin
ln -sf "$(pwd)/dist/bin/cli.mjs" ~/.vmsan/bin/vmsan

πŸ“– Usage

# Create and start a VM
vmsan create --runtime node22 --memory 512 --cpus 2

# Create a VM from a Docker image
vmsan create --from-image node:22-alpine

# List all VMs
vmsan list

# Execute a command inside a VM
vmsan exec <vm-id> ls -la

# Interactive exec with PTY
vmsan exec -i <vm-id> bash

# Connect to a running VM shell
vmsan connect <vm-id>

# Upload a file to a VM
vmsan upload <vm-id> ./local-file.txt /remote/path/file.txt

# Download a file from a VM
vmsan download <vm-id> /remote/path/file.txt ./local-file.txt

# Snapshot a running VM
vmsan snapshot create <vm-id>

# List snapshots
vmsan snapshot list

# Restore a VM from a snapshot
vmsan create --snapshot <snapshot-id>

# Stop a VM
vmsan stop <vm-id>

# Remove a VM
vmsan remove <vm-id>

Global flags

Flag Description
--json Output structured JSON
--verbose Show detailed debug output

Commands

Command Alias Description
create Create and start a new microVM
list ls List all VMs
start Start a stopped VM
stop Stop a running VM
remove rm Remove a VM
exec Execute a command inside a running VM
connect Open an interactive shell to a VM
upload Upload files to a VM
download Download files from a VM
network Update network policy on a running VM
snapshot Manage VM snapshots (create, list, delete)
doctor Check system prerequisites and installation health

⚠️ Known Limitations

  • No inter-VM networking (planned for 0.4.0)
  • No declarative config / vmsan.toml (planned for 0.5.0)
  • No multi-host support (planned for 0.7.0)
  • Uses nftables with atomic rule application for network isolation (since 0.2.0)
  • No DNS or SNI filtering (planned for 0.3.0)
  • ICMP blocked by default from VMs (prevents ICMP tunneling)
  • UDP blocked by default except DNS (prevents UDP exfiltration; QUIC/HTTP3 will not work)
  • NTP (UDP 123) blocked β€” kvm-clock used for time sync, long-running VMs may drift
  • Host firewall (ufw/firewalld) may need explicit allow rules for vmsan traffic
  • Linux only β€” requires KVM support
  • Primary platform: Ubuntu 24.04 LTS

πŸ› οΈ Development

# Build
bun run build

# Link local build
ln -sf "$(pwd)/dist/bin/cli.mjs" ~/.vmsan/bin/vmsan

# Dev mode (watch)
bun run dev

# Run tests
bun run test

# Type check
bun run typecheck

# Lint & format
bun run lint
bun run fmt

πŸ—οΈ Architecture

bin/            CLI entry point
src/
  commands/     CLI subcommands
  services/     Firecracker client, agent client, VM service
  lib/          Utilities (jailer, networking, shell, logging)
  errors/       Typed error system
  generated/    Firecracker API type definitions
agent/          Go agent that runs inside the VM
docs/           Documentation site (vmsan.dev)

How it works

  1. vmsan uses Firecracker to create lightweight microVMs with a jailer for security isolation
  2. Each VM gets a TAP network device with its own /30 subnet (198.19.{slot}.0/30)
  3. A Go-based agent runs inside the VM, exposing an HTTP API for command execution, file operations, and shell access
  4. The CLI communicates with the agent over the host-guest network

State is persisted in ~/.vmsan/:

~/.vmsan/
  vms/          VM state files (JSON)
  jailer/       Chroot directories
  bin/          Agent binary
  kernels/      VM kernel images
  rootfs/       Base root filesystems
  registry/     Docker image rootfs cache
  snapshots/    VM snapshots

βš–οΈ How vmsan compares

vmsan Docker gVisor Kata Containers Vagrant
Isolation level βœ… Hardware (KVM) ❌ Shared kernel ⚠️ User-space kernel βœ… Hardware (QEMU/CH) βœ… Hardware (VBox/VMware)
Boot time βœ… ~125ms βœ… ~50ms βœ… ~5ms ⚠️ ~200ms+ ❌ 30-60s
Setup complexity βœ… One command βœ… Low ⚠️ Medium ❌ High ⚠️ Medium
Security model βœ… Jailer + seccomp + cgroups + dedicated kernel ⚠️ Namespaces + cgroups ⚠️ Syscall filtering βœ… Full VM + nested containers βœ… Full VM
Network isolation βœ… Built-in policies (allow/deny/custom) ❌ Manual (iptables) ⚠️ Inherits Docker ❌ Manual ⚠️ NAT/bridged
Docker image support βœ… --from-image βœ… Native βœ… Via runsc βœ… Via containerd ❌
Interactive shell βœ… WebSocket PTY βœ… exec βœ… exec βœ… exec βœ… SSH
File transfer βœ… Built-in upload/download βœ… cp βœ… cp βœ… cp ⚠️ Shared folders / SCP
JSON output βœ… All commands ⚠️ Partial ❌ ⚠️ Partial ❌
Memory overhead βœ… ~5 MiB per VM βœ… ~1 MiB ⚠️ ~15 MiB ❌ ~30 MiB+ ❌ 512 MiB+
Best for πŸ† AI sandboxing, untrusted code, multi-tenant General workloads K8s hardening K8s compliance Dev environments

Why vmsan? Docker shares the host kernel β€” a container escape means game over. gVisor intercepts syscalls in user-space, reducing attack surface but not eliminating it. Kata Containers provides real VM isolation but requires complex orchestration (containerd, shimv2, K8s). Vagrant boots full VMs that take 30+ seconds and hundreds of MBs.

vmsan gives you hardware-level isolation with Firecracker's minimal attack surface (< 50k lines of code), boots in milliseconds, and requires zero configuration β€” install and go.

πŸ“„ License

Apache-2.0

Published under the APACHE-2.0 license. Made by @angelorc and community πŸ’›


πŸ€– auto updated with automd

About

Firecracker made simple. Spin up secure microVMs in milliseconds, from install to interactive shell in one command.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors