chroot (Español) - ArchWiki

Jump to content
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.

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/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

- Basic Chroot

Categories:

- System recovery (Español)
- Sandboxing (Español)
- Commands (Español)