QEMU/KVM hypervisor driver
- Deployment pre-requisites
- Connections to QEMU driver
- Import and export of libvirt domain XML configs
- 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 ofqemu
,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 ofqemu-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 ofxenner
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>