Getting Started
Table of contents
- Platform Model
- Prerequisites
- Install
- First Start
- Build An Image
- Run A VM
- Networking And Ports
- Service Discovery (Guest DNS)
- Volumes
- Compose
- Updating
- Next
Platform Model
Jerboa currently runs in two supported ways:
- Linux host:
jerboatalks to a nativejerboadprocess over a Unix socket. - Windows host:
jerboa.exetalks tojerboadrunning inside a dedicated WSL2 distro managed byjerboa daemon.
Notes:
jerboadis Linux-only.- Native VM execution depends on Linux hypervisor support.
- Windows support is built around WSL2, not native Windows virtualization.
Prerequisites
Linux
Required for native execution:
- Linux
- QEMU (
qemu-system-x86_64) - Go
1.25+only if you build the CLI from source
Optional:
/dev/kvmfor accelerated QEMU; without it, QEMU runs with TCG emulation- Firecracker if you want
--hypervisor firecracker - kernel build toolchain (
gcc-multilib,nasm,qemu-utils) only if you build the kernel/toolchain locally
Windows
Required:
- WSL2
- a Linux distro available to host the dedicated Jerboa distro import
- Go
1.25+only if you build the CLI from source
The actual daemon and hypervisors run inside the imported jerboa WSL2 distro. Firecracker still requires KVM.
Install
Linux
For a native Linux host, the repo ships a one-shot installer:
sudo scripts/install.sh
jerboa status
That path provisions the Linux-side runtime, including the daemon service.
If you are building from source instead:
git clone https://github.com/AitorConS/jerboa.git
cd jerboa
make build
Artifacts are written to dist/. make build builds both binaries; use make build-cli or make build-daemon for one side, or make -j2 build to build both in parallel. Source builds use -trimpath; distro/build.sh also builds jerboad with -s -w, making the WSL rootfs artifact about 9 MiB smaller.
Windows
On Windows the jerboa CLI ships with the Jerboa Desktop app, whose installer puts jerboa on your PATH. Install the app, then import the dedicated WSL2 distro that hosts the daemon:
jerboa daemon install
jerboa daemon start
jerboa daemon status
The desktop app can also manage this runtime for you from its GUI. jerboa daemon install --rootfs <tarball> imports a locally built distro rootfs instead of downloading the release artifact from the signed manifest.
First Start
Linux daemon
Typical native daemon start:
sudo jerboad --host unix:///var/run/jerboad.sock
Useful daemon flags:
sudo jerboad \
--host unix:///var/run/jerboad.sock \
--metrics-addr :9090 \
--ui-addr :8080 \
--vm-store sqlite
Windows daemon
The daemon lives inside WSL2 and is usually started through the CLI:
jerboa daemon start
jerboa daemon logs -f
The Windows client auto-starts the daemon for daemon-backed commands when needed.
Build An Image
jerboa build requires a reachable daemon. If unikernels are new to you, read Build Concepts first — it explains the one-process model, packages, and everything unikernel.toml can do.
Scaffold a project
jerboa init
jerboa init detects the project language and writes a fully commented unikernel.toml documenting every field and its pitfalls. Use --lang raw for package-driven builds (databases, prebuilt binaries).
From a Go project
jerboa build examples/hello --name hello --lang go
Go source builds use size-oriented defaults (-trimpath and stripped linker flags) unless later custom build args override them.
From a source directory with auto-detection
jerboa build examples/flaskapp --name flaskapp --port 8080
jerboa build examples/nextapp --name nextapp --port 3000
Supported build modes:
gonodepythonrustraw
Runtime packages (the Node/Python runtimes, database servers, shared libraries) come from the ops ecosystem by default (--pkg-source ops); unikernel.toml can override build/run defaults, declare packages (pkgs = [...]), and run pre-build steps.
Before assembling the image, the build runs preflight checks (is the program a bootable Linux ELF? are all its shared libraries in the image?) and aborts with an explanation and a fix hint when something would fail at boot. Add --smoke to also boot the image once right after building and scan its output for known failure signatures:
jerboa build examples/flaskapp --name flaskapp --port 8080 --smoke
From a prebuilt static ELF
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o hello ./examples/hello
jerboa build ./hello --name hello
If a build or a boot fails, check Troubleshooting — it decodes every common error message.
Run A VM
jerboa run hello:latest
jerboa ps
jerboa logs <vm-id>
Attach to serial output:
jerboa run hello:latest --attach
Follow buffered logs:
jerboa logs <vm-id> -f
Networking And Ports
Port publishing is tied to managed networking. There is no SLIRP fallback.
jerboa network create app
jerboa run myapp:latest --network app -p 8080:80 --name web
jerboa dns list --network app
Joining a network assigns the VM a guest IP automatically: the daemon’s IPAM hands out the next free address from the network’s subnet. Pass --ip only when you need a fixed address:
jerboa run myapp:latest --network app --ip 10.100.0.10 -p 8080:80
Important:
-p/--portrequires--network- TCP forwarding works today
- UDP port mappings are accepted syntactically but are currently skipped by the forwarder with a warning
Publish bind address
By default a published port listens on all interfaces (0.0.0.0), so it is reachable from the LAN — and, on Windows, mirrored to the host by WSL2. To restrict a port to the local host, prefix the mapping with a bind address, Docker-style:
jerboa run myapp:latest --network app -p 127.0.0.1:8080:80 # localhost only
jerboa run myapp:latest --network app -p 8080:80 # all interfaces
Service Discovery (Guest DNS)
VMs on the same network resolve each other by name. The daemon runs a small DNS server that answers from live VM state, so an app can connect to a peer by its VM/service name instead of a hardcoded IP:
jerboa network create app
jerboa run mysql:latest --network app --name db -p 3306:3306
jerboa run myapp:latest --network app --name web -p 8080:8080 -e DB_HOST=db
# inside `web`, the hostname `db` resolves to the db VM's IP
How it works:
- each image bakes an
/etc/resolv.confpointing at a fixed resolver address the daemon owns; guests reach it through their default gateway - queries are scoped by source IP, so
dbresolves to thedbVM on the caller’s own network - names the daemon does not own are forwarded to an upstream resolver, so ordinary internet lookups still work
- the same mechanism powers
compose— services connect to each other by service name (see Compose)
Inspect the records the resolver would return:
jerboa dns list --network app
jerboa dns resolve db --network app
Volumes
jerboa volume create data --size 1G
jerboa run myapp:latest -v data:/var/data
jerboa volume inspect data
A fresh volume is empty — mounting it over a path that has baked data (e.g. a pre-initialized database) shadows that data. Create and seed in one step:
jerboa volume create pgdata --size 1G --seed-pkg eyberg/postgresql:11.3.0 --src /db
jerboa run postgresql -v pgdata:/db --network pgnet -p 5432:5432
See Build Concepts → Volumes And Seeding for why seeding is needed.
Compose
Compose stack:
jerboa compose up stack.yaml
jerboa compose ps stack.yaml
jerboa compose logs stack.yaml api
jerboa compose down stack.yaml --volumes
Updating
The CLI has no self-update command. How you update depends on the platform:
- Windows — update through the Jerboa Desktop app, which bundles the CLI (on your PATH) and reconciles the WSL2 daemon/distro runtime for you.
- Linux — reinstall
jerboa/jerboadyourself (rerunscripts/install.shor rebuild from source). - kernel tooling is managed separately through
jerboa kerneland is also auto-downloaded on first VM boot when missing.
Check what you have against the latest published release with jerboa version:
jerboa version # installed CLI/kernel vs latest of every component
jerboa kernel check # is a newer kernel available?
jerboa kernel update # install the latest kernel toolchain