Virtualizar con la Máquina Virtual del Kernel (KVM)

La virtualización es una tecnología que permite crear una plataforma aislada donde poder correr una maquina virtual (guest o invitado). Existen muchas soluciones para proveer una plataforma de virtualización. Esta guía se centra en activar la Máquina Virtual del Kernel (KVM) y configurar, crear y administrar máquinas virtuales a través del Administrador de Máquinas Virtuales de Red Hat (virt-manager).

Tabla de contenidos

Configurar el kernel
Deberá de compilar su kernel para activar el soporte de la máquina virtual. Además deberá activar el soporte para crear puentes ethernet (ethernet bridging), lo cual transformará su sistema GNU/Linux en un switch; permitiendo crear tarjetas de red virtuales para las máquinas virtuales.
Para activar la maquina virtual del kernel, compile las siguientes opciones en el kernel.
root@agd-desktop:~[*] Virtualization --->
    --- Virtualization
    <*> Kernel-based Virtual Machine (KVM) support
    <*>   KVM for Intel processors support
    < >   KVM for AMD processors support
    <*>   Host kernel accelerator for virtio net (EXPERIMENTAL)
    <*>   PCI driver for virtio devices (EXPERIMENTAL)
    <*>   Virtio balloon driver (EXPERIMENTAL)

Para poder activar funciones avanzadas de redireccionamiento IP, deberá compilar.
root@agd-desktop:~Device Drivers --->
    [*] Network device support --->
            <M> Universal TUN/TAP device driver support

Networking support --->
    Networking options --->
        <*> 802.1d Ethernet Bridging
        <*> 802.1Q VLAN Support

Una vez tenga configurado el kernel, tan solo deberá compilarlo, copiar el nuevo kernel a /boot y añadirlo a grub.


Instalar QEMU
KVM utiliza una versión modificada de QEMU, un emulador de procesadores con capacidad de virtualización. Deberá de descargar e instalar qemu-kvm, con casi total certeza estará disponible en los repositorios de su distribución ya sea como qemu-kvm o qemu-system-x86_64.

Si usted es usuario de gentoo deberá activar la USE flag vde para tener acceso a la tarjeta de red. Si además quiere tener acceso a la tarjeta de sonido, deberá añadir la USE flag alsa.
echo "app-emulation/qemu-kvm alsa vde" >> /etc/portage/package.use
emerge -av qemu-kvm


Configurar los permisos de acceso a KVM
Por defecto solo root podrá trabajar con la máquina virtual del kernel. Si desea poder usar KVM sin necesidad de logearse como root, deberá añadir su usuario, o los que desee, al grupo kvm.
agd-desktop # gpasswd -a agd kvm
Añadiendo al usuario agd al grupo kvm


Administrador de Máquinas Virtuales
Para facilitar la creación y gestión de máquinas virtuales puede hacer uso del Administrador de Máquinas Virtuales de Red Hat (virt-manager). Las dependencias de virt-manager son:
  • Python - Necesario por el propio virt-manager
  • GTK+ y PyGTK - Para construir la GUI
  • libvirt - APIs de virtualización
Probablemente virt-manager se encuentre en los repositorios de su distribución y su gestor de paquetes resolverá todas las dependencias automáticamente. Sin embargo si usted usa gentoo, en la rama estable, es probable que precise activar la rama inestable para algunos paquetes; lo cual lo podrá hacer con echo "categoría/paquete ~arquitectura" >> /etc/portage/package.keywords, como por ejemplo, echo "app-emulation/virt-manager ~amd64" >> /etc/portage/package.keywords.

Configurar los permisos de acceso a virt-manager
Si su sistema hace uso de policykit, y compiló virt-manager con soporte para policykit, deberá permitir el acceso a la API libvirt a los usuarios no root que operen con virt-manager. Puede hacerlo con polkit-auth --grant org.libvirt.unix.manage --user "nombre-usuario".
agd-desktop # polkit-auth --grant org.libvirt.unix.manage --user "agd"
agd-desktop # polkit-auth --grant org.libvirt.unix.manage --user "agd"
polkit-auth: AuthorizationAlreadyExists: An authorization for uid 1000 for the action org.libvirt.unix.manage with constraint '' already exists

