chroot (Español)

Esta traducción de
chroot
fue revisada el
2022-09-27
. Si existen
cambios
puede
actualizarla
o avisar al
equipo de traducción
.
Artículos relacionados
PRoot
Linux Containers
systemd-nspawn
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/sd
xY
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/sd
XY
o si tiene una unidad NVMe
/dev/nvme0n
X
p
Y
.
Monte el sistema de archivos:
# mount /dev/sd
XY
/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/sd
XZ
/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
Basic Chroot