Skip to content

QEMU

General

  • Enable KVM full virtualization support:

      qemu-system-x86_64 -enable-kvm disk.img

    or:

      qemu-system-x86_64 disk.img
  • Use KVM processor with all host features:

      qemu-system-x86_64 -cpu host disk.img
  • Emulate a standard PC machine:

      qemu-system-x86_64 -cpu host -machine type=pc disk.img
  • Set virtual RAM size to 2 GB:

      qemu-system-x86_64 -cpu host -machine type=pc -m 2G disk.img

Drives

  • Boot ISO file ‘boot.iso’ as CD-ROM drive:

      qemu-system-x86_64 -drive file=boot.iso,media=cdrom
  • Boot existing device ‘/dev/sdh’:

      qemu-system-x86_64 -drive file=/dev/sdh,media=disk
  • Boot a VMware Virtual Machine Disk (VMDK):

      qemu-system-x86_64 -drive file=disk.vmdk,media=disk
  • Boot image in read-only mode and without cache:

      qemu-system-x86_64 -drive file=disk.qcow2,readonly,cache=none,media=disk
  • Mount directory ‘/mnt/’ as a Virtual FAT filesystem (VVFAT):

      qemu-system-x86_64 -drive file=fat:rw:/mnt/,media=disk
  • Determine boot order to be ‘cd->disk->network’:

      qemu-system-x86_64 -boot order=dcn -cdrom boot.iso -hda disk.qcow2

Video

  • Select standard VGA card with resolutions up to 2560x1600:

      qemu-system-x86_64 -vga std disk.img
  • Start in full screen:

      qemu-system-x86_64 -vga std -full-screen disk.img
  • See supported screen resolutions (in guest machine):

      xrandr
  • Change screen resolution (in guest machine):

      xrandr --size 1

    or:

      xrandr --size 1920x1080
  • Toggle full screen: Ctrl+Alt+f

  • Enlarge screen: Ctrl+Alt+`` + ``

  • Shrink screen: Ctrl+Alt+`` - ``

  • Restore the screen’s un-scaled dimensions: Ctrl+Alt+u

Audio

  • Enable audio and select Intel HD Audio hardware with PulseAudio (pa) as backend:

      qemu-system-x86_64 -audio pa,model=hda disk.img

Network

  • User Networking (SLIRP) default settings:

    Setting IP
    Network 10.0.2.0
    Netmask 255.255.255.0
    Gateway 10.0.2.2
    Namerserver 10.0.2.3
    SMB server 10.0.2.4
  • Configure User Networking:

      qemu-system-x86_64 -netdev user,id=mynet0,net=192.168.76.0/24,dhcpstart=192.168.76.9
  • Dump Virtual Machine’s network traffic to PCAP file:

      qemu-system-x86_64 -netdev user,id=mynet0 -object filter-dump,id=dump0,netdev=mynet0,file=./vm0.pcap

Images

  • Create an image file of 4G of size:

      qemu-img create -f qcow2 disk.qcow2 4G
  • Convert from VMware Virtual Machine Disk (VMDK) to raw format:

      qemu-img convert -f vmdk disk.vmdk -O raw disk.img
  • Convert from raw format to qcow2 format:

      qemu-img convert -f raw disk.img -O qcow2 disk.qcow2
  • Convert from VirtualBox Disk Image (VDI) format to raw format:

      vboxmanage clonehd disk.vdi --format raw disk.img
  • Convert from raw format to VirtualBox Disk Image (VDI):

      vboxmanage convertfromraw disk.img --format VDI disk.vdi

Snapshots

  • Boot image with temporary snapshot so changes are discarded:

      qemu-system-x86_64 disk.qcow2 -snapshot
  • Create snapshot of image:

      qemu-img snapshot -c name-of-snapshot disk.qcow2
  • List snapshots for image file:

      qemu-img snapshot -l disk.qcow2
  • Revert to specific snapshot:

      qemu-img snapshot -a name-of-snapshot disk.qcow2
  • Delete specific snapshot:

      qemu-img snapshot -d name-of-snapshot disk.qcow2
  • Create a new disk image based on an existing image:

      qemu-img create -b disk.qcow2 new-disk.qcow2
  • Copy an image based on a backing image so both are merged into one:

      qemu-img convert new-disk.qcow2 new-disk-merged.qcow2

Vagrant

  • Install plugin for libvirt:

      vagrant plugin install vagrant-libvirt
  • Install plugin to convert vagrant boxes:

      vagrant plugin install vagrant-mutate
  • Migrate official Vagrant boxes to libvirt format:

      vagrant box add debian/jessie64
      vagrant mutate debian/jessie64 libvirt
  • Start Vagrant environment using libvirt as provider:

      vagrant up --provider libvirt

virsh

  • Edit virtual machine’s XML configuration:

      virsh edit "<vmname>"
  • Configure port redirection in XML configuration:

      <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
        ...
        <qemu:commandline>
          <qemu:arg value='-netdev'/>
          <qemu:arg value='user,id=net0,net=10.0.10.0/24,hostfwd=tcp:127.0.0.1:2222-:22'/>
          <qemu:arg value='-device'/>
          <qemu:arg value='e1000,netdev=net0'/>
        </qemu:commandline>
      </domain>

Setup

  • Prepare an image file:

      qemu-img create -f qcow2 ./disk.img 4G
      sudo modprobe nbd max_part=16
      sudo qemu-nbd -c /dev/nbd0 ./disk.img
      printf 'o\nn\np\n1\n\n\nw\n' | sudo fdisk /dev/nbd0
      sudo partprobe /dev/nbd0
      sudo mkfs.ext4 /dev/nbd0p1
      sudo qemu-nbd -d /dev/nbd0
      sudo modprobe -r nbd
  • Alternative way to prepare a RAW image file:

      qemu-img create -f raw ./disk.img 4G
      printf 'o\nn\np\n1\n\n\nw\n' | fdisk ./disk.img
      sudo losetup /dev/loop0 ./disk.img
      sudo partprobe /dev/loop0
      sudo mkfs.ext4 /dev/loop0p1
      sudo losetup -d /dev/loop0
  • Yet another way to prepare a RAW image file:

      qemu-img create -f raw ./disk.img 4G
      printf 'o\nn\np\n1\n\n\nw\n' | fdisk ./disk.img
      sudo kpartx -av ./disk.img
      sudo mkfs.ext4 /dev/mapper/loop0p1
      sudo kpartx -dv ./disk.img
  • Mount and unmount partition inside image file:

      guestmount -a ./disk.img -m /dev/sda1 --rw /mnt/loop
      ls -l /mnt/loop
      guestunmount /mnt/loop
  • Use debootstrap to install a system into a partition inside an image file and chroot into it:

      sudo modprobe nbd max_part=16
      sudo qemu-nbd -c /dev/nbd0 ./disk.img
      sudo partprobe /dev/nbd0
      sudo mount /dev/nbd0p1 /mnt/loop
      sudo debootstrap --arch amd64 stretch /mnt/loop http://deb.debian.org/debian
      sudo mount -t proc /proc /mnt/loop/proc
      sudo mount --rbind --make-rslave /dev /mnt/loop/dev
      sudo mount --rbind --make-rslave /sys /mnt/loop/sys
      sudo mount --rbind --make-rslave /run /mnt/loop/run
      sudo chroot /mnt/loop /bin/bash
      # # commands inside chroot
      sudo umount -R /mnt/loop
      sudo qemu-nbd -d /dev/nbd0
      sudo modprobe -r nbd