Migrando de XEN a KVM en Ubuntu
October 6th, 2008Hace unos meses comencé a utilizar XEN como plataforma de virtualización en mi servidor doméstico, sin embargo con la actualización a Ubuntu 8.04 LTS comenzó a darme problemas de conectividad entre las máquinas virtuales, el host e internet. Tras mucho investigar averigüé que habían sacado la versión 8.04 sin resolver unos problemas con la plataforma AMD64 (y eso que es un LTS), y dado que la opción preferente era KVM no tenía visos de resolverse rápido. Así pues no me ha quedado más remedio que pasarme a KVM. El cambio ha sido mejor de lo que pensaba porque KVM, combinado con libvirt y virt-manager, está bastante más maduro que cuando lo probé hace un año, pero esto no quita para que Ubuntu haya hecho algo bastante poco apropiado, más acorde con otro tipo de compañías.
Instalación y Configuración
Antes de nada hay que tener en cuenta que para ejecutar KVM es necesario disponer de un procesador que soporte virtualización. El siguiente comando debería devolver algo, en caso contrario es que no se dispone del soporte necesario.
$ egrep '(vmx|svm)' /proc/cpuinfo
Para instalar KVM es suficiente con utilizar apt-get y solicitar instalar el paquete correspondiente, así como algún otro paquete que utilizaremos más adelante.
$ sudo apt-get install qemu virt-manager libvirt-bin kvm bridge-utils $ sudo modprobe kvm $ sudo lsmod | grep kvm kvm_intel 39232 0 kvm 131800 1 kvm_intel
Para que el usuario activo sea capaz de ejecutar máquinas virtuales sin requerir el uso de sudo se añade el usuario al grupo kvm.
$ sudo adduser $USER kvm
El último comando nos indica que KVM está activo, por lo que podemos continuar con su configuración. De partida KVM permitirá que las máquinas virtuales que creemos tengan acceso a la red y sean visibles entre ellas, así como desde el servidor anfitrión, creando una subred específica y utilizando NAT. Sin embargo las máquinas no serán directamente accesibles desde el resto de la red, por lo que en caso de requerir que formen parte de ella como cualquier otro equipo, será necesario configurar un bridge, para lo cual será necesario también deshabilitar el NetworkManager.
El primer paso consite en detener el NetworkManager y deshabilitarlo.
$ sudo /etc/dbus-1/event.d/26NetworkManagerDispatcher stop $ sudo /etc/dbus-1/event.d/25NetworkManager stop
A continuación hay que crear dos archivos con la palabra “exit” en ellos. Los archivos son:
/etc/default/NetworkManager /etc/default/NetworkManagerDispatcher
Una vez hecho esto hay que configurar la configuración del interfaz de red. Para ello primero detendremos el interfaz de red sobre el que queremos definir el bridge, por ejemplo eth0.
$ sudo ifdown eth0
A continuación modificaremos la definición del interfaz en el archivo /etc/network/interfaces, sustituyendo la definición de eth0 por la de br0.
auto br0
iface br0 inet static
address 192.168.2.4
netmask 255.255.255.0
network 192.168.2.0
broadcast 192.168.2.255
gateway 192.168.2.2
bridge_ports eth0
bridge_stp off
bridge_maxwait 5
Esta configuración define br0 como un bridge construido sobre eth0, asignando una configuración de red al puente de forma estática, aunque lo mismo podría haberse hecho de forma dinámica con DHCP.
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_maxwait 5
Ahora ya puede iniciarse el interfaz creado br0.
$ sudo ifup br0
Finalmente hay que añadir al archivo /etc/sysctl.conf las siguientes líneas
net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0
Y cargar la nueva configuración.
$ sudo sysctl -p /etc/sysctl.conf
Ahora ya deberíamos disponer de un dispositivo físico compartido, al cual podríamos asignar las máquinas virtuales que creemos, obteniendo acceso completo a la LAN tanto de entrada como de salida.
$ sudo brctl show bridge name bridge id STP enabled interfaces virbr0 8000.000000000000 yes br0 8000.00188b7c932d no eth0
Configuración de las máquinas virtuales
La creación de máquinas virtuales es realmente sencilla con el asistente que viene con virt-manager. Aunque en nuestro caso lo que nos interesa en la reutilización de las máquinas que teníamos definidas en XEN y que estaban basadas en HVM, podemos utilizar también virt-manager para definirlas en KVM, indicando manualmente las características del hardware de cada una y utilizando el archivo con la imagen de la máquina.
La siguiente imagen muestra un pantallazo de virt-manager con las dos máquinas virtuales que antes funcionaban con XEN, funcionando ahora con KVM.

Esta otra imagen muestra el acceso a ambas máquinas desde otro equipo de la red. Puede verse como se realiza una conexión por RDP a la máquina con Windows XP y una conexión con VNC al XUbuntu.

El único problema que me he encontrado a la hora de definir las máquinas para KVM ha sido con el Windows XP, ya que si lanzaba la máquina desde línea de comandos con KVM funcionaba, pero no si lo hacía desde virt-manager, ya que se bloqueaba antes siquiera de salir el logo de windows. Para resolver este problema hay que editar el archivo XML con la configuración de la máquina virtual windows (/etc/libvirt/qemu/<nombremáquina>.xml) y añadir las siguientes líneas justo al final.
<features> <acpi/> </features>
Tras hacer estos cambios hay que ejecutar lo siguiente.
$ sudo virsh define /etc/libvirt/qemu/<nombremaquina>.xml quit
Más información
delicious
menéame
fresqui

November 10th, 2008 a las 9:51 pm
[…] Por falta de previsión me he encontrado con un problema de espacio en una de las máquinas virtuales que tengo configuradas con KVM. El caso es que por defecto suelo crear imágenes de 4GB, pero parece que no es suficiente para el avaricioso Windows XP, aunque para ser honesto, era de esperar después de instalar el Office 2003 y alguna cosilla más. El caso es que continuamente me estaban saltando alertas y el rendimiento de la máquina virtual era cercano a insoportable, por lo que me puse a ampliar el tamaño de la imagen. Aunque utilizo virt-manager, no es posible realizar esta acción desde él. La solución más sencilla pasa por utilizar qemu-img y luego arrancar con una imagen Ubunto (por ejemplo) y utilizar GParted. […]