Acceso a un sistema UNIX mediante chroot


En algunas ocasiones es necesario acceder con todos los privilegios a un sistema al que no podemos acceder directamente porque tiene algún problema en la configuración, no arranca adecuadamente, hemos olvidado la contraseña de root o alguna situación similar. Para esos casos es muy cómodo y útil utilizar un sistema auxiliar (CD-live, arranque por PXE, etc.) y acceder al otro sistema mediante chroot.

¿Qué es chroot?

En sistemas UNIX, chroot permite cambiar el directorio raíz de un proceso y todos sus hijos. En principio los programas que se ejecuten dentro de este entorno no pueden salir de él, por lo que se denomina habitualmente un entorno «enjaulado» chroot. Para que este procedimiento funcione, es necesario que el directorio destino sea el directorio raíz de un sistema con los mínimos elementos para funcionar, ya que una vez dentro de la jaula chroot no podemos utilizar ningún recurso de fuera de ella.

Utilizar chroot

Para acceder a un entorno enjaulado con chroot, en principio basta con dos simples instrucciones: montarlo y acceder a él con chroot (supongamos que tenemos un sistema diferente al que se ha arrancado en la partición 7 del disco /dev/sdb):

root@equipo:~# mount /dev/sdb7 /mnt
root@equipo:~# chroot /mnt /bin/sh
# pwd
/

La siguiente imagen representa un entorno enjaulado como el anterior, montado en el directorio /mnt:

Entorno enjaulado chroot

En algunos casos es suficiente con esto, por ejemplo si queremos modificar un fichero del sistema montado en /mnt o algo similar, sin embargo no es suficiente si necesitamos que el nuevo sistema acceda a los dispositivos del equipo, ya que no tiene acceso a ellos. Para solventar este problema, en caso de que sea necesario que el sistema acceda a los dispositivos del equipo, procederemos de otra manera, antes de ejecutar la instrucción chroot, montaremos los directorios /dev, /dev/pts, /proc y /sys del sistema operativo que se está ejecutando en el directorio /mnt:

root@equipo:~# mount /dev/sdb7 /mnt
root@equipo:~# mount --bind /dev/ /mnt/dev
root@equipo:~# mount --bind /dev/pts /mnt/dev/pts
root@equipo:~# mount --bind /proc /mnt/proc
root@equipo:~# mount --bind /sys /mnt/sys
root@equipo:~# chroot /mnt /bin/sh
#

De esta manera el entorno enjaulado verá como propios estos directorios, tal como se representa en la siguiente imagen:

Entorno enjaulado chroot con /dev

Ahora el entorno enjaulado tendrá acceso a red, podrá manejar los dispositivos del equipo, etc., por ejemplo podrá instalar su propoi gestor de arranque GRUB en el primer disco del equipo:

# grub-install /dev/sda

que utilizará el ejecutable /usr/sbin/grub-install del sistema enjaulado, pero lo aplicará sobre el disco /dev/sda del equipo al que ahora sí tiene acceso.

Hay una limitación a todo esto: El entorno enjaulado sigue utilizando el kérnel del sistema que se arrancó, por lo que funcionará mejor cuanto más similares sean los dos sistemas.

Acceso a un sistema UNIX mediante chroot

4 comentarios en “Acceso a un sistema UNIX mediante chroot

  1. Muy bueno Alberto,

    Los chroot también me han servido a mi para poder montar dentro algún servicio con una versión más reciente del que había en el sistema, porque en este ya estaba obsoleto y no arrancaba. De esa forma pude ejecutar un demonio y abrir un puerto que pudiera utilizar el sistema «anfitrión».

    Un abrazo!

    Me gusta

    1. Gracias Manu y Fede,

      Realmente chroot es de esas cosas que siempre te pueden sacar de un apuro. He escrito la entrada porque me acabo de cargar el GRUB del equipo de escritorio y he tenido que tirar de él :-) y en clase siempre se lo explico a los chavales.

      Saludos!

      Me gusta

Deja un comentario