Máquinas virtuales en interfaces TAP con Qemu
Paquetes necesarios:
- bridge-utils
- UMLUtilities
- Qemu
Tenemos un anfitrión en el que ejecutamos Qemu y queremos varias máquinas virtuales con direcciones IP de la misma red que la maquina anfitrión conectadas con un bridge.
Para ello necesitaremos en el sistema operativo anfitrión un puente (bridge) y asociado a éste, al menos, una interface tap. Conceptualemente, bridge-utils proporciona algo así como switch virtual de capa dos. Las interfaces tap serían los puertos de acceso en los que se conectan los dispositivos finales (las maquinas virtualizadas) y el interface br sería el enlace trunk, el cual conecta con la interface ethx.
Para crear un bridge en Debian Squeeze hemos de editar el archivo /etc/network/interfaces
Borramos o comentamos las líneas con los parametros de la interface ethx
Añadimos en el archivo las interfaces tap que serán utilizadas. Ejemplo:
auto tap0 iface tap0 inet manual up ifconfig $IFACE 0.0.0.0 up down ifconfig $IFACE down tunctl_user usuariolinux
auto tap1 iface tap1 inet manual up ifconfig $IFACE 0.0.0.0 up down ifconfig $IFACE down tunctl_user usuariolinux
Con el parametro tunctl_user definimos qué usuario tendrá permiso para utilizar la interface tap.
Añadimos el puente. Ejemplo:
auto br0 iface br0 inet static address 192.168.1.4 netmask 255.255.255.0 gateway 192.168.1.1 bridge_ports eth1 tap0 tap1 bridge_maxwait 0
Con el parámetro bridge_ports asociamos las interfaces tap0 y tap1 al br0, éste ultimo con eth1.
Así las interfaces tap0 y tap1 tendrán direcciones IP de la red 192.168.1.0/24
Para comprobar que las interfaces estén correctamente añadidas:
bridge name bridge id STP enabled interfaces br0 8000.1ae850.1fa9c4 no eth1 tap0 tap1
Si alguna interface no se hubiera asociado al puente, utilizamos el comando brctl para añadir la interface al puente, por ejemplo:
#brctl addif br0 tap1
Con esto ya tenemos dos interfaces tap «a la escucha” en las que conectar dispositivos virtuales.
Para que un usuario del sistema utilice la interface tap es necesario que esté en el grupo uml-net.
Lanzamos el emulador, por ejemplo:
$qemu-system-i386 -hda 'drive.img' -m 256 -net nic,model=e1000, -net tap,ifname=tap0,script=no,downscript=no
No puede haber más de una maquina funcionando al mismo tiempo cuyas interfaces tap tengan el mismo nombre. En ese caso, solo tendrá acceso a la red la que haya sido lanzada en primer lugar.
Por último, tan sólo hay que configurar los parametros TCP/IP en los sistemas operativos invitados como si tuveran una conexion directa al medio fisico de transmisión.