¿Cuál es la forma correcta de preparar chroot para recuperar una instalación Linux dañada?

52

Esta pregunta se relaciona con preguntas que se hacen con frecuencia. El procedimiento se menciona con frecuencia o se vincula a un sitio externo, pero a menudo no se establece de manera clara y correcta. Con el objetivo de concentrar información útil en un solo lugar, esta pregunta busca proporcionar una referencia clara y correcta para este procedimiento.


¿Cuáles son los pasos adecuados para preparar un entorno chroot para un procedimiento de recuperación?

En muchas situaciones , la reparación de una instalación dañada de Linux se realiza mejor desde la instalación. Pero si el sistema no arranca, ¿cómo lo arreglas desde adentro?

Supongamos que logra arrancar en un sistema alternativo. Una vez allí, debe acceder a su instalación rota para solucionarlo. Muchos How-Tos de recuperación recomiendan usar chroot para ejecutar programas como si realmente se iniciara en la instalación dañada.

  • ¿Cuál es el procedimiento básico?
  • ¿Se aceptan las mejores prácticas a seguir?
  • ¿Qué variables deben considerarse para adaptar los pasos básicos de preparación a una tarea de recuperación en particular?

Como se trata de Community Wiki, siéntase libre de editar esta pregunta para mejorarla también.

quijote quack
fuente

Respuestas:

72

Aquí hay algunos recursos:

"Cambiar la raíz" o "chrooting" es un método para hacer zoom en una parte de su sistema de archivos, por lo que, por ejemplo, /pathse referirá a lo que antes era accesible /mnt/path. La "raíz" en la expresión "chroot" se refiere al sistema de archivos raíz /, no al usuario raíz. (Aunque, por lo general, necesitará privilegios de usuario root para poder hacer chroot).

Preparación

  • Todos los pasos de esta guía deberán realizarse como usuario root.

  • Suponemos que su disco duro está en / dev / sda1 y su tipo de archivo es ext3. Si no conoce la ubicación y el tipo de archivo de su disco, lea la salida de fdisk -l.

  • Asegúrese de que las arquitecturas del sistema en el que inició (por ejemplo, es un LiveCD de 32 bits) y el sistema que desea ingresar (por ejemplo, es una instalación de 32 bits en su disco duro) coinciden. Puede determinar la arquitectura con la que inició utilizando uname -m.

  • Asegúrese de que se hayan cargado todos los módulos del núcleo que necesita.

  • Configure su red si la necesita (por ejemplo, para instalar paquetes actualizados).

  • Inicialice su partición de intercambio si es necesario (por ejemplo, swapon /dev/sda3).

Realizar el chroot

cd /
mount -t ext3 /dev/sda1 /mnt
mount -t proc proc /mnt/proc
mount -t sysfs sys /mnt/sys
mount -o bind /dev /mnt/dev

Si su /bootdirectorio está en una partición diferente de la /suya y desea manipular archivos en él (por ejemplo, si trabajará con GRUB, realizará una actualización del núcleo, etc.), también necesitará montar esa partición. Si está en / dev / sda2 y su tipo de archivo es ext2, entonces haga lo siguiente:

mount -t ext2 /dev/sda2 /mnt/boot

De manera similar, para cualquier otra parte de su sistema de archivos ( /var, /usr) que resida en particiones separadas pero a las que necesite acceder. En general, cuando estás haciendo chrooting para arreglar algo a lo que no necesitarás acceso / home, no necesitas preocuparte por ello.

(También es posible montar sistemas de archivos después de haber hecho un chroote, pero es más inteligente hacerlo de antemano. La razón es que cuando lo haga después, el entorno externo / kernel no sabrá sobre los sistemas de archivos montados, así que si olvida desmontarlos antes de salir del chroot, el sistema tampoco sabrá desmontarlos cuando se apague. Esto podría dañar esos sistemas de archivos).

Si ha configurado su red y desea usarla en el sistema chrooteado, copie /etc/resolv.confpara poder resolver los nombres de dominio:

cp -L /etc/resolv.conf /mnt/etc/resolv.conf

Ahora está listo para pasar al sistema de archivos montado:

chroot /mnt /bin/bash

(Si esto devuelve un error chroot: cannot run command '/bin/bash': Exec format error, generalmente indica que arrancó con una arquitectura (por ejemplo, x86_32) y está tratando de pasar a otra (por ejemplo, x86_64). La solución es usar un LiveCD que tenga la misma arquitectura que el sistema que desea. chroot en.)

En este punto, todavía está ejecutando el núcleo con el que arrancó, pero todas las rutas /pathse referirán a lo que solía ser /mnt/path.

Si va a hacer algo con GRUB, deberá asegurarse de que su /etc/mtabarchivo esté actualizado:

grep -v rootfs /proc/mounts > /etc/mtab

También podría ser útil en este punto hacer:

source /etc/profile
export PS1="(chroot) $PS1"  # add a reminder to your prompt

Haz tu trabajo sucio

En este punto, puede realizar cualquier solución de problemas que necesite hacer:

  • vuelva a instalar GRUB en el MBR de su disco
  • restablecer una contraseña olvidada
  • realizar una actualización del kernel (o downgrade)
  • reconstruye tu disco de inicio
  • arregla tu / etc / fstab
  • reinstalar paquetes usando su administrador de paquetes
  • lo que sea

Limpiar

Cuando haya terminado, asegúrese de que todos los programas en ejecución se hayan detenido. Luego salga del chroot:

exit

Ahora desmonta todas las particiones que montaste:

umount /mnt/boot # if you mounted this or any other separate partitions
umount /mnt/{proc,sys,dev}

Finalmente intente desmontar su disco duro:

umount /mnt

Si recibe un error que dice que / mnt (o cualquier otra partición) está ocupada, esto puede significar una de dos cosas:

  • Se dejó un programa ejecutándose dentro del chroot.

  • O más frecuentemente: todavía existe un punto de montaje en este montaje. Por ejemplo, / mnt / usr todavía está montado al intentar desmontar / mnt.

En el último caso, simplemente desmonte el punto de montaje ofensivo primero. Para recibir un recordatorio de todos los puntos de montaje actuales, ejecute mountsin parámetros.

Finalmente:

reboot
dudosos
fuente
10
Como preparación, tiendo a dejar un script llamado chroot.shen la raíz de cada sistema que utilizo, cuyo contenido coincide más o menos con el anterior. Cuando necesito hacer un chroot en ese sistema desde un LiveCD o algo así, simplemente monte el sistema de archivos raíz y ejecuto el script chroot. No más google frenético para los comandos correctos.
Ryan Thompson
44
Usted, señor, salvó mi tocino - brillante reseña. En situaciones como esta, desearía que SO tuviera un botón +1000.
zelanix
1
Use esto: SHELL=/bin/bash chroot /mntsi el SHELL predeterminado de livecd no está en el entorno chrooteado (defalut zsh de systemrescuecd es un ejemplo) para arreglar, por ejemplo, !en Vim.
Alois Mahdal
Descubrí que también necesitas montar /runestos días mount --bind /run /mnt/run.
Cengique