Hace unas semanas, escribí un artículo sobre Cómo ejecutar múltiples sesiones X sin virtualización, que demostraba cómo se pueden ejecutar múltiples entornos de escritorio al mismo tiempo en el mismo ordenador, y cambiar entre ellos con sólo pulsar un botón. Admito que esto fue una especie de calentamiento para el verdadero espectáculo – cómo ejecutar múltiples distribuciones de Linux al mismo tiempo sin tener que lidiar con los inconvenientes del software de virtualización.

Hoy, vamos a usar chroot para tratar ciertas partes de tu sistema de archivos Linux como sistemas (casi) completamente aislados. Esto puede permitirte hacer todo tipo de cosas interesantes, como ejecutar un sistema Gentoo completo desde dentro de tu sistema Ubuntu con poca o ninguna pérdida de rendimiento.

Cómo funciona

Antes de empezar, sería una buena idea repasar exactamente lo que estamos haciendo y cómo funciona todo. Cuando arrancas tu ordenador Linux, pasas por una serie de pasos para arrancar. GRUB, su gestor de arranque, carga el kernel especificado en el archivo de configuración de GRUB, lo adjunta a su partición raíz y ejecuta los scripts de inicio almacenados allí. A partir de entonces, su sistema se ejecuta desde esa partición raíz.

Vamos a utilizar un sistema Linux anfitrión (yo lo haré desde Debian, pero los pasos deberían ser bastante idénticos independientemente de la distribución) que pasa por el proceso de arranque normal, pero luego trata una cierta porción de su sistema de archivos (como /mnt/guest) como su propia instalación aislada. Ese sistema invitado no pasará por el proceso de arranque, no cargará un kernel y no ejecutará scripts de inicio. Simplemente le dirá a su anfitrión “conéctese a este directorio como si fuera la nueva partición raíz”. El diagrama de abajo debería ayudar a demostrar lo que quiero decir.

Esto es aproximadamente como los archivos estarán dispuestos en su sistema, simplemente sentados allí como archivos normales en una partición normal, tratados igual que cualquier otro archivo hasta que usemos “chroot” para convertirlos en algo especial.

multipledistros-before-chroot

Pero una vez que usamos

chroot” (cambiar la raíz) y apuntamos a /mnt/guest (o donde sea que pongamos los archivos en el siguiente paso), ese directorio es ahora su propio sistema de archivos raíz. Se vuelve completamente ajeno al sistema anfitrión. Todos los programas y comandos ejecutados desde esa nueva raíz se ejecutan en base al software dentro de esa nueva rama.

multiplesistros-después-de-la-rota

Por ejemplo, si usted es chroot en /mnt/guest y escribe “ls”, está leyendo el comando “ls” desde dentro de ese entorno chroot, completamente ajeno al comando “ls” en el sistema anfitrión. Si escribes “firefox”, se ejecuta el Firefox desde dentro de la nueva raíz, independientemente de que tengas o no instalado Firefox en el sistema anfitrión.

Obtención y uso de la distribución huésped

Para que esto funcione, sólo necesitas el sistema de archivos base de una distro de Linux, sea cual sea. Debian tiene una gran herramienta para este propósito llamada debbootstrap

que descarga los archivos base y los coloca donde usted quiera. Para mantener las cosas interesantes, y para demostrar lo que chroot puede hacer, vamos a utilizar un sistema de archivos de Gentoo para nuestro invitado. Para mantener las cosas simples y directas, voy a incluir la descarga del tarball como uno de los pasos que haremos en la línea de comandos.

Estos pasos van a descargar todos los archivos de base para un sistema Gentoo, extraerlos en nuestro directorio de destino (voy a usar /mnt/guest pero puedes usar lo que quieras) y luego chroot en ese directorio para que sea tratado como el nuevo directorio raíz (/). Puede que necesites permisos de root (sudo) para algunos de los siguientes comandos.

mkdir/mnt/guestcd/mnt/guestwget http://distfiles.gentoo.org/releases/x86/2008.0/stages/stage3-x86-2008.0.tar.bz2tar-jxvf stage3-x86-2008.0.tar.bz2chroot/mnt/guest

Estos comandos siguen los siguientes pasos, en orden de número de línea:

  1. Crear el espacio para que viva nuestro sistema de invitados
  2. Mudarse a ese espacio
  3. Descargar los archivos del sistema Gentoo
  4. Extraerlos
  5. Tratar este nuevo espacio como el directorio raíz (/)

La siguiente captura de pantalla debería ayudar a demostrar que una vez que hemos utilizado chroot para conectar nuestro nuevo directorio como raíz, ahora está aislado de las ramas anteriores en el árbol del sistema de archivos.

multipledistros-afterchroot-pwd

Para explicar la captura de pantalla, estamos empezando en un símbolo del sistema normal en el sistema anfitrión. Estoy usando pwd para mostrar mi directorio actual, donde todos los archivos de Gentoo están sentados como simples archivos antiguos sin ningún significado especial. Luego uso chroot para tratar este directorio como la nueva raíz, y ahora puede ver visualmente que mi prompt ha cambiado porque la línea de comandos ahora está sacando toda su información (incluyendo cómo dibujar el prompt) desde el entorno raíz de Gentoo. TODOS los comandos y acciones que tomo mientras estoy chrooteado dependen de esos comandos que existen dentro de ese nuevo árbol de archivos. Cuando escribo pwd

de nuevo, ya no dice /mnt/guest, porque hasta donde sabe el shell, no existe nada más que lo que ve dentro de ese árbol.

Cosas a tener en cuenta

Como he insinuado anteriormente, esto no está 100% aislado del sistema anfitrión. El entorno chroot nunca fue “arrancado”, así que nunca cargó su propio kernel, y nunca ejecutó sus propios scripts de inicio. En nuestro ejemplo, tenemos a Gentoo corriendo en el kernel con el que arrancó el host (en mi caso Debian).

Este método no

es ciertamente un sustituto de la virtualización, y no puede hacer todo lo que el software VM puede hacer. El sistema invitado nunca “arranca” o ejecuta scripts de inicio, y es posible que su sistema operativo invitado requiera algunas características que su núcleo anfitrión no ofrece.

¿Para qué?

Las veces que he mencionado esta técnica a la gente en el pasado, a menudo me han dicho algo parecido a “Eso es genial, pero ¿para qué lo usarías?”. Personalmente he encontrado varios usos para el chroot

:
  • Probar el software en desarrollo en un entorno prístino
  • Ejecutar software destinado a otra distribución
  • Ejecutar software que requiere una versión más antigua o más nueva de su distribución actual
  • Acceder a una instalación de Linux en una partición diferente sin tener que reiniciar
  • Arrancar un Live CD y utilizar chroot para reparar su instalación o GRUB
  • Acceder a una unidad en la que ha olvidado el usuario/contraseña
  • Ejecutar una aplicación de 32 bits en un entorno de 64 bits

Y seguro que hay muchos más que no se me han ocurrido. ¿Has utilizado alguna vez chroot para ejecutar varias distros? ¿Y para reparar un sistema Linux desde un Live CD?