SubscribeXMLTagsEditHistoryDiscussion

  1. Instalando Debian en User Mode Linux
  2. UML en debian etch para facilistas
    1. Introducción
    2. ¿Por qué usar User Mode Linux?
    3. ¿Por qué usar Debian?
    4. Requisitos del Huésped
    5. Convenciones:
    6. Compilar el kernel del huésped.
    7. Compilando el kernel UML
      1. Usando ccache
      2. Notas sobre la compilación del kernel del AMD64
    8. Obteniendo el sistema base de Debian
      1. Notas sobre el sistema base en el AMD64
    9. Creando el sistema de archivos
      1. Creando el archivo
      2. creando el sistema de archivos
      3. Copiando el sistema base en el sistema de archivos recién creado
      4. Editando archivos en el sistema base
      5. Instalando los módulos
    10. Iniciando una sesión en UML
    11. Accediendo a Internet
      1. Notas sobre la red en el AMD64
    12. Configurando el sistema base
    13. Jugando con UML
      1. Poniendo IPv6
    14. Solución de problemas
      1. Kernel panic con cannot set up LDT for thread-local storage
      2. xterm_open: $DISPLAY not set.
      3. No me puedo conectar por ssh, la conexión se muere
      4. UML no corre en Linux 2.6.16
      5. Los procesos dentro de UML se quedan sin memoria
    15. Referencias

Instalando Debian en User Mode Linux

Este documento fue inicialmente escrito para las personas que desean probar User Mode Linux para probar nuevos desarrollos, tanto a nivel de Kernel como en el espacio del usuario. El documento ya es útil, y con su ayuda puede ser mejor.

El documento programando para el kernel linux es un complemento de este documento, también lo es el documento linux drivers, que tiene ejemplos de como programar un driver.

Este documento es mantenido por Nelson Castillo.

UML para facilistas escrito por digitalfredy.

UML en debian etch para facilistas

NOTA: el paquete user-mode-linux en debian etch solo está para i386, a fecha 13 de Sept de 2007 en lenny y en sid está también para amd64

# apt-get install user-mode-linux debootstrap
# debootstrap etch chroot-etch
$ dd if=/dev/zero of=root_fs bs=1M count=1 seek=2000
# mkfs.reiserfs -f root_fs
# mount -o loop root_fs /mnt/
# cp -a chroot-etch/* /mnt/
# sed -i 's/^\([23456]:23:\)/#\1/' /mnt/etc/inittab
# sed -i  's/^tty1$/tty0\ntty1/' /mnt/etc/securetty
# echo uml > /mnt/etc/hostname
# Este es el archivo fstab del uml (/mnt/etc/fstab)
# file system    mount point   type     options                  dump pass
/dev/ubda        /             reiserfs defaults                 0    1
proc             /proc         proc     defaults                 0    0
devpts           /dev/pts      devpts   defaults,rw,mode=0620    0    0
sysfs            /sysfs        sysfs    defaults                 0    0
# umount /mnt
# linux.uml

Introducción

¡User-Mode Linux permite correr Linux dentro de Linux!

User Mode Linux es el Kernel de Linux portado a su propia interfaz de llamadas al sistema. Provee una especie de máquina virtual, que corre Linux como un proceso dentro de otra kernel de Linux.

Es una forma segura de correr versiones de Linux y programas. Se pueden correr programas experimentales, probar nuevas kernels o distribuciones y estudiar el interior del kernel, sin arriesgar la instalación principal.

Linux en modo de usuario provee una máquina virtual que puede tener más recursos virtuales de hardware y software que el computador en el que corre. El almacenamiento en disco de la máquina virtual se aloja en un archivo en la máquina huésped. Se puede configurar la máquina virtual sólo con el hardware que usted desee. Si se configura correctamente el acceso limitado de la máquina virtual, nada que haga en ella puede cambiar su computador real ni su software.

Es importante aclarar que los procesos dentro de UML corren nativamente, en el procesador de la máquina huésped, y no en un procesador emulado como en Bochs.

En este documento se describen los pasos para instalar la distribución Debian dentro de una máquina virtual con UML. La máquina huésped no necesariamente tiene que tener la distribución Debian.

