Contents

x0ne OS / Handbook / Run x0ne OS

Run as a microVM

Works today, built from source (measured 2026-10-12). Boots to the login prompt under QEMU microvm, Firecracker and Cloud Hypervisor. Not published yet. Boot time is measured below.

x0ne OS as a microVM: its own kernel, hardware isolation, no firmware and no PCI. Target: login in under 1.5 s, measured by make bench-boot.

Measured 2026-10-09 with make bench-boot, KVM on an AMD Ryzen 9 7900X, warm page cache, 20 boots each: login prompt at 0.85 s median (p95 0.92 s) under QEMU -M microvm, 0.64 s (p95 0.71 s) under Firecracker. The UEFI qcow2 takes 5.9 s.

Two kinds

  • Interactive: a shell in a fresh VM, for an agent, a lab or a test.
  • Service: one service per microVM, in the style of smolBSD. It boots, serves, and holds nothing else.

A microVM runs CPU inference only. Neither Firecracker nor QEMU microvm passes a GPU through. See GPUs.

Prerequisites

  • Linux with KVM (/dev/kvm writable by you).
  • QEMU 10 or Firecracker.
  • The image files. Today: built from source, see Building x0ne OS from source.

What the image contains

x0ne-os-microvm-amd64.qcow2Raw ext4 root filesystem in a qcow2. No partition table, no kernel. 64 MiB.
vmlinuz-microvmDebian cloud kernel, bzImage. For QEMU microvm and Cloud Hypervisor.
vmlinux-microvmThe same kernel as ELF, for Firecracker.
initrd-microvm.imgbusybox and the two virtio modules. 2 MiB.

QEMU microvm

This is the boot test command, with the serial console on your terminal. The disk is never written.

qemu microvm
$ qemu-system-x86_64 -M microvm,accel=kvm,rtc=off -cpu host -m 512 -smp 2 \
    -nodefaults -no-user-config -display none -no-reboot \
    -kernel vmlinuz-microvm -initrd initrd-microvm.img \
    -append "console=ttyS0 root=/dev/vda rw quiet" \
    -drive id=root,file=x0ne-os-microvm-amd64.qcow2,format=qcow2,if=none,snapshot=on \
    -device virtio-blk-device,drive=root -serial stdio

Firecracker

Firecracker takes a raw disk and the ELF kernel.

firecracker
$ qemu-img convert -O raw x0ne-os-microvm-amd64.qcow2 root.raw
$ firecracker --no-api --config-file fc.json
fc.json
{"boot-source":{"kernel_image_path":"vmlinux-microvm","initrd_path":"initrd-microvm.img",
  "boot_args":"console=ttyS0 root=/dev/vda rw quiet reboot=k panic=1"},
 "drives":[{"drive_id":"root","path_on_host":"root.raw","is_root_device":false,"is_read_only":false}],
 "machine-config":{"vcpu_count":2,"mem_size_mib":512}}

Expected output

serial console
x0ne-boot-report: listening tcp=0 udp=0

Debian GNU/Linux 13 x0ne ttyS0

x0ne login:

On the first boot, x0ne OS asks for your account before this prompt, or takes it from credentials. See First boot and your account.

The launcher

scripts/x0ne-vm starts the microVM from the build output, in the VMM container. make run-microvm does the same with the defaults. works today

x0ne-vm
$ scripts/x0ne-vm -m 512 -c 2 -p 8080:80
# -m MiB of memory, -c vCPUs, -p HOST:GUEST TCP forward (turns the network on)
# -k qemu|firecracker|cloud-hypervisor, -s snapshot, -i NAME for a service microVM

Without -s, the disk is kept in out/run: the account made at first boot stays. Bad options are refused (tested).

How to verify

The boot report must say tcp=0 udp=0: nothing listens. Then make bench-boot times the boot: 20 boots per VMM, median and p95.

How to undo

Stop QEMU with Ctrl+C, or Firecracker by ending its process. snapshot=on leaves the qcow2 unchanged. Delete root.raw to drop the Firecracker disk.

See also