chroot (Español)

From ArchWiki

Esta traducción de chroot fue revisada el 2022-09-27. Si existen cambios puede actualizarla o avisar al equipo de traducción.

Un chroot es una operación que cambia el directorio raíz aparente para el proceso en ejecución actual y sus subsidiarios. Un programa que se ejecuta en este entorno modificado no puede acceder a los archivos y comandos fuera de ese árbol de directorios del entorno. Este entorno modificado se denomina jaula chroot.

Razonamiento

El cambio de root se realiza comúnmente para realizar el mantenimiento del sistema en sistemas en los que ya no es posible arrancar y/o iniciar sesión. Unos ejemplos típicos son:

Véase también Wikipedia:Chroot#Limitations.

Requisitos

  • Privilegios de root.
  • Otro entorno Linux, por ejemplo, un LiveCD o un USB, o de otra distribución Linux existente.
  • Mismos entornos de arquitectura; es decir, el chroot desde y el chroot hasta. La arquitectura del entorno actual puede descubrirse con: uname -m (por ejemplo, i686 o x86_64).
  • Módulos del kernel necesarios cargados en el entorno chroot.
  • Swap activado en caso de ser necesario:
    # swapon /dev/sdxY
  • Conexión a internet en caso de ser necesario.

Utilización

Nota:
  • Algunas herramientas systemd como hostnamectl, localectl y timedatectl no pueden ser utilizadas dentro de un chroot, ya que requieren una conexión dbus activa. [1]
  • El sistema de archivos que servirá como la nueva raíz (/) de su chroot debe ser accesible (es decir, descifrado y montado).

Hay dos formas principales de usar chroot, las cuales se describen a continuación.

Usar arch-chroot

El script bash arch-chroot es parte del paquete arch-install-scripts. Antes de ejecutar /usr/bin/chroot, el script monta sistemas de archivos API como /proc y hace que /etc/resolv.conf esté disponible desde el chroot.

Introducir un chroot

Ejecute arch-chroot con el nuevo directorio raíz como primer argumento:

# arch-chroot ubicación/del/nuevo/root

Por ejemplo, en la guía de instalación este directorio sería /mnt:

# arch-chroot /mnt

Para salir del chroot simplemente use

# exit

Hacer chroot en una instalación existente

Ejecute lsblk y observe el diseño de partición de su instalación. Por lo general será algo como /dev/sdXY o si tiene una unidad NVMe /dev/nvme0nXpY.

Monte el sistema de archivos:

# mount /dev/sdXY /mnt

Además, si tiene una partición de sistema EFI y necesita hacer cambios en ella (por ejemplo, actualizar las imágenes vmlinuz o initramfs):

# mount /dev/sdXZ /mnt/esp

Finalmente, ingrese en el chroot:

# arch-chroot /mnt

Para salir del chroot utilice:

# exit

Ahora puede realizar la mayoría de las operaciones disponibles desde su instalación existente. Algunas tareas que necesitan D-Bus no funcionarán como se indica en #Utilización.

Ejecutar una sola orden y salir

Para ejecutar una orden desde el chroot y salir de nuevo, anexe la siguiente orden al final de la línea:

# arch-chroot ubicación/del/nuevo/root miorden

Por ejemplo, para ejecutar mkinitcpio -p linux para un chroot ubicado en /mnt/arch haga:

# arch-chroot /mnt/arch mkinitcpio -p linux

Usar chroot

Advertencia: Cuando se utiliza --rbind, algunos subdirectorios de dev/ y sys/ no serán desmontables. Si se intenta desmontar con umount -l en esta situación romperá su sesión, requiriendo un reinicio. Si es posible, utilice -o bind en su lugar.

En el siguiente ejemplo, la ruta /ubicación/de/nueva/raíz es el directorio donde reside la nueva raíz.

En primer lugar, monte los sistemas de archivos temporales de la API:

# cd /ubicación/del/nuevo/root
# mount -t proc /proc proc/
# mount -t sysfs /sys sys/
# mount --rbind /dev dev/

Y opcionalmente

# mount --rbind /run run/

Si está ejecutando un sistema UEFI también necesitará acceso a las variables EFI. De lo contrario, al instalar GRUB recibirá un mensaje similar a UEFI variables not supported on this machine:

# mount --rbind /sys/firmware/efi/efivars sys/firmware/efi/efivars/

A continuación, para utilizar una conexión a Internet en el entorno chroot, copie los detalles del DNS:

# cp /etc/resolv.conf etc/resolv.conf

