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