KVM Driver 3.6
KVM (Kernel-based Virtual Machine) is a complete virtualization technique for Linux. It offers full virtualization, where each Virtual Machine interacts with its own virtualized hardware. This guide describes the use of the KVM virtualizer with OpenNebula, please refer to KVM specific documentation for further information on the setup of the KVM hypervisor itself.
The hosts must have a working installation of KVM, that usually requires:
-l migrate=migrate_local
to vmm_mad
arguments.error: cannot close file: Bad file descriptor
upgrade libvirt version. Version 0.8.7 has a bug related to file closing operations. https://bugzilla.redhat.com/show_bug.cgi?format=multiple&id=672725OpenNebula uses the libvirt interface to interact with KVM, so the following steps are required in the hosts to get the KVM driver running:
/etc/libvirt/qemu.conf
to include dynamic_ownership = 0
. To be able to use the images copied by OpenNebula, change also the user and group under which the libvirtd is run to “oneadmin”:<xterm> $ grep -vE '^($|#)' /etc/libvirt/qemu.conf user = “oneadmin” group = “oneadmin” dynamic_ownership = 0 </xterm>
<oneadmin>
) has to pertain to the <libvirtd> and <kvm> groups in order to use the deaemon and be able to launch VMs.
<xterm> owner /var/lib/one/** rw, </xterm>
oneadmin
user:
<xterm> # content of file: /etc/polkit-1/localauthority/50-local.d/50-org.libvirt.unix.manage-opennebula.pkla [Allow oneadmin user to manage virtual machines] Identity=unix-user:oneadmin Action=org.libvirt.unix.manage #Action=org.libvirt.unix.monitor ResultAny=yes ResultInactive=yes ResultActive=yes </xterm>
OpenNebula uses libvirt's migration capabilities. More precisely, it uses the TCP protocol offered by libvirt. In order to configure the physical hosts, the following files have to be modified:
/etc/libvirt/libvirtd.conf
: Uncomment “listen_tcp = 1”. Security configuration is left to the admin's choice, file is full of useful comments to achieve a correct configuration. As a tip, if you don't want to use TLS for connections set listen_tls = 0
./etc/default/libvirt-bin
: add -l option to libvirtd_opts
OpenNebula needs to know if it is going to use the KVM Driver. To achieve this, uncomment these drivers in /etc/one/oned.conf:
IM_MAD = [ name = "im_kvm", executable = "one_im_ssh", arguments = "-r 0 -t 15 kvm" ] VM_MAD = [ name = "vmm_kvm", executable = "one_vmm_exec", arguments = "-t 15 -r 0 kvm", default = "vmm_exec/vmm_exec_kvm.conf", type = "kvm" ]
The following are template attributes specific to KVM, please refer to the template reference documentation for a complete list of the attributes supported to define a VM.
There are some attributes required for KVM to boot a VM. You can set a suitable defaults for them so, all the VMs get needed values. These attributes are set in /etc/one/vmm_exec/vmm_exec_kvm.conf
. The following can be set for KVM:
For example:
OS = [ KERNEL = /vmlinuz, BOOT = hd, ARCH = "x86_64"] DISK = [ driver = "raw" , cache = "default"] NIC = [ filter = "clean-traffic" ]
disk
(default), cdrom
or floppy
. This attribute corresponds to the media
option of the -driver
argument of the kvm
command.raw
, qcow2
… This attribute corresponds to the format
option of the -driver
argument of the kvm
command.ifname
option of the '-net' argument of the kvm
command.script
option of the '-net' argument of the kvm
command.$ kvm -net nic,model=? -nographic /dev/null
$ virsh -c qemu:///system nwfilter-list
Virtio is the framework for IO virtualization in KVM. You will need a linux kernel with the virtio drivers for the guest, check the KVM documentation for more info.
If you want to use the virtio drivers add the following attributes to your devices:
DISK
, add the attribute DEV_PREFIX=vd
NIC
, add the attribute model=virtio
Format and valid values:
FEATURES=[ pae={yes|no}, acpi={yes|no} ]
Default values for this features can be set in the driver configuration file so they don't need to be specified for every VM.
The raw attribute offers the end user the possibility of passing by attributes not known by OpenNebula to KVM. Basically, everything placed here will be written literally into the KVM deployment file (use libvirt xml format and semantics).
RAW = [ type = "kvm", data = "<devices><serial type=\"pty\"><source path=\"/dev/pts/5\"/><target port=\"0\"/></serial><console type=\"pty\" tty=\"/dev/pts/5\"><source path=\"/dev/pts/5\"/><target port=\"0\"/></console></devices>" ]
KVM supports hotplugging to the virtio
and the SCSI
buses. The bus the disk will be attached to is inferred from the DEV_PREFIX
attribute of the disk template.
sd
: SCSI
(default).vd
: virtio
.
If TARGET
is passed instead of DEV_PREFIX
the same rules apply (what happens behind the scenes is that OpenNebula generates a TARGET
based on the DEV_PREFIX
if no TARGET
is provided).
The driver consists of the following files:
/usr/lib/one/mads/one_vmm_exec
: generic VMM driver./var/lib/one/remotes/vmm/kvm
: commands executed to perform actions.And the following driver configuration files:
/etc/one/vmm_exec/vmm_exec_kvm.conf
: This file is home for default values for domain definitions (in other words, OpenNebula templates).It is generally a good idea to place defaults for the KVM-specific attributes, that is, attributes mandatory in the KVM driver that are not mandatory for other hypervisors. Non mandatory attributes for KVM but specific to them are also recommended to have a default.
/var/lib/one/remotes/vmm/kvm/kvmrc
: This file holds instructions to be executed before the actual driver load to perform specific tasks or to pass environmental variables to the driver. The syntax used for the former is plain shell script that will be evaluated before the driver execution. For the latter, the syntax is the familiar:ENVIRONMENT_VARIABLE=VALUE
See the Virtual Machine drivers reference for more information.