Skip to main content

microVM manager built on Firecracker (Linux) and Apple Virtualization.framework (macOS)

Project description

Husker

An open-source microVM manager built on Firecracker (Linux) and Apple Virtualization.framework (macOS).

  • Boot lightweight VMs in milliseconds
  • Execute commands, transfer files, open interactive shells
  • Stream serial console logs
  • Port forwarding with nftables NAT (Linux)
  • REST API + CLI
  • Cloud-init style userdata scripts

Status

Pre-1.0. The core feature set works and has test coverage, but:

  • The HTTP API, CLI flags, config schema, and on-disk state layout may change without a deprecation period.
  • The Linux/Firecracker backend is more mature than the macOS/Apple VZ backend.
  • It has not been run at scale or under production workloads.
  • Security features (token auth, rate limiting, encrypted secrets) exist but have had limited review. Don't expose the daemon to an untrusted network.

Useful for experimentation, local development, and CI. Not recommended for production.

Quick Start

Install

macOS (Homebrew):

brew install rvben/tap/husker

Linux & macOS (installer script):

curl -sSfL https://raw.githubusercontent.com/rvben/husker/main/install.sh | sh

Cross-platform (PyPI):

pip install husker

Pinning a version: curl -sSfL https://raw.githubusercontent.com/rvben/husker/main/install.sh | HUSKER_VERSION=v0.1.2 sh or pip install husker==0.1.2.

First boot

# Fetch the default kernel + rootfs for this host
husker images pull

# Start the daemon
husker daemon &

# Boot a VM
husker run --name hello --cpus 2 --memory 512

# Interact
husker exec hello -- uname -a
husker shell hello
husker cp local.txt hello:/tmp/local.txt
husker logs hello -f

# Clean up
husker destroy hello

On Linux, husker run needs firecracker on PATH. If it's missing, husker prompts to download a pinned release into the data directory. For non-interactive use (CI, scripts), set HUSKER_AUTO_INSTALL_FIRECRACKER=1 to skip the prompt.

husker images pull fetches the latest signed image set from the images-* GitHub Releases. If no image release is published yet for this arch, the command will fail — use the BYO path below in the meantime.

BYO kernel / rootfs

If you want to use your own images, pass --kernel and the rootfs path:

husker run /path/to/rootfs.ext4 --kernel /path/to/vmlinux

Configuration

Copy config.example.toml to one of the discovery paths:

  1. ~/.config/husker/config.toml (user)
  2. /etc/husker/config.toml (system)

Or pass --config /path/to/config.toml explicitly. See config.example.toml for all available fields.

Platform Support

Platform Backend Networking Status
Linux x86_64 Firecracker TAP + nftables NAT, port forwarding Usable
macOS ARM64 Apple Virtualization.framework Shared NAT (VZ-managed) Experimental

Alternatives

husker is one of several ways to run microVMs. Rough positioning:

Tool Backend Focus Notes
husker Firecracker (Linux) + Apple VZ (macOS) Single-host VM manager with a REST API and CLI SQLite-backed state, port forwarding, guest agent over vsock.
Ignite Firecracker Docker-image-style workflow on Firecracker Archived by Weaveworks; Linux only.
firecracker-containerd Firecracker containerd runtime backed by microVMs Kubernetes-friendly; Linux only.
krunvm libkrun OCI-image microVMs on macOS No daemon; ephemeral per-command VMs.
Lima QEMU (+ VZ on macOS) Full Linux VMs as a dev environment Heavier than Firecracker; broader guest support.

Pick husker if you want Firecracker on Linux with a matching Apple VZ path on macOS, driven by a single CLI + daemon.

Architecture

CLI (husker) ──> REST API (husker-api) ──> Core (husker-core)
                                           ├── VMM (husker-vmm)      Firecracker / Apple VZ
                                           ├── State (husker-state)  SQLite persistence
                                           ├── Net (husker-net)      TAP devices, IP allocation
                                           └── Storage (husker-storage) Rootfs cloning
                                       Guest Agent (husker-agent) ←── Proto (husker-agent-proto)

Host-guest communication uses vsock (port 52). Messages are length-prefixed JSON with base64-encoded binary payloads.

Security

The daemon defaults to loopback-only. Don't bind it on a public interface without a bearer token and a terminating reverse proxy.

Troubleshooting

