# QEMU/KVM hypervisor driver

- Deployment pre-requisites
- Connections to QEMU driver
- Import and export of libvirt domain XML configs
  - Converting from QEMU args to domain XML
  - Converting from domain XML to QEMU args
- Example domain XML config

The libvirt QEMU driver can manage any QEMU emulator from version 0.8.1 or later. It can also manage anything that provides the same QEMU command line syntax and monitor interaction. This includes KVM, and Xenner.

## Deployment pre-requisites

- QEMU emulators: The driver will probe `/usr/bin` for the presence of `qemu`, `qemu-system-x86_64`, `qemu-system-mips`,`qemu-system-mipsel`, `qemu-system-sparc`,`qemu-system-ppc`. The results of this can be seen from the capabilities XML output.
- KVM hypervisor: The driver will probe `/usr/bin` for the presence of `qemu-kvm` and `/dev/kvm` device node. If both are found, then KVM fullyvirtualized, hardware accelerated guests will be available.
- Xenner hypervisor: The driver will probe `/usr/bin` for the presence of `xenner` and `/dev/kvm` device node. If both are found, then Xen paravirtualized guests can be run using the KVM hardware acceleration.

## Connections to QEMU driver

The libvirt QEMU driver is a multi-instance driver, providing a single system wide privileged driver (the "system" instance), and per-user unprivileged drivers (the "session" instance). The of the driver protocol is "qemu". Some example conection URIs for the libvirt driver are:

        qemu:///session                      (local access to per-user instance)
        qemu+unix:///session                 (local access to per-user instance)

        qemu:///system                       (local access to system instance)
        qemu+unix:///system                  (local access to system instance)
        qemu://example.com/system            (remote access, TLS/x509)
        qemu+tcp://example.com/system        (remote access, SASl/Kerberos)
        qemu+ssh://root@example.com/system   (remote access, SSH tunnelled)

## Import and export of libvirt domain XML configs

The QEMU driver currently supports a single native config format known as `qemu-argv`. The data for this format is expected to be a single line first a list of environment variables, then the QEMu binary name, finally followed by the QEMU command line arguments

### Converting from QEMU args to domain XML

The `virsh domxml-from-native` provides a way to convert an existing set of QEMU args into a guest description using libvirt Domain XML that can then be used by libvirt.

    $ cat > demo.args <<EOF
    LC_ALL=C PATH=/bin HOME=/home/test USER=test \
    LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 \
    -nographic -monitor pty -no-acpi -boot c -hda \
    /dev/HostVG/QEMUGuest1 -net none -serial none \
    -parallel none -usb
    EOF
    $ virsh domxml-from-native qemu-argv demo.args
    <domain type='qemu'>
      <uuid>00000000-0000-0000-0000-000000000000</uuid>
      <memory>219136</memory>
      <currentMemory>219136</currentMemory>
      <vcpu>1</vcpu>
      <os>
        <type arch='i686' machine='pc'>hvm</type>
        <boot dev='hd'/>
      </os>
      <clock offset='utc'/>
      <on_poweroff>destroy</on_poweroff>
      <on_reboot>restart</on_reboot>
      <on_crash>destroy</on_crash>
      <devices>
        <emulator>/usr/bin/qemu</emulator>
        <disk type='block' device='disk'>
          <source dev='/dev/HostVG/QEMUGuest1'/>
          <target dev='hda' bus='ide'/>
        </disk>
      </devices>
    </domain>

NB, don't include the literral \ in the args, put everything on one line

### Converting from domain XML to QEMU args

The `virsh domxml-to-native` provides a way to convert a guest description using libvirt Domain XML, into a set of QEMU args that can be run manually.

    $ cat > demo.xml <<EOF
    <domain type='qemu'>
      <name>QEMUGuest1</name>
      <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
      <memory>219200</memory>
      <currentMemory>219200</currentMemory>
      <vcpu>1</vcpu>
      <os>
        <type arch='i686' machine='pc'>hvm</type>
        <boot dev='hd'/>
      </os>
      <clock offset='utc'/>
      <on_poweroff>destroy</on_poweroff>
      <on_reboot>restart</on_reboot>
      <on_crash>destroy</on_crash>
      <devices>
        <emulator>/usr/bin/qemu</emulator>
        <disk type='block' device='disk'>
          <source dev='/dev/HostVG/QEMUGuest1'/>
          <target dev='hda' bus='ide'/>
        </disk>
      </devices>
    </domain>
    EOF
    $ virsh domxml-to-native qemu-argv demo.xml
      LC_ALL=C PATH=/usr/bin:/bin HOME=/home/test \
      USER=test LOGNAME=test /usr/bin/qemu -S -M pc \
      -no-kqemu -m 214 -smp 1 -name QEMUGuest1 -nographic \
      -monitor pty -no-acpi -boot c -drive \
      file=/dev/HostVG/QEMUGuest1,if=ide,index=0 -net none \
      -serial none -parallel none -usb

## Example domain XML config

### QEMU emulated guest on x86_64

    <domain type='qemu'>
      <name>QEmu-fedora-i686</name>
      <uuid>c7a5fdbd-cdaf-9455-926a-d65c16db1809</uuid>
      <memory>219200</memory>
      <currentMemory>219200</currentMemory>
      <vcpu>2</vcpu>
      <os>
        <type arch='i686' machine='pc'>hvm</type>
        <boot dev='cdrom'/>
      </os>
      <devices>
        <emulator>/usr/bin/qemu-system-x86_64</emulator>
        <disk type='file' device='cdrom'>
          <source file='/home/user/boot.iso'/>
          <target dev='hdc'/>
          <readonly/>
        </disk>
        <disk type='file' device='disk'>
          <source file='/home/user/fedora.img'/>
          <target dev='hda'/>
        </disk>
        <interface type='network'>
          <source network='default'/>
        </interface>
        <graphics type='vnc' port='-1'/>
      </devices>
    </domain>

### KVM hardware accelerated guest on i686

    <domain type='kvm'>
      <name>demo2</name>
      <uuid>4dea24b3-1d52-d8f3-2516-782e98a23fa0</uuid>
      <memory>131072</memory>
      <vcpu>1</vcpu>
      <os>
        <type arch="i686">hvm</type>
      </os>
      <clock sync="localtime"/>
      <devices>
        <emulator>/usr/bin/qemu-kvm</emulator>
        <disk type='file' device='disk'>
          <source file='/var/lib/libvirt/images/demo2.img'/>
          <target dev='hda'/>
        </disk>
        <interface type='network'>
          <source network='default'/>
          <mac address='24:42:53:21:52:45'/>
        </interface>
        <graphics type='vnc' port='-1' keymap='de'/>
      </devices>
    </domain>

### Xen paravirtualized guests with hardware acceleration