Finalmente, para cambiar el root a /ubiación/de/nuevo/root usando el bash:

# chroot ubicación/del/nuevo/root /bin/bash
Nota: Si le sale el error:
  • chroot: no se puede ejecutar la orden '/usr/bin/bash': Exec format error, es probable que las arquitecturas del entorno del host y del entorno chroot no coincidan.
  • chroot: '/usr/bin/bash': permiso denegado, vuelva a montar con el permiso de ejecución: mount -o remount,exec /ubicación/de/nuevo/root.
    • si esto no lo arregla, entonces asegúrese de que los componentes base del nuevo entorno están intactos (si es un Arch root intente paccheck --root=/localización/del/nuevo/root --files --file-properties --md5sum glibc filesystem, con pacutils)

Después del chroot puede ser necesario cargar la configuración local del bash:

# source /etc/profile
# source ~/.bashrc
Sugerencia: Opcionalmente, cree un prompt único para poder diferenciar su entorno chroot:
# export PS1="(chroot) $PS1"

Cuando haya terminado con el chroot, puedes salir de él mediante:

# exit

A continuación, desmonte los sistemas de archivos temporales:

# cd /
# umount --recursive /ubicación/del/nuevo/root
Nota: Si hay un error que menciona algo así como umount: /ruta: el dispositivo está ocupado esto suele significar que: un programa (incluso un shell) se dejó ejecutando en el chroot o que todavía existe un sub-montaje. Salga del programa, use findmnt -R /ubicación/del/nuevo/root para encontrarlo y luego umount lo sub-monta. Puede ser complicado usar umount en algunas cosas y uno puede esperar que umount --force funcione, como último recurso use umount --lazy que simplemente las libera. En cualquier caso, para estar seguro, reboot lo antes posible si no se resuelven para evitar posibles conflictos futuros.

Ejecutar aplicaciones gráficas desde chroot

Si tiene un servidor X funcionando en su sistema, puede iniciar aplicaciones gráficas desde el entorno chroot.

Para permitir que el entorno chroot se conecte a un servidor X, abra una terminal virtual dentro del servidor X (es decir, dentro del escritorio del usuario que está conectado en ese momento), y luego ejecute la orden xhost, que da permiso a cualquiera para conectarse al servidor X del usuario (véase también Xhost):

$ xhost +local:

Luego, para dirigir las aplicaciones al servidor X desde el chroot, configure la variable de entorno DISPLAY dentro del chroot para que coincida con la variable DISPLAY del usuario propietario del servidor X. Así, por ejemplo, ejecute

$ echo $DISPLAY

como el usuario propietario del servidor X para ver el valor de DISPLAY. Si el valor es ":0" (por ejemplo), entonces en el entorno chroot ejecute:

# export DISPLAY=:0

Sin privilegios root

Chroot requiere de privilegios root, que pueden no ser deseables o posibles para el usuario en ciertas situaciones. Sin embargo, hay varias formas de simular un comportamiento similar al de chroot utilizando implementaciones alternativas.

PRoot

PRoot puede ser usado para cambiar el directorio raíz aparente y usar mount --bind sin privilegios de root. Esto es útil para confinar aplicaciones a un solo directorio o ejecutar programas construidos para una arquitectura de CPU diferente, pero tiene limitaciones debido a que todos los archivos son propiedad del usuario en el sistema anfitrión. PRoot proporciona un argumento --root-id que puede ser utilizado como una solución para algunas de estas limitaciones de una manera similar (aunque más limitada) a fakeroot.

Fakechroot

fakechroot es un shim de biblioteca que intercepta la llamada a chroot y falsea los resultados. Se puede utilizar junto con fakeroot para simular un chroot como un usuario normal.

$ fakechroot fakeroot chroot ~/mi-chroot bash

Unshare

Unshare, parte de util-linux, se puede utilizar para crear un nuevo espacio de nombres del kernel. Esto funciona con la orden chroot habitual. Por ejemplo:

$ unshare --map-root-user chroot ~/namespace /bin/sh

Solución de problemas

arch-chroot: /location/of/new/root is not a mountpoint. This may have undesirable side effects.

Al ejecutar arch-chroot /ubicación/de/la/nueva/raíz, se emite una advertencia:

==> WARNING: /ubicación/de/la/nueva/raíz is not a mountpoint. This may have undesirable side effects.

Véase arch-chroot(8) para obtener una explicación y un ejemplo del uso del montaje de enlace (bind mounting) para convertir el directorio chroot en un punto de montaje.

Véase también