Además precisará llevar a cabo los siguientes cambios en el fichero de configuración de libvirt (/etc/libvirt/libvirt.conf). Nota: Los cambios a partir de la línea 240 no son estrictamente necesarios.
Línea Antes Cambiar a Después
33 #listen_tcp = 1    --->  listen_tcp = 1
45 #tcp_port = "16509"    --->  tcp_port = "16509"
51 #listen_addr = "127.0.0.1"    --->  listen_addr = "127.0.0.1"
81 #unix_sock_group = "libvirt"    --->  unix_sock_group = "kvm"
88 #unix_sock_ro_perms = "0777"    --->  unix_sock_ro_perms = "0777"
98 #unix_sock_rw_perms = "0770"    --->  unix_sock_rw_perms = "0770"
129 #auth_unix_ro = "none"    --->  auth_unix_ro = "none"
138 #auth_unix_rw = "none"    --->  auth_unix_rw = "none"
146 #auth_tcp = "sasl"    --->  auth_tcp = "none"
155 #auth_tls = "none"    --->  auth_tls = "none"
163 #key_file = "/etc/pki/libvirt/private/serverkey.pem"    --->  key_file = "/etc/pki/libvirt/private/serverkey.pem"
171 #cert_file = "/etc/pki/libvirt/servercert.pem"    --->  cert_file = "/etc/pki/libvirt/servercert.pem"
175 #ca_file = "/etc/pki/CA/cacert.pem"    --->  ca_file = "/etc/pki/CA/cacert.pem"
180 #crl_file = "/etc/pki/CA/crl.pem"    --->  crl_file = "/etc/pki/CA/crl.pem"
240 #max_clients = 20    --->  max_clients = 2
248 #min_workers = 5    --->  min_workers = 1
259 #max_requests = 20    --->  max_requests = 3
265 #max_client_requests = 5    --->  max_client_requests = 1
274 #log_level = 3    --->  log_level = 2


Configurar un puente ethernet
Además de la configuración a nivel de kernel que ha realizado, precisará los siguientes paquetes:
A continuación deberá editar el fichero de configuración de su red, /etc/conf.d/net, que tendrá un aspecto similar al siguiente,
agd-desktop # nano /etc/conf.d/net# This blank configuration will automatically use DHCP for any net.*
# scripts in /etc/init.d.  To create a more complete configuration,
# please review /etc/conf.d/net.example and save your configuration
# in /etc/conf.d/net (this file :]!).

config_eth0=( "dhcp" )

Y deberá editarlo para dejarlo de la siguiente forma,
agd-desktop # nano /etc/conf.d/net# This blank configuration will automatically use DHCP for any net.*
# scripts in /etc/init.d.  To create a more complete configuration,
# please review /etc/conf.d/net.example and save your configuration
# in /etc/conf.d/net (this file :]!).

config_eth0=( "null" )
bridge_br0="eth0"
config_br0=( "dhcp" )

# Descomentar para desactivar dhcp e indicar los parámetros manualmente
#config_br0=( "192.168.1.20 netmask 255.255.255.0 brd 192.168.1.255" )
#routes_br0=( "default via 192.168.1.1" )
#dns_servers_br0=( "8.8.8.8 8.8.4.4" )


Crear una máquina virtual mediante el Administrador de Máquinas Virtuales virt-manager
Antes de iniciar el administrador de máquinas virtuales deberá iniciar el demonio libvirtd. Si usted es usuario de Arch Linux, debian o gentoo deberá ejecutar /etc/init.d/libvirtd start, mientras que si es usuario de fedora o ubuntu deberá ejecutar service libvirtd start.
agd-desktop # /etc/init.d/libvirtd status
* Caching service dependencies ...                                       [ ok ]
* status:  stopped
agd-desktop # /etc/init.d/libvirtd start
* Service libvirtd starting
* Service libvirtd started

Si ha llegado a este punto, deberá poder ejecutar el Administrador de Máquinas Virtuales. Desde él podrá crear nuevas máquinas virtuales y gestionar las existentes. A continuación se hará un ligero recorrido, mediante capturas de pantalla, donde usted aprenderá a crear una nueva máquina virtual.

Ventana principal del Administrador de Máuinas Virtuales virt-manager de Red Hat. Desde se puede crear una nueva máquina virtual (botón marcado con la flecha roja), comprobar el estado de las máquinas virtuales (en este caso solo está corriendo una sola máquina virtual) e iniciar, pausar o detener las máquinas virtuales.

Asistente para crear nuevas máquinas virtuales. Le permite elegir el método de instalación e incluso importar una imagen de una maquina virtual ya creada.

En el ejemplo se instalará una máquina virtual con ubuntu 10.10, como podrá observar en la captura de pantalla.

En este punto podrá seleccionar los recursos a los que tendrá acceso la máquina virtual. En el ejemplo hemos otorgado 1 GB de RAM y acceso a 2 CPU.

A continuación se pregunta por el tamaño que tendrá la imagen del sistema. En el ejemplo le hemos asignado 10 GB de espacio. Además podrá configurar la ubicación donde se guardará la imagen de la maquina virtual.

Por último se le presenta la configuración de la máquina virtual y además se le permite configurar la red. En este punto haremos uso del puente br0 configurado anteriormente.


Llegados a este punto su máquina virtual estará creada y se mostrará en la ventana principal del Administrador de Máquinas Virtuales:

A continuación verá el proceso de instalación de ubuntu 10.10 en la máquina virtual recién creada.


Gestionar las máquinas virtuales mediante el Administrador de Máquinas Virtuales virt-manager
Si selecciona una máquina virtual y pulsa sobre el icono "Abrir", accederá a la ventana principal de configuración de la máquina virtual.


Desde la opción "Processor" podrá configurar a cuantas CPU podrá tener acceso la máquina virtual. Además podrá indicar que tipo de procesador deberá emular la máquina virtual e incluso activar/desactivar flags especificas.

