Hace unas semanas, escribí un artículo sobre Cómo ejecutar varias sesiones X sin virtualización, que demostraba cómo puede ejecutar varios entornos de escritorio al mismo tiempo en la misma computadora y cambiar entre ellos con solo presionar un botón. Lo admito, esto fue algo así como un calentamiento para el espectáculo real: cómo ejecutar múltiples distribuciones de Linux al mismo tiempo sin tener que lidiar con los inconvenientes del software de virtualización.
Hoy, usaremos chroot para tratar ciertas partes de su sistema de archivos Linux como sistemas (casi) completamente aislados. Esto puede permitirle hacer todo tipo de cosas interesantes, como ejecutar un sistema Gentoo completo desde el interior de su sistema Ubuntu con poca o ninguna pérdida de rendimiento.
Cómo funciona
Antes de comenzar, sería una buena idea repasar exactamente lo que estamos haciendo y cómo funciona todo. Cuando inicia su computadora Linux, sigue una serie de pasos para iniciar. GRUB, su cargador de arranque, carga el kernel que se especifica 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 ese momento, su sistema se ejecuta desde dentro de esa partición raíz.
Vamos a usar un sistema host Linux (lo haré desde Debian, pero los pasos deberían ser prácticamente idénticos independientemente de la distribución) que pasa por ese proceso de arranque normal, pero luego trata una cierta parte 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 host «conéctese a este directorio como si fuera la nueva partición raíz». El siguiente diagrama debería ayudar a demostrar lo que quiero decir.
Así es aproximadamente como se distribuirán los archivos en su sistema, sentados allí como archivos normales en una partición normal, tratados de la misma manera que cualquier otro archivo hasta que usemos «chroot» para convertirlos en algo especial.
Pero una vez que usamos chroot (CAMBIAR ROOT) y apuntamos a /mnt/guest (o donde sea que coloquemos los archivos en el siguiente paso), ese directorio ahora es su propio sistema de archivos raíz. Se vuelve completamente ajeno al sistema host. Todos los programas y comandos que se ejecutan desde dentro de esa nueva raíz se ejecutan en función del software dentro de esa nueva rama.
Por ejemplo, si está chrooteado en /mnt/guest y escribe «ls», está leyendo el comando «ls» desde dentro de ese entorno chroot, sin darse cuenta del comando «ls» en el sistema host. Si escribe «firefox», ejecuta Firefox desde dentro de la nueva raíz, tenga o no Firefox instalado en el host.
Obtener y usar la distribución de invitados
Para que esto funcione, solo necesita el sistema de archivos base de una distribución de Linux, sea cual sea la distribución. Debian tiene una gran herramienta para este propósito llamada debbootstrap que descarga los archivos base y los coloca donde desee. Para mantener las cosas interesantes y demostrar lo que puede hacer chroot, vamos a usar un Gentoo sistema de archivos 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 base para un sistema Gentoo, extraerlos en nuestro directorio de destino (usaré /mnt/guest pero puede usar lo que quiera) y luego haga chroot en ese directorio para que sea tratado como el nuevo directorio raíz (/). Es posible que necesite permisos de root (sudo) para algunos de los siguientes comandos.
mkdir /mnt/guest cd /mnt/guest wget https://distfiles.gentoo.org/releases/x86/2008.0/stages/stage3-x86-2008.0.tar.bz2 tar -jxvf stage3-x86-2008.0.tar.bz2 chroot /mnt/guest
Esos comandos toman los siguientes pasos, en orden de número de línea:
- Cree el espacio para que viva nuestro sistema de invitados
- Muévete a ese espacio
- Descargar los archivos del sistema Gentoo
- extraerlos
- Trate este nuevo espacio como el directorio raíz (/)
La siguiente captura de pantalla debería ayudar a demostrar que una vez que usamos chroot para conectar nuestro nuevo directorio como raíz, ahora está aislado de las ramas anteriores en el árbol del sistema de archivos.
Para explicar la captura de pantalla, comenzamos con un símbolo del sistema normal en el sistema host. Estoy usando pwd para mostrar mi directorio actual, donde todos los archivos de Gentoo se encuentran como 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 indicador ha cambiado porque la línea de comando ahora está extrayendo toda su información (incluyendo cómo dibujar el indicador) desde el entorno raíz de Gentoo. TODOS los comandos y las acciones que tomo mientras estoy en chroot dependen de esos comandos existentes dentro de ese nuevo árbol de archivos. Cuando vuelvo a escribir pwd, 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 insinué anteriormente, esto no está 100% aislado del sistema host. El entorno chroot nunca se «arrancó», por lo que nunca cargó su propio kernel y nunca ejecutó sus propios scripts de inicio. En nuestro ejemplo, tenemos Gentoo ejecutándose en el núcleo con el que arrancó el host (en mi caso, Debian).
Este método es ciertamente no un reemplazo para la virtualización, y no puede hacer todo lo que puede hacer el software VM. El sistema huésped en realidad nunca «arranca» ni ejecuta scripts de inicio, y es posible que su sistema operativo huésped requiera algunas funciones que su kernel host no ofrece.
¿Para qué?
En las ocasiones en que mencioné esta técnica a personas en el pasado, a menudo dijeron algo como «Es genial, pero ¿para qué la usarías?». Personalmente, he encontrado varios usos para chroot:
- Pruebe el desarrollo de software en un entorno prístino
- Ejecutar software destinado a otra distribución
- Ejecute software que requiera una versión más antigua o más nueva de su distribución actual
- Acceda a una instalación de Linux en una partición diferente sin tener que reiniciar
- Inicie un Live CD y use chroot para reparar su instalación o GRUB
- Acceda a una unidad en la que ha olvidado el usuario/pase
- Ejecute una aplicación de 32 bits en un entorno de 64 bits
Y estoy seguro de que hay muchos más en los que nunca había pensado. ¿Alguna vez has usado chroot para ejecutar varias distribuciones? ¿Qué tal reparar un sistema Linux desde un Live CD? Háganos saber en los comentarios.