Configuración de la red
Ya tenemos una máquina virtual corriendo Linux 2.4.26 en nuestro sistema, pero sin red, es decir, estamos aislados del mundo. Y un Linux aislado... No me lo puedo imaginar. Me duele sólo con pensarlo!
Hay varias maneras de proporcionar conectividad a la instancia UML (podéis consultarlas en la sección de red de la web del proyecto). Una de las más sencillas es a través de la utilidad uml_net (UML se encarga de crearte un dispositivo TAP y asignarle una IP simplemente con pasar un argumento a la línea de comandos), pero yo me inclino por crear un dispositivo TAP en el host y crear un bridge donde añadiré este dispositivo (que se corresponderá con eth0 de la instancia UML) y la interfaz eth0 del host. De este modo la máquina virtual tiene acceso directo a la red local. No hace falta decir que necesitáis soporte en el host tanto para bridging como para dispositivos TUN/TAP.
Pero antes de todo esto hay que dar permisos de escritura sobre el dispositivo /dev/net/tun al usuario que ejecutará UML (de otro modo no tendría acceso a la red). Para hacerlo, creo que lo mejor es asignar al dispositivo un nuevo grupo, darle permisos de escritura e ir añadiéndole todos los ususarios que tengan que ejecutar instancias UML:
# addgroup umlnetwork
S'està afegint el grup umlnetwork (1001)...
Fet.
# chgrp umlnetwork /dev/net/tun
# adduser umluser umlnetwork
S'està afegint l'usuari umluser al grup umlnetwork...
Fet.
# chmod g+w /dev/net/tun
Ahora tenemos que ejecutar los pasos necesarios para hacer todo el montaje. Lo pongo en forma de script por simplicidad (el script hay que ejecutarlo como root y recordad que tenéis que tener instaladas las uml-utilities, así como bridge-utils):
#!/bin/bash
# Inici de l'uml en mode bridge. Basat en els exemples de
#http://user-mode-linux.sourceforge.net/networking.html.
# S'ha d'executar com a root.
#carreguem el mòdul tun
modprobe tun
#creem un dispositiu per a l'usuari
tunctl -d umltap0 2>/dev/null
tunctl -u umluser -t umltap0
#afegim el bridge
ifconfig br0 down 2>/dev/null
brctl delbr br0 2>/dev/null
brctl addbr br0
ifconfig eth0 0.0.0.0 promisc up
ifconfig umltap0 0.0.0.0 promisc up
ifconfig br0 192.168.0.5 netmask 255.255.255.0 up
brctl stp br0 off
brctl setfd br0 1
brctl sethello br0 1
brctl addif br0 eth0
brctl addif br0 umltap0
route add default gw 192.168.0.1
#arranquem la instància uml
su umluser -c './linux ubd0=root_fs ubd1=swap mem=32M eth0=tuntap,umltap0'
Una vez dentro de la máquina virtual hay que configurar la red:
(none):~# ifconfig eth0 192.168.0.100 up
(none):~# ifconfig
eth0 Link encap:Ethernet HWaddr FE:FD:C0:A8:02:64
inet addr:192.168.0.100 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING 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:5
Y con esto ya tenemos la máquina conectada con el exterior:
(none):~# ping -c 1 192.168.0.5
PING 192.168.0.5 (192.168.0.5): 56 data bytes
64 bytes from 192.168.0.5: icmp_seq=0 ttl=64 time=1.0 ms
--- 192.168.0.5 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 1.0/1.0/1.0 ms
De todas maneras, para ir bien deberíamos introducir las entradas pertinentes en /etc/network/interfaces de modo que cuando arranquemos la máquina virtual ya tengamos red:
auto lo
iface lo inet loopback
iface eth0 inet static
address 192.168.0.100
netmask 255.255.255.0
gateway 192.168.0.1
(Para ir aún mejor, habría que poner las entradas adecuadas en /etc/resolv.conf, para resolución de nombres).
Si todo ha funcionado, ya deberíamos tener un Linux plenamente funcional y conectado a la red. Ahora es cuando (después de asignar contraseña a root y crear una cuenta de usuario "normal") deberíamos actualizar el sistema y empezar a instalar aplicaciones o, como un servidor, pasarnos primero de todo a SARGE o SID.
Notas finales
Modo skas
Por razones de seguridad y rendimiento, es recomendable aplicar el patch skas al kernel del host. Yo no le he hecho porque todavía no ha salido el patch para la versión del kernel que uso actualmente y porque de momento no lo pongo en producción, donde sí que lo considero imprescindible. Para más información consultad la página sobre skas.
Acceso al host
Si queréis poder acceder al disco del host desde la máquina virtual, no necesitáis NFS ni FTP. Podéis hacerlo de manera muy cómoda por medio de hostfs, simplemente montando el sistema de ficheros como cualquier otro:
(none):~# mkdir /mnt/host
(none):~# mount -t hostfs none /mnt/host
(none):~# ls /mnt/host
bin cdrom etc home initrd lost+found mnt proc root-n sys usr vmlinuz
boot dev floppy include lib man opt root sbin tmp var
(none):~#
Evidentmente, el acceso al sistema de ficheros del host se hará con los privilegios que tenga el usuario que ejecuta UML. De todas formas, hay entornos en los que seguramente no interese que los usuarios de la máquina virtual accedan al host (por ejemplo, en entornos de hosting). En este caso, podemos compilar el kernel UML sin soporte para hostfs.
Cómo compartir sistemas de ficheros
Como medida para ahorrar espacio en disco, podéis compartir sistemas de ficheros entre diferentes instancias UML a través de COW (copy-on-write). El sistema de ficheros original será de sólo lectura (si no, las instancias UML entrarían en conflicto) y es la capa COW la que da acceso de lectura-escritura a cada una de las instancias. Esto lo hace guardando y manteniendo los cambios en un dispositivo privado de cada una. Para entendernos: cuando desde una instancia UML se escribe en el sistema de ficheros compartido, se guardan los datos en un dispositivo de la propia instancia, mientras que cuando el acceso es de lectura la información se va a buscar a los dos dispositivos (al privado y, si no está allí, al compartido).
Información de depuración
Si seguís el artículo al pie de la letra os encontraréis con un ejecutable (./linux) extremadamente voluminoso puesto que contendrá información de depuración. Para eliminar esta información podéis ejecutar el comando:
~/uml$ strip linux
(Gracias ivaniclixx).
Enlaces
|