Se describe la instalación de Debian sarge en dos distribuciones y en dos arquitecturas.

La última versión de este documento estará en esta dirección.

Este documento está siendo escrito por Nelson Castillo <arhuaco@freaks-unidos.net>. Algunos parrafos de la introducción son traducciones adaptadas de las referencias que están al final de la página.

Si tiene una contribución puede editar este documento directamente o hacer comentarios en la página de discusión de este artículo.

¿Por qué usar User Mode Linux?

  1. Si UML se bloquea, el kernel del huésped seguirá sin problemas.
  2. Se puede correr una kernel de Linux sin ser usar privilegios de root.
  3. Se puede depurar el UML como cualquier proceso normal.
  4. Se puede jugar con el Kernel sin dañar cosas.
  5. Se puede usar UML para proveer hosting virtual.
  6. Se puede usar como un sandbox para probar aplicaciones nuevas.
  7. Se puede usar para probar kernels en desarrollo de manera segura.
  8. Se pueden correr diferentes distribuciones al tiempo.
  9. Es muy divertido.

¿Por qué usar Debian?

En este documento, encontrará algunas razones para usar Debian. Si no son suficientes, conviene agregar que es divertido.

Recuerde que el huésped no tiene que tener Debian instalado. De igual forma, parte de este documento puede ser usado para instalar otra distribución dentro de UML.

Apenas consiga el hosting para ello, subiré a Internet el sistema base de Debian, que permitirá usar Debian dentro de cualquier otra distribución sin que usted tenga que crear el sistema base. El paquete que permite crear el sistema base de Debian se llama debootstrap, y puede ser instalado en diversas distribuciones. En Gentoo, por ejemplo, se instala con el comando emerge -u debootstrap.

Requisitos del Huésped

El parche del modo SKAS aumenta la eficiencia de la máquina UML. Además, los procesos que corren dentro del UML no serán visibles en el huésped.

Las utilidades de UML (UML utilities) son algunos programas que corren en el espacio del usuario que se necesitan para ejecutar la máquina UML. En Debian se instalan con apt-get install uml-utilities. En Gentoo con emerge -u emerge sys-apps/usermode-utilities. Es probable que existan paquetes para otras distribuciones. En todo caso, las utilidades se pueden instalar usando las fuentes.

El programa debootstrap se necesita para crear el sistema base de Debian. No es es necesario instalarlo si usted puede descargar el sistema base de Debian o si lo crea en otra máquina y lo transfiere por red.

Lo bueno de usar un sistema base ya creado, es que no es necesario tener permisos de root en el huésped para probar UML. Por otro lado, existen muchas razones para que usted prefiera crear su propio sistema base, siendo la seguridad una de ellas.

Convenciones:

Cuando un comando requiere privilegios de root, este iniciará con el símbolo #, cuando no, con $. Ejemplos:

 # mkfs
 $ ls

Compilar el kernel del huésped.

El huésped es la máquina dentro de la que va a ejecutar UML. No es necesario hacerlo para probar User Mode Linux.

Si nunca ha compilado un kernel para su estación de trabajo, tal vez no sea el mejor momento para hacerlo y puede continuar con el paso siguiente, en donde puede practicar la compilación de un kernel para su máquina virtual.

Este paso sólo es necesario si se quiere dar soporte al modo SKAS. Este parche está disponible en Debian, y puede ser instalado con apt-get install kernel-patch-skas.

Las instrucciones de esta sección no están completas ya que compilar un kernel para el huésped se encuentra fuera del alcance de este documento.

 $ wget http://www.user-mode-linux.org/~blaisorblade/patches/skas3-2.6/skas-2.6.13-rc7-v8.2/skas-2.6.13-rc7-v8.2.patch.bz2
 $ wget  http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.13.tar.bz2
 $ tar xjf linux-2.6.13.tar.bz2 ; cd linux-2.6.13
 $  cat ../skas-2.6.13-rc7-v8.2.patch | patch -p1
 $ make menuconfig

Esta es la forma en la que se suelen compilar kernels en Debian. Cuando la compilación termine, instale el kernel y arranque con él.

 
 $ fakeroot make-kpkg --initrd --append-to-version arhuaco kernel_image kernel_headers

Compilando el kernel UML

En Debian hay un paquete con el kernel ya compilado, como un ejecutable. Para instalarlo y ahorrarse este paso, use apt-get install user-mode-linux.

Si no desea ejecutar este paso, he subido un binario ejecutable del kernel del ejemplo que se puede bajar acá. Compilado para la arquitectura i386.

Se baja un kernel reciente de un servidor espejo de kernel.org y se descomprime. Si no está familiarizado con la compilación de kernels de Linux, tal vez quiera leer el archivo linux-2.6.13/README.

 $ tar xjf linux-2.6.13.tar.bz2
 $ cd linux-2.6.13
 $ make mrproper

En este ejemplo usaré una configuración que he probado. Tal vez quiera usar ARCH=um make menuconfig para cambiar la configuración a su gusto. En ese caso, supondré que no necesita las instrucciones. Habilité la opción "CONFIG_BLK_DEV_UBD_SYNC" que puede hacer a UML lento cuando hay entrada y salida masiva, tal vez usted desee deshabilitarla.

Puede bajar a su disco esta configuración de ejemplo para usarla como base para su .config.

 
 $ mv config-uml-2.6.13-sep9.txt .config
 $ ARCH=um make 
 $ ARCH=um make modules

Ahora se puede ejecutar el programa "./linux", y obtendremos un kernel panic debido a que no está disponible el sistema de archivos que crearemos en el siguiente paso.

Usando ccache

El programa ccache permite acelerar posteriores compilaciones del kernel.

Para habilitarlo, debe editar el Makefile de Linux. Note que se ha cambiado la línea CC = $(CROSS_COMPILE)gcc por CC = ccache $(CROSS_COMPILE)gcc.

--- Makefile.old        2006-05-22 18:50:15.000000000 -0500
+++ Makefile    2006-05-22 18:50:29.000000000 -0500
@@ -306,7 +306,7 @@
 AS             = $(CROSS_COMPILE)as
 LD             = $(CROSS_COMPILE)ld
-CC             = $(CROSS_COMPILE)gcc
+CC             = ccache $(CROSS_COMPILE)gcc
 CPP            = $(CC) -E
 AR             = $(CROSS_COMPILE)ar
 NM             = $(CROSS_COMPILE)nm

Ejemplo de uso de ccache con dos procesadores. Esta es la compilación inicial.

$ time nice make -j2 ARCH=um
real    3m49.397s
user    5m57.136s
sys     0m32.548s

Las estadísticas de ccache.

$ ccache -s
cache directory                     /home/n/.ccache
cache hit                              0
cache miss                           801
called for link                        6
not a C/C++ file                       7
no input file                         56
files in cache                      1602
cache size                           8.4 Mbytes
max cache size                     976.6 Mbytes

Ahora vemos la segunda compilación:

$ time nice make -j2 ARCH=um
real    0m52.167s
user    1m2.517s
sys     0m18.769s

El ahorro de tiempo es importante. De 3.81 minutos a 0.87 minutos.

Las estadísticas de ccache:

$ ccache -s
cache directory                     /home/n/.ccache
cache hit                            797
cache miss                           805
called for link                       11
not a C/C++ file                      14
no input file                         90
files in cache                      1610
cache size                           8.4 Mbytes
max cache size                     976.6 Mbytes

Note que 797 archivos se encontraron en el caché, y no tuvieron que compilarse.

Notas sobre la compilación del kernel del AMD64

Obteniendo el sistema base de Debian

debootstrap se usa para crear un sistema base de Debian desde ceros, sin necesidad de dpkg o apt. El programa descarga los paquetes en formato .deb de un servidor espejo de Debian, y los desempaqueta en un directorio en el que se puede hacer chroot luego. En nuestro caso, es útil para crear un sistema base de Debian que luego usaremos con el proceso UML. En Debian se instala con apt-get install debootstrap. Note que corremos el programa con el usuario root.

 # debootstrap sarge root-filesystem

Averiguamos el espacio en disco ocupado por el sistema base (puede variar).

 # du -sh root-filesystem/
   144M    root-filesystem/

Tal vez quiera hacer una copia de respaldo del sistema base, ya sea para usarlo en otra máquina o para repetir el proceso si algo sale mal.

 # tar cvf root-filesystem.tar root-filesystem
 # bzip2 -9 root-filesystem.tar

Notas sobre el sistema base en el AMD64

 # debootstrap sarge root-filesystem http://debian-amd64.alioth.debian.org/debian/

Creando el sistema de archivos

Usualmente se crean sistemas de archivos sobre particiones, pero también se puede crear un sistema de archivos (ext2, ext3, reiserfs, xfs, etc) sobre un archivo. El primer paso es crear un archivo que contendrá el sistema de archivos.

Creando el archivo

Creamos un archivo disperso de 2G. El tamaño de este archivo depende de sus necesidades. En todo caso, es fácil crear otro sistema de archivos más grande y hacer una copia si esto llega a ser necesario. Note que no hay que ser root.

 $ dd if=/dev/zero of=root_fs bs=1M count=1 seek=2000
  1+0 records in
  1+0 records out
  1048576 bytes transferred in 0.008551 seconds (122625940 bytes/sec)

Note que se puede crear el archivo escribiendo 0 bytes. Lo importante es que se haga la llamada del sistema fseek(3) con el valor apropiado, que es 2097152000 en este caso.

 $ dd if=/dev/zero of=root_fs bs=1 count=0 seek=2097152000
  0+0 records in
  0+0 records out
  0 bytes transferred in 0.000279 seconds (0 bytes/sec)

Verificamos el tamaño del archivo (que todavía no se está ocupando en el disco):

 
 $ ls -lha root_fs
  -rw-r--r--  1 n users 2.0G 2005-09-10 21:36 root_fs

creando el sistema de archivos

Luego creamos el sistema de archivos. Usaré reiserfs. Si no existe /sbin/mkfs.reiserfs, ejecute # apt-get install progsreiserfs, o use un sistema de archivos diferente, como ext3.

 
 $ /sbin/mkfs.reiserfs --format=3.6 root_fs
   Warning: Device root_fs isn't a block device.
   All data on root_fs will be lost. Do you really want to create reiser filesystem (v3.6) (y/n) y
   Creating reiser filesystem (v3.6) with standard journal on root_fs
   initializing skiped area: done
   initializing journal: done

Nota: En el gentoo(amd64) usé /sbin/mkfs.reiserfs -f --format=3.6 root_fs.

Copiando el sistema base en el sistema de archivos recién creado

Ahora copiamos el sistema base de Debian en el recién creado sistema de archivos.

 $ su
 # mkdir mnt-uml && mount root_fs mnt-uml/ -o loop
 # cp -a root-filesystem/* mnt-uml/

Editando archivos en el sistema base

Se debe editar el inittab del UML para dejar una sola consola. Si esto no se hace y se usan xterms, se instanciarán 6 de ellas.

# vim mnt-uml/etc/inittab
1:2345:respawn:/sbin/getty 38400 tty0
#2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6

Se deben adicionar las siguientes entradas al archivo fstab del UML. Cambie reiserfs por el sistema de archivos que usted haya usado.

# vim /mnt-uml/etc/fstab
# file system    mount point   type     options                  dump pass
/dev/ubda        /             reiserfs defaults                 0    1
proc             /proc         proc     defaults                 0    0
devpts           /dev/pts      devpts   defaults,rw,mode=0620    0    0
sysfs            /sysfs        sysfs    defaults                 0    0

También editamos el archivo securetty para habilitar permitir que el usuario root pueda ingresar en tty0.

# vim mnt-uml/etc/securetty
# Standard consoles
tty0
tty1
tty2

Es apropiado poner un nombre diferente al del host en el archivo /etc/hostname. uml parece un nombre apropiado para el host.

Instalando los módulos

En la configuración de ejemplo hay módulos. Procedemos a instalarlos. Asigne el valor apropiado a INSTALL_MOD_PATH, de acuerdo a su instalación.

 # cd linux-2.6.13/ 
 # ARCH=um make modules_install INSTALL_MOD_PATH=/home/n/uml/mnt-uml/
 # cd ..