husker run can't find firecracker (Linux) On a TTY, husker prompts to download a pinned release. For scripted/CI use, set HUSKER_AUTO_INSTALL_FIRECRACKER=1 to skip the prompt, or install Firecracker yourself from the releases page.

husker run reports kvm_init: permission denied (Linux) Add your user to the kvm group: sudo usermod -aG kvm $USER and re-login.

husker run fails on macOS with a virtualization entitlement error The binary needs the com.apple.security.virtualization entitlement. pip, brew, and the installer script all ship a codesigned binary. If you built from source, run make install — it ad-hoc signs via husker.entitlements.

macOS: VM boots but exits immediately Apple VZ needs an initramfs to mount the rootfs. If you're using custom images, make sure --initrd points at a matching initramfs (see guest/build-initramfs.sh).

husker daemon binds but the CLI can't connect The CLI defaults to http://127.0.0.1:7777. If the daemon listens elsewhere, pass --api-url http://host:port (and --api-token if auth is enabled).

Rootfs edits don't take effect on macOS Use make update-rootfs to inject changes via debugfs (works in LXC and macOS). Loop-mounting doesn't work on macOS.

Development

Requires Rust 1.90+ and cargo-nextest.

make build          # Debug build
make build-release  # Release build (LTO, stripped)
make build-agent    # Static musl agent for guest VMs
make test           # Full test suite
make test-unit      # Unit tests only
make lint           # fmt-check + clippy
make check          # Type check
make install        # Install (auto-detects macOS, signs binary)

Running a Development VM

make run-daemon                     # Start daemon
make build-agent-aarch64            # Build ARM64 agent (macOS guests)
make update-rootfs                  # Inject agent into rootfs image

Systemd

A systemd unit file is provided at contrib/husker.service.

Contributing

Issues and pull requests welcome. See CONTRIBUTING.md for the dev workflow and commit conventions.

License

See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

husker-0.2.0.tar.gz (183.2 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

husker-0.2.0-py3-none-manylinux_2_28_x86_64.whl (7.9 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

husker-0.2.0-py3-none-manylinux_2_28_aarch64.whl (7.7 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

husker-0.2.0-py3-none-macosx_11_0_arm64.whl (7.1 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

husker-0.2.0-py3-none-macosx_10_12_x86_64.whl (7.5 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file husker-0.2.0.tar.gz.

File metadata

  • Download URL: husker-0.2.0.tar.gz
  • Upload date:
  • Size: 183.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for husker-0.2.0.tar.gz
Algorithm Hash digest
SHA256 6d1a619e0f193c8704d926b49c21b5eb4e5110859eeea2ad7786cb2b31f34bda
MD5 d05c3fb12d66dba4c78601fc34670665
BLAKE2b-256 d1b4c423141e014bedbb52844bcc10f93e9cefb901f79be2fc448114c0e24af6

See more details on using hashes here.

File details

Details for the file husker-0.2.0-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for husker-0.2.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5b27b5a981a4a7705c614d80d5f5bfe597a4f0097273423132e253a9ad49031e
MD5 ec25ec85e1015188856dcec85bc3fc3f
BLAKE2b-256 fdff60e013a35e31f35f76c31a4536510fe5a668dabce574036027a54b418368

See more details on using hashes here.

File details

Details for the file husker-0.2.0-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for husker-0.2.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 cb872db34119e36a121a618b5cacb4293a1866c163b944c1d4641e0c6d4161d7
MD5 43588b4834c6ddf84e0a1a0e225fcd16
BLAKE2b-256 1b86dfcaf62f408889c06d2c8f3abe0dc9a9d5a120f354def8c058679446e337

See more details on using hashes here.

File details

Details for the file husker-0.2.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for husker-0.2.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0b95fc97b17da8e4eba2ffa4d4d24505a6488db120fd00ea7fc7124bbfc3f722
MD5 94eab8c90d2d64dbd727b93a124aff25
BLAKE2b-256 f76c768c64e039222e8eb967abcff533e6b8360d243f85299298f432d7b6258d

See more details on using hashes here.

File details

Details for the file husker-0.2.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for husker-0.2.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 00bf1b54e81c8e074710f08f6b45a36f6f082f387c3a4109d6751f8ddeb5a4e2
MD5 70232d88af9fd153e29536f7fdb4f613
BLAKE2b-256 f6e16b41927f1954866c6bec17620e154a1597b22ab5f59ae6f5601f81ab128a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page