Running a QEMU VM#
This guide walks through running a local QEMU/KVM virtual machine on a Linux host and deploying demo-ops into it. This is the simplest way to try out the platform locally.
Prerequisites#
A Linux host with KVM support (
/dev/kvmmust exist)QEMU installed (
qemu-system-x86_64)Bridge networking (
br0) configured on the host — VMs appear on the LAN and can receive DHCP addressesNix installed on the workstation
NixOS installer image available
Bios firmware for UEFI boot
Prepare UEFI firmware#
nix build nixpkgs#OVMF.fd -o ~/w/ovmf
Prepare NixOS installer#
Make sure to have an installer ISO ready to boot the machine from.
For repeated tests, it may be convenient to build an installer which has your public ssh key already baked in:
See: https://nixos.org/manual/nixos/stable/#sec-building-image
Creating and booting the VM#
1. Create a virtual disk#
qemu-img create -f qcow2 ~/w/disks/demo-dev.qcow2 50G
2. Boot the VM on the bridge#
qemu-system-x86_64 \
-enable-kvm -m 16G -smp 2 \
-bios ~/w/ovmf/FV/OVMF.fd \
-drive file=~/w/demo-dev.qcow2,format=qcow2,if=virtio \
-cdrom ~/w/nixos-installer/iso/nixos-installer-x86_64-linux.iso \
-boot d \
-netdev bridge,id=net0,br=br0 \
-device virtio-net-pci,netdev=net0 \
-nographic
The -nographic flag runs the VM headless — the serial console
appears in your terminal.
Adjust -m and -smp depending on your needs.
3. Wait until installer boots#
Wait for the installer to boot. Note the DHCP IP address from the console output (or check your router’s lease table).
Note
You may have to select items from the boot menu in case you did already install previously into the machine.
You can tweak things with the -boot option.
4. Verify SSH access#
Verify SSH access from the workstation:
ssh root@<vm-ip> hostname
Deploying demo-ops#
Adjust host configuration#
Adjust the host configuration, e.g. configure IP addresses and put a public SSH key in.
Deploy the machine#
With SSH access confirmed, deploy the demo-ops configuration into the VM:
nix run github:nix-community/nixos-anywhere -- \
--flake '.#dev' \
--target-host root@<vm-ip>
After reboot, verify that SSH still works against the deployed system.
Note
If you started with the installer and then deployed a machine into it, the ip address likely has changed to the configured static ip.
QEMU console control#
With -nographic, the VM console is your terminal. Useful
shortcuts:
Ctrl-a xKill QEMU immediately.
Ctrl-a hShow all QEMU monitor shortcuts.
poweroffRun inside the VM for a graceful shutdown.