Ayer tuve que reiniciar mi querido home server tras mucho tiempo sin hacerlo. Tal y como ocurre en la informática, las cosas de repente dejan de funcionar, y esta no es una excepción: el “currante” (que así que como llamo a mi home server) dejó de funcionar. Al conectar un monitor me encontré con la pantalla en negro y el mensaje “Welcome to GRUB!”. ¿Un error al iniciar? Dudoso, pero había que probarlo.
Tras reiniciar el equipo seguía ocurriendo lo mismo. Tal y como podéis ver en los posts donde explico cómo montar un home server utilizo Debian squeeze para dicha tarea, que actualmente monta GRUB2.Anteriormente me había encontrado alguna corrupción de GRUB2 en los ordenadorres de amigos que utilizan Ubuntu. Dicha distribución obtiene los paquetes de la versión inestable de Debian, así que lo lógico era pensar que estos errores se habían propagado. En mi caso no es así, y según he comprobado parece que GRUB2 ha dejado de funcionar con fit-pc2 (el equipo que utilizo para el “currante”) por problemas de compatibilidad con el chipset Poulsbo. De cualquier modo, es una buena oportunidad para explicar cómo solucionar problemas graves de GRUB.
Nombre de los dispositivos de disco
Para solucionar un problema de arranque en una máquina hay que tener claro cómo trabaja linux con los dispositivos de disco. Como ya sabréis, linux utiliza unos archivos especiales que se encuentran en el directorio /dev/ para trabajar con los distintos dispositivos hardaware (y algunos virtuales) y los discos no son una excepción.
De esta forma, si utilizamos discos antiguos con interface PATA, estos archivos se nombrarán de la siguiente manera:
- /dev/hda -> Dispositivo PATA maestro conectado al primer canal IDE.
- /dev/hdb -> Dispositivo PATA esclavo conectado al primer canal IDE.
- /dev/hdc -> Dispositivo PATA maestro conectado al segundo canal IDE.
- /dev/hdb -> Dispositivo PATA esclavo conectado al segundo canal IDE.
- Y así sucesivamente.
Si por el contrario utilizamos cualquier otro tipo de disco (SCSI, SATA, disco USB, Pendrive o casi cualquier otra cosa) encontraremos la siguiente nomenclatura
- /dev/sda -> Primer dispositivo detectado.
- /dev/sdb -> segundo dispositivo detectado.
- Y así sucesivamente.
En ambos casos las particiones se nombran numéricamente comenzando por el 1. Pongo unos ejemplos:
- /dev/hda3 -> tercera partición del disco duro maestro conectado al primer canal IDE.
- /dev/sda1 -> primera partición de, por ejemplo, un disco SATA.
De ahora en adelante yo trabajaré con /dev/sda como disco a reparar y /dev/sda1 como partición que contiene /boot.
Arrancar desde un sistema de rescate
Como estamos tratando problemas de GRUB doy por supuesto que no se puede arrancar. Ante esta situación la mejor solución es utilizar el sistema de rescate de nuestra distribución o una distribución Live, que arrancaremos mediante lector óptico, pendrive, red o como mejor nos parezca, sepamos y podamos. Eso sí, debemos tener en cuenta que la versión de kernel del entorno que utilicemos para arrancar debe ser suficientemente cercana a la del entorno a recuperar. En mi caso utilizo el Live CD de Ubuntu 9.04 por comodidad, ya que da un entorno muy usable nada más arrancar. De cualquier modo, una vez arrancado el sistema nos iremos a un terminal para ingresar en la instalación de linux que se encuentra en el disco duro. para ello primero hay que hacer algunos montajes:
sudo mkdir /target sudo mount /dev/sda1 /target sudo mount --bind /dev /target/dev sudo mount -t sysfs sysfs /target/sys sudo mount -t proc proc /target/proc
Veamos en qué consisten estos pasos:
- Creación de un punto de montaje, algo trivial. Puedes utilizar el que quieras cambiándolo en el resto de líneas.
- Esta línea monta la partición raíz en /target. Si tenemos directorios con otras particiones, tales como /boot, /var, /tmp, etc es necesario montarlas también.
- Montamos el sistema de ficheros virtual de dispositivos. Como no hemos arrancado el kernel del disco duro que hemos montado, indicamos a mount que utilice los ya existentes en el entorno de recuperación.
- Sysfs es un sistema de ficheros virtual que contiene información de hardware, drivers y parámetros de configuración del kernel. Realmente no sería necesario, pero lo monto por seguridad.
- Proc es otro sistema de ficheros virtual que contiene da acceso a mucha información sobre los procesos que están corriendo en el sistema. Es necesario tenerlos montado para poder ejecutar comandos.
Y accedemos al sistema de nuestro disco:
sudo chroot /target
A partir de este momento ingresaremos en un shell del sistema operativo del disco duro a recuperar, aislada casi completamente del entorno de rescate que hemos utilizado para arrancar la máquina.
Antes de reiniciar deberíamos de salir de la shell chroot y desmontar todo lo que hemos montado:
exit umount /target/dev umount /target/sys umount /target/proc umount /target
- El primer comando sale de la shell chroot.
- El resto desmonta todo.
Tras esto se puede reiniciar el sistema de forma segura.
Solución de problemas de GRUB2
Y llega el momento de ponerse manos a la obra. El procedimiento que muestro a continuación es para errores de instalación de GRUB2. Si tienes errores en la generación de los archivos de configuración te recomiendo que leas la Wiki oficial del proyecto GRUB. La mayoría de los problemas con GRUB2 se pueden solucionar con su reinstalación:
grub-install --recheck /dev/sda
Esta orden reinstalaría GRUB2 en mi disco duro SATA principal. La opción –recheck fuerza a regenerar el fichero devices.map que contiene el listado de discos. De esta forma nos aseguramos de que GRUB2 tiene la información de los discos correcta y actualizada, que suele ser el principal motivo por el que deja de funcionar. Tras esto reiniciar y comprobar el resultado.
Si aún así GRUB2 sigue resistiéndose, lee el manual que se encuentra en la Wiki oficial del proyecto GRUB.
Si lo anterior falla, volver a GRUB Legacy
Si como en mi caso has agotado todas las posibilidades y encuentras que hay un problema con GRUB2 y tu hardaware, sería conveniente volver a la versión antigua de GRUB para poder seguir arrancando el sistema y buscar o abrir un bug al respecto.
NOTA: instala GRUB Legacy como último recurso. Aunque es estable tiene pocas funciones y el código tiene problemas serios de diseño, a parte de que su ciclo de vida ha finalizado. Te recomiendo encarecidamente que no utilices este método a no ser que no tengas más remedio.
Tras reiniciar el entorno de rescate y acceder por chroot a tu sistema, lo primero sería desinstalar GRUB2:
aptitude purge grub-pc rm -r /boot/grub
Te recomiendo que antes de lanzar esto hagas una copia de /boot/grub en cualquier sitio, por lo que pueda pasar. Tras haber desinstalado completamente GRUB2 instalamos el paquete de GRUB1:
aptitude install grub-legacy
Con este comando habremos instalado el paquete, sin embargo grub no se instalará en nuestro disco duro ni se configurará, para ello hay que realizar los siguientes pasos:
grub-install /dev/sda
Esto se puede quejar del stage1, ignoramos el error. Tras esto sería conveniente comprobar que la información de /boot/grub/device.map es correcta. En mi caso, para asegurarme que funciona, cambié el nuevo sistema de identificadores de disco por el archivo de dispositivo, quiere decir:
(hd0) /dev/disk/by-id/ata-ST3400620AS_6QH00FGT
por
(hd0) /dev/sda
Una vez hecho esto proseguimos la instalación y configuración:
grub #Entramos en grub. "grub>" representa el prompt de GRUB grub> root (hd0,0) grub> setup (hd0) grub> quit update-grub
Este último comando genera el fichero menu.lst y añade los kernels y sistemas operativos que tengamos instalados. Salimos del entorno de rescate tal y como indico más arriba y ¡listo! ya tenemos GRUB instalado, configurado y funcionando.
