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/kvmwritable 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.qcow2 | Raw ext4 root filesystem in a qcow2. No partition table, no kernel. 64 MiB. |
vmlinuz-microvm | Debian cloud kernel, bzImage. For QEMU microvm and Cloud Hypervisor. |
vmlinux-microvm | The same kernel as ELF, for Firecracker. |
initrd-microvm.img | busybox 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-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 stdioFirecracker
Firecracker takes a raw disk and the ELF kernel.
$ qemu-img convert -O raw x0ne-os-microvm-amd64.qcow2 root.raw $ firecracker --no-api --config-file 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
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
$ 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.