chroot (Español)
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:
- Reinstalar el gestor de arranque.
- Reconstruir la imagen initramfs.
- Actualizar o degradar paquetes.
- Restablecer una contraseña olvidada.
- Compilar paquetes en un chroot limpio.
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
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
--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
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)
- 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
Después del chroot puede ser necesario cargar la configuración local del bash:
# source /etc/profile # source ~/.bashrc
# 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
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, 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.