qemu(1)

All the examples & notes use qemu-system-x86_64 but in most cases this can be swapped with the system emulator for other architectures.

Keybindings

Graphic mode:

Ctrl+Alt+g         release mouse capture from VM

Ctrl+Alt+1         switch to display of VM
Ctrl+Alt+2         switch to qemu monitor

No graphic mode:

Ctrl+a h           print help
Ctrl+a x           exit emulator
Ctrl+a c           switch between monitor and console

VM config snippet

Following command-line gives a good starting point to assemble a VM:

qemu-system-x86_64                              \
        -cpu host -enable-kvm -smp 4            \
        -m 8G                                   \
        -vga virtio -display sdl,gl=on          \
        -boot menu=on                           \
        -cdrom <iso>                            \
        -hda <disk>                             \
        -device qemu-xhci,id=xhci               \
        -device usb-host,bus=xhci.0,vendorid=0x05e1,productid=0x0408,id=capture-card

CPU & RAM

  • -cpu host emulate host CPU in guest VM
  • -enable-kvm use KVM instead software models (requires KVM on host machine)
  • -smp <N> number of guest CPUs

List available CPUs qemu-system-x86_64 -cpu help.

  • -m 8G size of guest RAM

Graphic & Display

  • -vga virtio use virtio as 3D video graphic accelerator (requires virgl in guest)
  • -display sdl,gl=on use sdl window and enable openGL context

Boot Menu

  • -boot menu=on enables boot menu to select boot device (enter with ESC)

Block devices

  • -cdrom <iso> attach cdrom drive with iso to a VM
  • -hda <disk> attach disk drive to a VM
  • -drive file=<file>,format=qcow2 generic way to configure & attach a drive to a VM

Create a disk with qemu-img

To create a qcow2 disk (qemu copy-on-write) of size 10G:

qemu-img create -f qcow2 disk.qcow2 10G

The disk does not contain any partitions or a partition table. We can format the disk from within the guest as following example:

# Create `gpt` partition table.
sudo parted /dev/sda mktable gpt

# Create two equally sized primary partitions.
sudo parted /dev/sda mkpart primary 0% 50%
sudo parted /dev/sda mkpart primary 50% 100%

# Create filesystem on each partition.
sudo mkfs.ext3 /dev/sda1
sudo mkfs.ext4 /dev/sda2

lsblk -f /dev/sda
  NAME   FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
  sda
  ├─sda1 ext3         ....
  └─sda2 ext4         ....

USB

Host Controller

  • -device qemu-xhci,id=xhci add XHCI USB controller to the VM (supports USB 3.0, 2.0, 1.1). id=xhci creates a usb bus named xhci.

USB Device

  • -device usb-host,bus=xhci.0,vendorid=0x05e1,productid=0x0408 pass-through USB device from host identified by vendorid & productid and attach to usb bus xhci.0 (defined with controller id)

Debugging

  • -gdb tcp::<port> open gdbstub on tcp <port> (-s shorthand for -gdb tcp::1234).
  • -S freeze CPU at startup.

References