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

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages