OpenStack

Curso OpenStack en Emergya. Enero 2016

Unidades

View the Project on GitHub iesgn/emergya

Curso OpenStack

Introducción a KVM

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.

Instalación de KVM

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
----------------------------------

Almacenamiento de las máquinas virtuales

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:

  1. 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>
    
  2. Definimos el pool en libvirt:

     # virsh pool-define /tmp/pool-default.xml
    
  3. Lo iniciamos:

     # virsh pool-start default
    
  4. Lo configuramos para que si inicie siempre de forma automática:

     # virsh pool-autostart default
    
  5. Comprobamos:

     # virsh pool-list --all
     Nombre 			Estado 			Inicio automático
     -----------------------------------------
     default 		activo 			si
    
  6. 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.

Introducción a las redes en KVM

Para la configuración de la red seguimos los siguientes pasos:

  1. Iniciamos la red por defecto:

     # virsh net-start default
    
  2. Configuramos para que se inicie siempre de forma automática:

     # virsh net-autostart default
    
  3. 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>

Servicio libvirt

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

Creación de máuinas virtuales

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

Gestión de máquinas virtuales

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:

Entre los comandos genéricos más importantes de virsh destacamos: