Fri 15 Sep 2017 — Fri 26 Jan 2018


QEMU lets you run an virtual machine emulated on a variety of hardware.

It doesn't have a graphical console, or any way to save a VM's state.

However, changes made to the image during operation are permenant.

You can make a layered file so that your changes are separated out from the base image.

Basic Operation

Run the binary specific to the architecture you want to emulate, such as qemu-system-arm.

  • -M some-machine to emulate a specific machine.
  • -cpu some-cpu
  • -m 2048 megabytes of memory
  • -drive format/raw,file=my-os-disk.img put in a disk
  • -kernel some-kernel-file
  • -append some stuff put in a kernel command line, e.g. to specify the boot partition with -append root=/dev/sda1.

Raspberry Pi Specifics

  curl > kernel-qemu

qemu-system-arm \
    -m versatilepb \
    -cpu arm1176 \
    -m 256 \
    -kernel kernel-qemu
    ## Whatever else you want

/etc/fstab likely entries about the memory card reader by default. This means that qemu will boot it in emergency mode, in which case lots of things won't work (like the network).


The default network (equivalent to -net nic -net user) works, but is slow. Ping doesn't work by default.

NIC -net nic
network device on the emulated guest machine.
TAP -net tap,ifname=eth0
makes a network device on the host machine available. You may have to sudo.
Virtual Distributed Ethernet (VDE)
useful for when you have multiple VMs.
Usermode network -net user
should give magical transparent network access.