Gentoo Logo

Guía del desarrollador de Gentoo Linux para hacer pruebas con "User-Mode Linux"

Contenido:

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 ARCH=um
# make linux ARCH=um
# 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
(Si recibe un error FATAL aquí, intente borrar /dev/net/tun
y pruebe de nuevo)
# 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
(Ingrese en el sistema user-mode)
# 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 (si hiciera falta)
# 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 sólo asequible 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

(Si la información del switch debiera permanecer en primer plano:)
$ uml_switch -unix ~/tmp/switch.sock

(Si esta debiera estar en segundo plano:)
$ 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



Imprimir

Actualizado 1 de marzo, 2008

Sumario: Esta guía enseña a los desarrolladores de Gentoo Linux cómo configurar y utilizar User-Mode Linux para probar cambios que tengan el potencial de romper el sistema.

Grant Goodyear
Editor

John Davis
Editor

Sven Vermeulen
Editor

Benny Chuang
Editor

John Christian Stoddart
Traductor

José Luis Rivero
Traductor

Fernando J. Pereda Garcimartín
Traductor

Donate to support our development efforts.

Support OSL
Gentoo Centric Hosting: vr.org
Tek Alchemy
SevenL.net
Global Netoptex Inc.
Bytemark
Online Kredit Index
Copyright 2001-2009 Gentoo Foundation, Inc. Questions, Comments? Contact us.