Ya podemos desmontar el sistema de archivos.

 
 # umount mnt-uml/

Y ya no necesitamos ser el usuario root.

 
 # exit

Iniciando una sesión en UML

Nota: se recomienda tener el parche SKAS en el kernel. No me funcionó sin el parche.

Podemos arrancar por primera vez con el nuevo kernel. La consola debe abrirse en un xterm. Si desea que se abra en stdin/stdout, adicione "con=fd:0,fd:1" a la invocación del binario linux. Si no va a depurar el kernel, puede reducir el tamaño del mismo con strip linux.

 $ cp linux-2.6.13/linux .
 $ strip linux
 $ ./linux 

Si el siguiente paso no funciona, por favor mire si hay una solución documentada en la sección de solución de problemas al final de este documento.

Si todo funciona bien, debe aparecer una xterm como la siguiente:

Arrancando por primera vez

Arrancando por primera vez

Ingrese como root y ejecute un halt para detener la máquina UML.

Accediendo a Internet

Existen varios métodos para acceder a la red desde UML y están documentadas en esta página

Por el momento documentaremos un método fácil que nos permitirá acceder a Internet y descargar paquetes de un servidor espejo de Debian. Usando otros métodos es posible acceder a UML desde el huésped o desde otras máquinas en una LAN o en Internet.

El programa slirp permite a la máquina UML acceder a la red local con conectividad IP. Es como hacer masquerading pero en el espacio del usuario. Sólo funcionará el protocolo IP, no los demás. Para nuestros propósitos es suficiente, ya que nos permite acceder a los mirrors de Debian para instalar paquetes.

Debe instalar el binario con apt-get install slirp en la máquina host, si es Debian, ó emerge -u net-dialup/slirp si es Gentoo.

 ./linux eth0=slirp,,/usr/bin/slirp

Ingrese como root, no requiere password.

 # ifconfig eth0 10.2.0.15 up
 # route add default dev eth0

auto lo iface lo inet loopback

Con este método, el archivo /etc/network/interfaces del UML debería quedar como el que se muestra a continuación para configurar la red automáticamente al arrancar.

 auto lo
 iface lo inet loopback
 auto eth0
 iface eth0 inet static
 address 10.0.2.15
 netmask 255.0.0.0
 up    route add default dev eth0
 down  route del default dev eth0

Slirp utiliza algunas direcciones especiales que facilitan la configuración y el uso de la red dentro de UML. La IP 10.0.2.3 es un alias de el DNS del huésped. Todos los paquetes enviados a esa dirección serán dirigidos al DNS del huesped. Puede añadir la siguiente entrada al /etc/resolv.conf del UML.

 nameserver 10.0.2.3

La IP 10.0.2.2 es un alias del host remoto. Cuando se conecta a esta dirección usted puede conectarse al huésped.

Ahora que UML puede acceder a la red, ya es hora de configurar el sistema base.

 

Notas sobre la red en el AMD64

En el momento, parece que el slitp que se distribuye con Gentoo no funciona bien en una máquina de 64 bits. Está "enmascarado" y no se puede instalar.

# emerge -u =net-dialup/slirp
Calculating dependencies
!!! All ebuilds that could satisfy "=net-dialup/slirp" have been masked.
!!! One of the following masked packages is required to complete your request:
- net-dialup/slirp-1.0.16 (masked by: -amd64 keyword)
- net-dialup/slirp-1.0.13 (masked by: missing keyword)

Es probable que este paquete no funcione bien en amd64. Debe usar otro método documentado para acceder a la red en este host, o arreglar el problema :)

Configurando el sistema base

Ingresamos como root al UML y comenzamos la configuración del sistema base.

 # base-config

El resto de la configuración es muy similar a una instalación normal de Debian, por lo que puede usar como guía la sección del manual Arrancando su nuevo sistema Debian.

center|Configurando el sistema base

También puede hacer la configuración del sistema base usando chroot.

