Migrando de XEN a KVM en Ubuntu

Hace 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/.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

Twitter Digg Delicious Stumbleupon Technorati Facebook Email

5 Respuestas para “Migrando de XEN a KVM en Ubuntu”

  1. Hola tengo una duda he buscado la manera de incorporar mis maquinas virtuales a la red local para que sean accedidas por cualquiera pero no a sido posible, lo que pasa esque lo estoy realizando con fedora core 10 y solo e encontrado info para ubuntu o debian me gustaria si fuera posible me dijieras donde puedo encontrar info sobre KVM y fedora core 10 y br0 para que mi router les asigne ip y esten dentro de mi red local.

  2. la forma q yo encontre para hacer eso… bien con virtualbox-ose, es crear tarjetas tun/tap aderidas al br0… cree 3 y veo a la maquina sin problema… el unico detalle es q debes configurar correctamente al ussuario de la maquinavirtual para q tenga permisos en el dev sobre la tarjeta… cosa q por motivo de vagancia no hice aun

    asi tengo
    host=ubuntu1004
    eth0-|
    …..|-eth0:1….192.168.100.x
    …..|-eth0:2….192.168.100.x
    …..|-eth0:3….192.168.100.x

    eth1-|
    …..|-br0-|
    ………..|
    ………..|-tap0
    ………..|-tap1
    ………..|-tap2

    los tap los configuro como tarjetas fisicas en el guest iniciado, ve y es visto desde la red

    kseltar
    deshn.co.cc

  3. Saludos,
    estoy instalando KVM, pero tengo el siguiente incoveniente: mi conexión a internet no es a través de cable Ethernet, sino mediante una tarjeta wifi RealTek 9180 (PCI).

    En mi archivo /etc/network/interfaces hay sólo esto:
    auto lo
    iface lo inet loopback

    Al hacer un ifconig, obtengo esto:
    eth0 Link encap:Ethernet HWaddr 00:25:22:56:6d:ee
    UP BROADCAST MULTICAST MTU:1500 Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
    Interrupt:42 Base address:0x6000

    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Mask:255.0.0.0
    inet6 addr: ::1/128 Scope:Host
    UP LOOPBACK RUNNING MTU:16436 Metric:1
    RX packets:20 errors:0 dropped:0 overruns:0 frame:0
    TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:1408 (1.4 KB) TX bytes:1408 (1.4 KB)

    virbr0 Link encap:Ethernet HWaddr 86:b4:67:bc:ec:0c
    inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
    inet6 addr: fe80::84b4:67ff:febc:ec0c/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:0 (0.0 B) TX bytes:8423 (8.4 KB)

    wlan1 Link encap:Ethernet HWaddr 08:10:74:a8:ee:f2
    inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
    inet6 addr: fe80::a10:74ff:fea8:eef2/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:41 errors:0 dropped:0 overruns:0 frame:0
    TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:9247 (9.2 KB) TX bytes:8771 (8.7 KB)
    Interrupt:23 Memory:febff000-fec00000

    La pregunta es, ¿Cómo haría el puente?

    Gracias

Trackbacks/Pingbacks

  1. EsLoMas.com » Cómo agrandar el tamaño de una imagen KVM - 10. Nov, 2008

    […] 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. […]

  2. Pasar de XEN a KVM : Tristán Grimaux - 05. Mar, 2009

    […] http://www.eslomas.com/index.php/archives/2008/10/06/migrando-de-xen-a-kvm-en-ubuntu/ […]