Guía del desarrollador de Gentoo Linux para hacer pruebas con "User-Mode Linux"
1.
Obtener User-Mode Linux
Importante:
Antes de utilizar "User-Mode Linux", Ud. debe estar usando un
perfil sin NPTL y debe usar <glibc-2.4. Siga las
instrucciones
para cambiar los
perfiles. Tendrá que ejecutar emerge -e world luego de
haberse cambiado a un perfil sin NPTL.
|
Tal como dice la página de User-Mode Linux
(http://user-mode-linux.sourceforge.net), User-Mode Linux (UML)
permite al usuario "ejecutar Linux dentro de si mismo". Específicamente,
proporciona una máquina virtual donde el usuario puede "ejecutar software
con fallos, experimentar con un núcleo o una distribución nueva de
Linux o meterse con lo más íntimo de Linux, sin arriesgar la
instalación principal de Linux". Los cambios experimentales en
algunos paquetes fundamentales de Gentoo como los son
sys-apps/baselayout o sys-libs/glibc tienen el potencial
de romper el sistema y hacer que no arranque; con User-Mode Linux
podemos probar estos cambios sin preocuparnos de romper nuestro sistema
Linux.
La mayoría de los núcleos 2.6 tienen soporte de UML. Aunque puede usar
sus fuentes actuales del núcleo, puede ser más sensato mantener
separadas la(s) fuentes del núcleo UML. Después de todo, estará
compilando un nuevo núcleo con una configuración diferente y puede que
quiera tener sistemas heterogéneos en su principal sistema Linux
(varios núcleos UML distintos).
Así que descargue las fuentes del núcleo (por ejemplo, la serie
vanilla desde
kernel.org) y extráigala en alguna
ubicación local con fines de desarrollo.
A continuación, configure este núcleo UML como lo haría para cualquier
otro sistema, pero añada ARCH=um para que el software de
compilación sepa que este núcleo está destinado a ejecutarse como un
proceso invitado ("guest process") en el sistema principal.
Listado de Código 1.1: Compilar el núcleo UML |
# cd /srv/aegis/src/uml-linux
# make menuconfig
# make linux
# cp linux /usr/local/bin/linux
|
Aviso:
El parámetro ARCH=um es ¡extremadamente importante!
|
En un sistema Gentoo por defecto /usr/local/bin está en
su ruta (path). Si no es así, debe encontrar una definición de
PATH en /etc/profile que pueda arreglar:
Listado de Código 1.2: Verifique $PATH |
$ echo $PATH | grep /usr/local/bin
|
Listado de Código 1.3: Definción de $PATH en /etc/profile como ejemplo |
PATH="/usr/local/bin:/usr/bin:/bin:${PATH}"
|
No se olvide de ejecutar source /etc/profile para que este
cambio haga efecto.
Para que el núcleo de User-Mode Linux arranque correctamente en una
máquina Gentoo, debe ser configurado para que no monte
automáticamente el /dev (devfs) por defecto. También debe
asegurarse de tener compilado el tmpfs (el sistema de ficheros
en memoria virtual o "Virtual Memory Filesystem"), ya que por defecto
los guiones de inicio Gentoo guardan su información en una pequeña
partición tmpfs. (Los núcleos binarios disponibles en el sitio web de
User-Mode Linux automáticamente montan /dev/ y no tienen
soporte para tmpfs compilado, así que ni se moleste en probarlos).
Se recomienda encarecidamente leer la documentación de User-Mode
Linux, pero la idea básica es que el
ejecutar /usr/local/bin/linux arranca el núcleo user-mode
e intenta levantar el sistema guardado en el
fichero root_fs, que debe estar ubicado en el directorio
de trabajo actual.
Tampoco hará mal instalar las herramientas de User-Mode Linux.
Listado de Código 1.4: Instalar las herramientas UML |
# emerge sys-apps/usermode-utilities
|
Estos programas facilitan la configuración de la red (y otras
cosas) entre el sistema virtual User-Mode Linux y el sistema base.
2.
Crear el root_fs
Hacer la jaula Gentoo (Gentoo chroot)
El root_fs es un fichero requerido por User-Mode Linux
que contiene un sistema de ficheros completo Gentoo Linux. Para
generarlo necesitará soporte para el dispositivo Loopback en el núcleo
del sistema base (no en el de User-Mode Linux).
Generar el root_fs será nuestro último paso. Antes
crearemos un sistema de ficheros Gentoo en una jaula (chroot) normal.
Necesitamos el fichero stage que puede descargarse de la red o ser
extraído de un CD de Instalación, o de una .iso de un CD de
Instalación.
Listado de Código 2.1: Montar una imagen .iso de un CD de Instalación |
# mkdir /mnt/loop
# mount -o loop /ruta/al/install-<TAB>.iso /mnt/loop
|
Configurar la jaula es prácticamente igual que para una instalación
normal de Gentoo Linux.
Listado de Código 2.2: Crear el punto de montaje para la jaula Gentoo |
# mkdir /mnt/gentoo
# cd /mnt/gentoo
# tar xvjpf /ruta/al/stage-<TAB>.tar.bz2
|
Adelante, desmonte la .iso. Ya no la necesita.
Construya el sistema como siempre: entre a la jaula
en /mnt/gentoo y siga las instrucciones de instalación de
Gentoo.
Agregue cualquier paquete adicional que desee. Siéntase en la libertad
de nombrar su sistema virtual Gentoo, si lo desea. En
/etc/fstab querrá que /dev/ROOT sea
/dev/ubda, con un sistema de ficheros tipo ext2, ext3, o
reiserfs. Cambie /dev/SWAP a /dev/ubdb y
comente la línea con /dev/BOOT.
En este momento, recuerde asignarle una contraseña al usuario
root.
Listado de Código 2.3: Darle una contraseña a root |
# passwd
|
Ahora debemos hacer algunos cambios a los guiones de inicio. Elimine
consolefont y keymaps del nivel de ejecución "boot":
Listado de Código 2.4: Eliminar guiones de inicio innecesarios |
# rc-update del consolefont boot
# rc-update del keymaps boot
|
Salga de la jaula, desmonte lo montado con bind, haga un
paquete con tar de la nueva instalación Gentoo y realice una
limpieza.
Listado de Código 2.5: Finalizar la instalación |
# cd /mnt/gentoo
# tar cvjpf ~/gentoo.tbz2 *
# cd
# rm -rf /mnt/gentoo
|
Hacer el root_fs
Nuestro Gentoo virtual (jaula) tiene cerca de 300 MB de tamaño, por lo
que el root_fs necesita ser al menos de ese
tamaño. Escogeremos 0,5 GB como un tamaño razonable.
Listado de Código 2.6: Crear los ficheros UML |
# dd if=/dev/zero of=root_fs seek=500 count=1 bs=1M
# mke2fs -F root_fs
# mount -o loop root_fs /mnt/loop
# tar xvjpf gentoo.tbz2 -C /mnt/loop
# umount /mnt/loop
|
Sería bueno tener una partición de intercambio de 0,5 GB.
Listado de Código 2.7: Crear una partición de intercambio |
# dd if=/dev/zero of=swap_fs seek=500 count=1 bs=1M
# mkswap -f swap_fs
|
¡Ahora veamos si funciona!
Listado de Código 2.8: Arrancar el núcleo UML |
# linux ubd0=root_fs ubd1=swap_fs
|
User-mode Linux usa xterms para las consolas virtuales que se ejecutan
en el arranque, así que hay que asegurarse que el terminal desde el
cual se ejecuta User-Mode Linux tiene la variable de entorno $DISPLAY
correctamente configurada (junto con sus permisos adecuados de
xhost/xauth).
Con algo de suerte será capaz de ingresar a su sistema Gentoo
User-Mode Linux. La única cosa que falta para que esta versión de
Gentoo sea completamente funcional es la red desde la máquina virtual
a la máquina base.
Nota:
Si recibe errores que digan "No space left on device", tal vez
necesite aumentarle la memoria a su sistema user mode
agregando mem=xxxMB al final de la línea de comando del núcleo,
por ejemplo: linux ubd0=root_fs ubd1=swap_fs mem=128MB.
|
3.
La red
Usar una red existente
Asegúrese que el núcleo de la máquina base tiene las siguiente
opciones compiladas como módulos:
Listado de Código 3.1: Configuración del núcleo de la máquina base |
Networking -->
IP: Netfilter Configuration -->
IP tables support -->
Full NAT -->
<M> MASQUERADE target support
Network Device Support -->
<M> TUN/TAP Support
|
Ejecute los siguientes comandos en la máquina base:
Listado de Código 3.2: Configuración de la red |
# modprobe tun
# modprobe iptable_nat
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# echo 1 > /proc/sys/net/ipv4/ip_forward
|
La línea de iptables configura el enmascarado de red entre la red
privada de nuestro sistema user-mode e internet (en nuestro caso, a
través de eth0). La línea "echo" activa el encaminamiento de
paquetes IP ("packet forwarding") entre la red privada y la interfaz
de la pasarela (eth0 para nosotros).
Ahora podemos ejecutar el sistema user-mode y ver si la red funciona.
Listado de Código 3.3: Poner a funcionar UML |
# linux ubd0=root_fs ubd1=swap_fs eth0=tuntap,,,192.168.0.254
# ifconfig eth0 192.168.0.1 up
# ping -c 2 192.168.0.254
PING 192.168.0.254 (192.168.0.254): 56 octets data
64 octets from 192.168.0.254: icmp_seq=0 ttl=255 time=0.8 ms
64 octets from 192.168.0.254: icmp_seq=1 ttl=255 time=0.6 ms
--- 192.168.0.254 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.6/0.7/0.8 ms
# route add default gw 192.168.0.254
# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 40 0 0 eth0
0.0.0.0 192.168.0.254 0.0.0.0 UG 40 0 0 eth0
# scp user@192.168.0.254:/etc/resolv.conf /etc/resolv.conf
# ping -c 2 www.gentoo.org
PING www.gentoo.org (207.170.82.202): 56 octets data
64 octets from 207.170.82.202: icmp_seq=0 ttl=240 time=119.6 ms
64 octets from 207.170.82.202: icmp_seq=1 ttl=240 time=92.0 ms
--- www.gentoo.org ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 92.0/105.8/119.6 ms
|
En el sistema User-Mode Linux, le asignamos a la interfaz eth0
user-mode la dirección IP privada 192.168.0.1 y la activamos. El
sistema base tiene la dirección IP privada 192.168.0.254 y le hacemos
ping para comprobar que la red funciona. La línea de route añade una
pasarela por defecto, que es nuestro sistema base y usamos scp para
obtener un fichero /etc/resolv.conf funcional (si nos
hiciera falta) y hacemos ping a www.gentoo.org para asegurarnos que la
resolución de nombres (y en general el acceso a internet) está
funcionando desde el User-Mode Linux. ¡Ahora el sistema user-mode
puede ejecutar
emerge a voluntad!
Usar una red virtual
Antes de que se emocione, este no se refiere a una red privada
virtual. Es una red que es solo accesible por las instancias de
UML. El paquete usermode-utilities proporciona una herramienta
denominada uml_switch que define los puntos terminales del
switch. (NdT: El demonio switch, uml_switch, proporciona un mecanismo
para crear una red virtual).
Listado de Código 3.4: Activar los puntos terminales del switch UML |
$ uml_switch -unix ~/tmp/switch.sock
$ uml_switch -unix ~/tmp/switch.sock &> ~/tmp/switch.log &
|
Para iniciar las instancias de UML en el switch, ejecute el siguiente
comando. Su interfaz de red (virtual) estará conectada al
proceso uml_switch y estará usando la dirección MAC dada.
Listado de Código 3.5: Ejecutar la primera instancia de UML |
$ linux ubd0=first_rootfs ubd1=first_swapfs eth0=daemon,10:00:01:02:00:00,,~/tmp/switch.sock
|
Todavía puede conectar el sistema a la red existente, o tener un
segundo proceso adjunto tanto al virtual como al real:
Listado de Código 3.6: Ejecutar la segunda instancia de UML |
$ linux ubd0=second_rootfs ubd1=second_swapfs eth0=daemon,10:00:01:02:00:01,,~/tmp/switch.sock \
eth1=tuntap,,,192.168.1.43
|
Se puede encontrar más información acerca de los ajustes de tuntap en
la sección anterior.
4.
Comprobar el fichero .iso
Quizás la manera ideal de someter Gentoo Linux a prueba sería arrancar
el .iso con User-Mode Linux y hacer la instalación completa de Gentoo
desde el propio sistema virtual User-Mode Linux.
Arrancar la .iso, o de hecho, el initrd del .iso, es bastante
sencillo.
Listado de Código 4.1: Arrancar el ISO |
# mount -o loop /ruta/al/install-<TAB>.iso /mnt/loop
# cp /mnt/loop/isolinux/gentoo.igz .
# linux load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=22000 \
> initrd=rescue.gz root=/dev/ram0 ubd0=root_fs ubd1=swap_fs \
> ubd2=/dev/cdroms/cdrom0 eth0=tuntap,,,192.168.0.254
|
Ahora puede seguir la documentación de instalación de Gentoo al pie de
la letra, aunque también necesitará saber que el sistema de ficheros
raíz será /dev/ubd/0, la partición de intercambio será
/dev/ubd/1 y el CD-ROM será el /dev/ubd/2.
5.
Recursos
El contenido de este documento, a no ser que se especifique
expresamente, está registrado bajo los términos de la licencia
CC-BY-SA-2.5. Se aplican las
Pautas de
Utilización del logotipo y nombre de Gentoo.
|