Al terminar la configuración del sistema base se descargan algunos paquetes necesarios por red y al final usted podrá iniciar una sesión en su Debian configurado para correr dentro de UML. No olvide que siempre puede detener UML y hacer una copia de respaldo del sistema de archivos root_fs para experimentar.

En debian se insalan paquetes con apt-get install nombre_paquete, se buscan paquetes disponibles con apt-cache search palabra... y se borran paquetes con apt-get remove [--purge] paquete.... La opción --purge del último comando hace que se borren los archivos de configuración del paquete.

Jugando con UML

Poniendo IPv6

¡Lo más interesante de poner IPv6 en UML es que con la dirección que se obtiene ya podremos accederla desde cualquier lugar!

Para tener IPv6 dentro de UML no hay que hacer mucho. freenet6.net provee un tunel que permite tener una IP dinámica. Si crea una cuenta en el sitio, puede tener una IPv6 estática.

Prerequisitos:

Estar conectado a Internet
La conexión con slirp es suficiente, así que no hay que ser root en el husped.
Que el kernel de UML soporte IPv6
Acá tengo un .config para el kernel 2.6.13.1 sin módulos habilitado para IPv6.
 # apt-get install udev
 # apt-get install tspc

Si el servicio tscp inicia el tunel correctamente, ya será posible hacer pings al exterior.

eth0     Link encap:Serial Line IP  
         inet addr:10.0.2.15  Mask:255.0.0.0
         UP RUNNING NOARP  MTU:1500  Metric:1
         RX packets:920 errors:0 dropped:0 overruns:0 frame:0
         TX packets:596 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:256 
         RX bytes:425493 (415.5 KiB)  TX bytes:33686 (32.8 KiB)
         Interrupt:5 
tun      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
         inet6 addr: 2001:5c0:8fff:ffff::11/128 Scope:Global
         UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1280  Metric:1
         RX packets:104 errors:0 dropped:0 overruns:0 frame:0
         TX packets:101 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:500 
         RX bytes:8488 (8.2 KiB)  TX bytes:8272 (8.0 KiB)
$ ping6 -c 5 www.kame.net
PING www.kame.net(orange.kame.net) 56 data bytes
64 bytes from orange.kame.net: icmp_seq=1 ttl=54 time=405 ms
64 bytes from orange.kame.net: icmp_seq=2 ttl=54 time=620 ms
64 bytes from orange.kame.net: icmp_seq=3 ttl=54 time=648 ms
64 bytes from orange.kame.net: icmp_seq=4 ttl=54 time=640 ms
64 bytes from orange.kame.net: icmp_seq=5 ttl=54 time=559 ms
--- www.kame.net ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4304ms
rtt min/avg/max/mdev = 405.818/575.041/648.457/90.140 ms
$ ping6 -c 5 -n www.kame.net
PING www.kame.net(2001:200:0:8002:203:47ff:fea5:3085) 56 data bytes
64 bytes from 2001:200:0:8002:203:47ff:fea5:3085: icmp_seq=1 ttl=54 time=793 ms
64 bytes from 2001:200:0:8002:203:47ff:fea5:3085: icmp_seq=2 ttl=54 time=742 ms
64 bytes from 2001:200:0:8002:203:47ff:fea5:3085: icmp_seq=3 ttl=54 time=853 ms
64 bytes from 2001:200:0:8002:203:47ff:fea5:3085: icmp_seq=4 ttl=54 time=879 ms
64 bytes from 2001:200:0:8002:203:47ff:fea5:3085: icmp_seq=5 ttl=54 time=768 ms
--- www.kame.net ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4086ms
rtt min/avg/max/mdev = 742.420/807.393/879.633/51.532 ms

Así que ya tenemos una IPv6 que puede ser alcanzable desde cualquier lugar. Note que esta IP es dinámica. Si quiere una estática, debe crear una cuenta en el broker.

maquina-remota:~# ping6 -c 2  2001:5c0:8fff:ffff::11
PING 2001:5c0:8fff:ffff::11(2001:5c0:8fff:ffff::11) 56 data bytes
64 bytes from 2001:5c0:8fff:ffff::11: icmp_seq=1 ttl=63 time=774 ms
64 bytes from 2001:5c0:8fff:ffff::11: icmp_seq=2 ttl=63 time=703 ms
--- 2001:5c0:8fff:ffff::11 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 703.344/739.089/774.834/35.745 ms