Desde la opción "Boot Options" podrá definir si desea que la máquina virtual se inicie junto con el sistema, algo muy útil si usted va a configurar una maquina virtual que actuará a como servidor web, correo, p2p... Además podrá definir desde donde quiere arrancar la máquina virtual, CD, HDD...

Al pulsar sobre botón "Agregar hardware" se abrirá una ventana desde donde podrá seleccionar que dispositivo quiere añadir a su máquina virtual, como por ejemplo un segundo disco duro virtual, acceso a un dispositivo usb...

Si usted va a correr un entorno gráfico en su maquina virtual, como en este ejemplo, le será muy útil agregar un nuevo dispositivo de entrada (Input) de tipo Tableta Gráfica USB EvTouch de esta forma el puntero del ratón al entrar en la ventana de la máquina virtual se comportará como si estuviese dentro de la máquina virtual no siendo necesario hacer clic sobre la máquina virtual para tener el control y pulsar las teclas de escape para regresar a la máquina anfitrión.

Ampliando las posibilidades de nuestras máquinas virtuales QEMU
1.- Activar el sonido en las máquinas virtuales
Si bien desde virt-manager se pueden modificar muchos parámetros y añadir acceso a las tarjetas de sonido, es necesario modificar la configuración de QEMU para poder acceder a este servicio. Para ello deberá editar /etc/libvirt/qemu.conf y cambiar el siguiente parámetro:
  Línea  
  Antes  
  Cambiar a  
  Después  
184
#vnc_allow_host_audio = 0
   ---> 
vnc_allow_host_audio = 1

2.- Mejorar el rendimiento gráfico
El driver gráfico que ofrece mayor rendimiento es vmvga
Las últimas versiones de virt-manager permiten cambiar el tipo de driver gráfico que desea usar en sus máquinas virtuales sin embargo no permiten cambiar la cantidad de memoria de vídeo disponible para la máquina virtual. Por defecto la cantidad de memoria de vídeo asignada es de 9 MB, si desea ampliar esta cantidad deberá editar el fichero xml de configuración de la máquina virtual. Estos ficheros se localizan en /etc/libvirt/qemu/
agd-desktop # ls /etc/libvirt/qemu
autostart                      gentoo-server.xml  ubuntu-10.10.xml
Fedora-GNOME3-Alpha.xml        LinEx.xml          Windows7.xml
gentoo-CLEAN-noX-noSERVER.xml  networks           WinXP.xml

El valor de memoria de vídeo debe indicarse en KB
En siguiente ejemplo se ampliará la cantidad de memoria de vídeo disponible por la máquina virtual makeinstall de 9 MB a 256 MB. Para ello se editará su fichero de configuración (/etc/libvirt/qemu/makeinstall.xml) y se sustituirá el siguiente segmento:
agd-desktop # nano /etc/libvirt/qemu/makeinstall.xml <video>
  <model type='cirrus' vram='9216' heads='1'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
 </video>

por:
agd-desktop # nano /etc/libvirt/qemu/makeinstall.xml<video>
  <model type='vmvga' vram='131072' heads='1'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
 </video>

3.- Activar aceleración 2D/3D
Para activar la aceleración gráfica deberá añadir <acceleration accel2d='yes' accel3d='yes'/> justo debajo de <model .... />, quedando:
agd-desktop # nano /etc/libvirt/qemu/makeinstall.xml  <video>
  <model type='vmvga' vram='131072' heads='1'/>
  <acceleration accel2d='yes' accel3d='yes'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
 </video>

Si desea aprender más sobre los ficheros de configuración de las máquinas virtuales puede informarse en libvirt Virtualization API - Domain XML format.

6 comentarios:

#
Anónimo dijo...

activo la aceleracion, pero no pasa nada
se ve lento :S

#
Antonio Guillen dijo...

Ten en cuenta que los drivers que integra KVM no ofrecen un gran rendimiento gráfico. Así que el rendimiento, hoy por hoy, es malo.

Si necesitas rendimiento gráfico, es mejor optar por XEN ya que permite a los huéspedes acceder a la tarjeta gráfica.

#
! dijo...

Muchas, muchas gracias :) , ¡excelente tutorial!

#
! dijo...

*ahora mismo estoy corriendo un ArchBang sobre Debian Squeeze, no muy veloz, pero sin problemas a la vista :) -sale en breve un gNewSense :)

#
lporras dijo...

Como puedo agregar otro monitor a la maquina virtual. Gracias.

#
Antonio Guillen dijo...

lporras hasta donde se solo se puede añadir un monitor de cada tipo (vnc, sdl y spice).

Aunque siempre puedes:
1.- Conectarte vía ssh
2.- Instalar un servidor vnc en la máquina virtual
3.- Conectarte mediante consola (tty) a la máquina virtual: virsh consola dominio

Por cierto, ¿para que quieres más de un monitor?

Publicar un comentario en la entrada

Recuerde que puede utilizar algunos códigos HTML como <b>para negrita</b>, <i>para cursiva</i> y <a href="URL">para enlaces</a>.