Curso OpenStack en Emergya. Enero 2016
Kernel Based Virtual Machine (KVM) es una solución de virtualización completa para linux que funciona sobre procesadores x86 con extensiones de virtualización por hardware. El componente principal de kvm es el módulo kvm.ko que fue incluido en el kernel linux 2.6.20.
KVM no proporciona una solución completa de virtualización, sino que reutiliza muchos componentes del proyecto de emulación y virtualización qemu.
Se puede utilizar KVM directamente o a través de la API de virtualización libvirt, como en el caso de OpenStack.
Para la ejecución de KVM se necesita de un procesador con las extensiones de virtualización x86. Se puede comprobar esto a través del comando:
# egrep -c '(vmx|svm)' /proc/cpuinfo
Según el resultado: * 0: no hay soporte para KVM. * 1 ó más: hay soporte de virtualización para KVM. Pero hay que comprobar también que esté activo en BIOS.
Una vez comrado si tenemos acelaración hardware, instalamos los siguientes paquetes básicos:
# apt-get install qemu-kvm libvirt-bin bridge-utils
Los usuarios que vayan a gestionar las máquinas virtuales deben pertenecer a los grupos: libvirtd y kvm.
Como software adicional se puede instalar:
# apt-get install virtinst virt-manager ubuntu-vm-builder virt-viewer
Podemos asegurarnos de que todo funciona correctamente a través de:
# virsh -c qemu:///system list
Id Nombre Estado
----------------------------------
Para la configuraci ́on inicial de KVM hay que crear un pool de almacenamiento para guardar las im ́agenes de las VMs. Seguimos los siguientes pasos:
Editamos el fichero /tmp/pool-default.xml con el siguiente contenido:
<pool type=’dir’>
<name>default</name>
<target>
<path>/var/lib/libvirt/images</path>
</target>
</pool>
Definimos el pool en libvirt:
# virsh pool-define /tmp/pool-default.xml
Lo iniciamos:
# virsh pool-start default
Lo configuramos para que si inicie siempre de forma automática:
# virsh pool-autostart default
Comprobamos:
# virsh pool-list --all
Nombre Estado Inicio automático
-----------------------------------------
default activo si
El fichero de creaci ́on del pool se encuentra en: /etc/libvirt/storage/default.xml
Por defecto se utiliza un pool de almacenamiento basado en directorio, por defecto es /var/lib/libvirt/images. Este directorio puede ser una partición aparte, un volumen lógico LVM o cualquier otro tipo de almacenamiento. Se pueden crear mucho más pools y de diferentes tipos.
Para la configuración de la red seguimos los siguientes pasos:
Iniciamos la red por defecto:
# virsh net-start default
Configuramos para que se inicie siempre de forma automática:
# virsh net-autostart default
Listamos la configuración de red disponible.
# virsh net-list
Nombre Estado Inicio automático
-----------------------------------------
default activo si
Las características de la red por defecto (default):
El contenido del fichero es:
<network>
<name>default</name>
<bridge name="virbr0" />
<forward/>
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.2" end="192.168.122.254" />
</dhcp>
</ip>
</network>
Siempre que hagamos cualquier cambio de configuración podemos reiniciar el sistema libvirt a través de:
# service libvirt-bin restart
También podemos gestionar el servicio con:
# service libvirt-bin start
# service libvirt-bin stop
# service libvirt-bin status
Hay varias utilidades que permiten la creación de máquinas virtuales sobre KVM. Destacamos las siguientes:
Vamos a estudiar la herramienta virt-install. virt-install es un comando que permite el aprovisionamiento de nuevas máquinas virtuales, es una herramienta en línea de comandos que permite la creación de máquinas virtuales Xen y KVM utilizando libvirt.
Como características destacamos:
Básicamente hay que indicar:
Por lo que las opciones obligatorias son son: –name, –ram, –disk; más las relativas a la instalación como –cdrom, –location, …
Ejemplo: instalar Ubuntu 12.04 desde una imagen ISO
virt-install --connect qemu:///system
--virt-type=kvm
--name VirtualMachine01
--ram 1024
--vcpus=2
--disk path=/var/lib/libvirt/images/VirtualMachine01.img,size=8
--cdrom /var/lib/libvirt/images/ubuntu-12.04-server-amd64.iso
--os-type linux
--os-variant=ubuntuprecise
--graphics vnc,keymap=es
--noautoconsole
--network network=default
--description "Ubuntu 12.04 Server"
Nos podemos conectar a la consola para ver el proceso de instalación a travñes del protocolo VNC, de varias formas:
# virt-viewer -c qemu:///system VirtualMachine01
# vinagre localhost:0
# vncviewer localhost:0
Se utilice la herramienta que se utilice, la configuración de la máquina virtual reside en un fichero XML como éste:
<domain type=’kvm’>
<name>Ubuntu01</name>
<uuid>18dbd172-97f7-242f-ebc8-c8b377b8ec71</uuid>
<description>Ubuntu 12.04 Server</description>
<memory>524288</memory>
<currentMemory>524288</currentMemory>
<vcpu>2</vcpu>
<os>
<type arch=’x86_64’ machine=’pc-1.0’>hvm</type>
<boot dev=’hd’/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset=’utc’/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type=’file’ device=’disk’>
<driver name=’qemu’ type=’raw’/>
<source file=’/var/VirtualMachines/libvirt/Ubuntu01.img’/>
<target dev=’vda’ bus=’virtio’/>
<address type=’pci’ domain=’0x0000’ bus=’0x00’ slot=’0x04’ function=’0x0’/>
</disk>
<disk type=’block’ device=’cdrom’>
<driver name=’qemu’ type=’raw’/>
<target dev=’hdc’ bus=’ide’/>
<readonly/>
<address type=’drive’ controller=’0’ bus=’1’ unit=’0’/>
</disk>
<controller type=’ide’ index=’0’>
<address type=’pci’ domain=’0x0000’ bus=’0x00’ slot=’0x01’ function=’0x1’/>
</controller>
<interface type=’network’>
<mac address=’52:54:00:75:cc:68’/>
<source network=’default’/>
<model type=’virtio’/>
<address type=’pci’ domain=’0x0000’ bus=’0x00’ slot=’0x03’ function=’0x0’/>
</interface>
<serial type=’pty’>
<target port=’0’/>
</serial>
<console type=’pty’>
<target type=’serial’ port=’0’/>
</console>
<input type=’mouse’ bus=’ps2’/>
<graphics type=’vnc’ port=’-1’ autoport=’yes’ keymap=’es’/>
<video>
<model type=’cirrus’ vram=’9216’ heads=’1’/>
<address type=’pci’ domain=’0x0000’ bus=’0x00’ slot=’0x02’ function=’0x0’/>
</video>
<memballoon model=’virtio’>
<address type=’pci’ domain=’0x0000’ bus=’0x00’ slot=’0x05’ function=’0x0’/>
</memballoon>
</devices>
</domain>
Para la gestión de las máquinas virtuales se cuenta con dos herramientas:
virsh es la principal herramienta para la gestión completa de KVM, esta basada en libvirt. Permite iniciar,pausar y apagar máquinas virtuales. Pero también permite otras funciones como gestión de la red, de los pool de almacenamiento, de los volúmenes, de las snapshots, etc. Presenta dos modos de funcionamiento, modo comando y modo interactivo.
Para conectarnos al hipervisor podemos optar por:
Conectarnos en local:
# virsh
# virsh -c qemu:///system
Conectarnos a un hipervisor remoto:
# virsh -c qemu+ssh://usuario@host:port/system
Entre los comandos genéricos más importantes de virsh destacamos: