Named VMs that keep their disk.

A persistent VM has a name, a profile and its own writable disk. One command creates it, and it survives stops, starts and restarts of the daemon.

kiln vm create dev --profile ubuntu-docker --disk 64G --memory-mb 8192 --cpu 4

Open it, use it, stop it.

Linux guests boot on Firecracker. Windows 11 boots on QEMU.

Kiln builds each profile image once for a given disk size and caches it. Every VM starts as its own writable copy of that image.

kiln vm create builds the image when it needs to. Run ensure first if you would rather pay that cost ahead of time.

kiln vm images ensure ubuntu --disk 8G

Kiln ships no Windows media or licence keys. You supply the ISO, and Kiln prepares the profile from it once.

kiln profile prepare windows11 --iso /path/to/Win11.iso
alpine
Small Linux for smoke tests and light tooling
debian
Debian stable
ubuntu
Ubuntu LTS
kali
Kali rolling, headless
ubuntu-docker
Ubuntu with Docker, rsync, SSH, Postgres client tools and build essentials
windows11
Windows 11, prepared once from your own ISO

A role fills in the shape.

A role is an alias for ordinary create flags. It resolves to a profile, CPU, memory, disk and power mode, and any flag you pass overrides it.

kiln vm roles kiln vm create bourne-runner --role ci-runner --dry-run
builder
A warm Docker build VM with more CPU and memory than the default.
ci-runner
An always-on Docker VM sized for self-hosted CI runners.
docker-worker
An on-demand Docker VM for short build and test jobs.

What a stop keeps, and what a start rewrites.

Changes inside the VM go to its own root filesystem. They survive kiln vm stop, kiln vm start and restarts of kilnd.

Before each boot of a Linux guest, Kiln rewrites five files on that disk and no others. Windows guests get none of these writes.

These VMs are headless.

They suit shells, installed tools, package state and isolated service testing. Kiln has no GUI desktops, USB passthrough or Wi‑Fi monitor mode, so it does not replace a desktop hypervisor.

/root/.ssh/authorized_keys
Kiln replaces its own key line and keeps every other line.
/etc/hostname
Set to vm-<name>.
/etc/hosts
Kiln adds missing localhost and hostname entries and keeps the rest.
/etc/resolv.conf
Replaced with Kiln's guest DNS servers when the host configures any.
/etc/kiln/private-network.json
Written when the VM is on a private network, removed when it is not.

CPU is a time budget.

--cpu sets how much CPU time the VM may use. The number of vCPUs the guest sees comes from the profile unless you pass --vcpus.

kiln vm create ci --profile ubuntu-docker --disk 128G --memory-mb 12288 --cpu 6 --vcpus 6

Share one pool

Set KILN_POOLED_CPU_LIMIT on the host and create guests with --cpu-kind pooled. Each guest can use spare capacity, and one quota caps the pool as a whole.

Use a systemd slice

Pass --slice ci.slice and the VM runs under that slice's CPU and memory policy. You define the slice. Kiln only places the VM in it.