Solución de problemas

Lo primero es revisar la FAQ de UML. Cuando solucione el problema, puede añadir la solución en esta sección.

Kernel panic con cannot set up LDT for thread-local storage

cannot set up thread-local storage: cannot set up LDT for thread-local storage
Kernel panic - not syncing: Attempted to kill init!

El kernel de UML no soporta la Native Posix Thread Library (NPTL) y los binarios que está corriendo están siendo enlazados dinamicamente con ella. Trate de correr UML usando el parche SKAS en el huésped, esta es la mejor solución.

Tal vez pueda evitar el panic asignando la variable del entorno LD_ASSUME_KERNEL en la línea de comandos.

 ./linux init=/bin/sh LD_ASSUME_KERNEL=2.4.1

Muchos comandos son muy estrictos acerca de lo que se preserva en el entorno cuando crean procesos hijos, así que garantizar que la variable LD_ASSUME_KERNEL va a estar presente en todos los procesos del sistema no es posible. Es mejor quitar la NTPL del sistema de archivos de UML.

 # mount root_fs mnt-uml/ -o loop
 # mv mnt-uml/lib/tls mnt-uml/lib/tls.away
 # umount mnt-uml

Ejecute de nuevo la máquina UML y confirme que funcione. Como estamos usando Debian, esta solución puede generar problemas al hacer apt-get upgrade y tal vez en otras circunstacias, por lo que una

mejor solución es usar dpkg-divert.
 # export LD_ASSUME_KERNEL=2.4.1
 # mount root_fs mnt-uml/ -o loop
 # chroot mnt-uml
 # mkdir /lib/tls.off
 # cd /lib/tls
 # pwd
 #  for f in *;
    do
      dpkg-divert --divert --local --rename --divert /lib/tls.off/$f --add /lib/tls/$f;
    done
 # exit
 # umount mnt-uml
 # unset LD_ASSUME_KERNEL

xterm_open: $DISPLAY not set.

Starting printer spooler: lpd .
Starting NFS common utilities: statd.
Starting deferred execution scheduler: atd.
Starting periodic command scheduler: cron.
xterm_open: $DISPLAY not set.

UML no pudo abrir una Consola Virtual. Este error lo imprime el driver de xterm, en arch/um/drivers/xterm.c:

  /* Check that DISPLAY is set, this doesn't guarantee the xterm
   * will work but w/o it we can be pretty sure it won't. */
  if (!getenv("DISPLAY")) {
    printk("xterm_open: $DISPLAY not set.\n");
    return -ENODEV;
  }

Yo obtuve este error cuando estaba ejecutando UML desde GNU Screen. Soluciones:

  1. Ejecutar UML fuera de GNU screen.
  2. Ejecutar "xhost + 127.0.0.1" antes de correr UML. Así me funcionó en GNU Screen. Si está corriendo UML en una máquina remota, debe hacer forwarding de X11.
  3. Usar otro método para acceder a una consola de UML.

No me puedo conectar por ssh, la conexión se muere

Puede ser este error, que es un problema con el TLS y el PAM.

El workaround es hacer:

touch /etc/ld.so.nohwcap

También sirve quitar /lib/tls. Un problema común con UML.

UML no corre en Linux 2.6.16

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=366915

Para poder correr UMl con Linux 2.6.16 SKAS en el kernel de host. En general, es buena idea usar este parche.

Los procesos dentro de UML se quedan sin memoria

Y esto pasa, incluso cuando se asigna suficiente memoria a la máquina virtual. Para resolver este prublema, usé la siguiente línea.

echo 262144 > /proc/sys/vm/max_map_count

TODO: sacar el tiempo para explicar esto. Por el momento, toca usar google :)

Referencias

The User-mode Linux Kernel Home Page :

Gentoo Linux Developer's guide to system testing with User-Mode Linux:

Last update: 2007-09-13 (Rev 12938)

svnwiki $Rev: 14721 $