Hace unas semanas tuve un problema con el equipo que me dejó en estado catatónico o de shock. Estaba trabajando tranquilamente con mi equipo, en mi sistema XUbuntu cuando me salió la notificación de que había una actualización. Casi siempre reviso cuales son las actualizaciones que hay pendientes, y, en éste caso había una sobre el kernel. De forma que, como simplemente utilizaba mi navegador en ese momento, decidí continuar con la instalación en lugar de dejarla para después. El caso es que, cuando la barra de progreso estaba cerca del final, el sistema se congeló literalmente. No podía mover el ratón, el teclado no respondía para sacarme una consola… De forma que, tras esperar unos minutos por si respondía, me ví forzado a apagar a lo cavernícola: botón de encendido y punto.
Siempre que apago el equipo por éste medio (por causas inevitables), cruzo los dedos mientras noto una gota de sudor frío que cae por mi espalda, y no me siento nada tranquilo hasta que veo el escritorio totalmente cargado otra vez. Pero en ésta ocasión tardé un poco más de lo normal en sentirme tranquilo, ya que, al arrancar, el equipo sólo me mostró la consola de recuperación del Grub, en lugar del habitual menú con la diversas opciones de arranque (en mi caso: Ubuntu, Opciones avanzadas, Test de memoria y Windows -sí, tengo los dos sistemas-).
Descripción del problema
Algunos, que sepáis un poco sobre el funcionamiento de los sistemas Linux, ya sabréis donde radica el problema, aunque no sepáis arreglarlo. Éste fue mi caso nada más ver la consola. Para lo que no lo sepáis o voy a poner un poco en situación:
El Grub2 (Grand Unified Linux Bootloader – Gran Cargador de Linux Unificado) es el cargador de arranque de Linux más utilizado hoy en día. No es el único, existen otras opciones como LILO, o Grub (que no es la primera versión de Grub2, ya que la evolución de éste se llama Grub2.0). Éste cargador de arranque es que se aloja en el MBR, o sector de inicio del disco duro y carga en memoria el kernel del sistema operativo para que pueda empezar la carga de éste. El cargador propio de los sistemas Windows, solo reconoce a otros sistemas Windows (podemos tener Windows7 y Windows8 a la vez), pero Grub2 reconoce a todos los sistemas operativos: Windows, Linux, Mac… De forma que se hace necesario tener éste cargador cuando tenemos diferentes sistemas.
Cada vez que actualizamos el kernel de Linux, se descarga la nueva versión del mismo, pero no se eliminan las versiones anteriores. El su lugar, se alojan todos en la carpeta /boot. Es recomendable dejar siempre varias imágenes del kernel de sistema disponibles, y ahora veréis por qué. Al acabar de descargar la versión nueva del kernel del sistema, debemos cambiar la entrada del Grub2 para que apunte a ésta y se olvide de la anterior, de forma que tengamos la versión más actual como opción por defecto.
Y ahí es donde surgió mi problema: En el momento en que se actualizaba el menú del Grub2 para que tomara la última versión del kernel (proceso automático), se bloqueó el sistema, con lo que quedó incompleto y no se encontraba ningún menú que mostrar.
La solución
Puesto que Grub no puede mostrar menú alguno con las entradas que apuntan a los kernel de los diferentes sistemas instalados (en las opciones avanzadas se ven todas las imágenes de kernel Linux anteriores que tengamos disponibles), lo que hace es mostrar una consola de grub2 que nos permite realizar muchas acciones para intentar arreglar el sistema.
En mi caso, no estaba muy familiarizado con ésta consola. Aunque habíamos dado algo en la universidad, no es una labor que realice a menudo, por lo que no me acordaba de nada que pudiera hacer. Así que pedí un poco de ayuda a un profesor de la asignatura de gestión de sistemas, el cual rápido me dijo la solución. Posteriormente, a raíz de dicho problema e imaginando lo que pasaría si no estuviese cerca de nadie que pueda ayudarme, me he puesto a investigar un poco para aprender, al menos las opciones básicas y más socorridas de ésta consola. Y así es como hoy os traigo ésta solución rápida, sencilla y sin consecuencias negativas sobre la situación del sistema anterior a dicho problema.
Cuando salga ésta consola, lo primero que tenéis que pensar es que en Linux casi todo el sistema (si no todo) se estructura en ficheros de configuración escritos en texto plano, lo cual permite una asombrosa flexibilidad para arreglar problemas que Windows por ejemplo no nos da. Lo primero que debemos hacer es identificar cual es la partición del disco duro en la cual está el sistema que queremos arrancar (nuestro Linux principal). Para ello utilizaremos el comando ls, que cumple una función totalmente distinta de la que tiene en la Shell. En ésta consola de recuperación, utilizado sin argumentos, nos muestra todos los dispositivos disponibles. El resultado será algo similar a la imagen.
Mediante esta lista debemos identificar la partición en que está nuestro sistema. Nos puede ayudar lanzar el comando ls otra vez con uno de los devices de la lista y las rutas de directorios dentro del mismo. Por ejemplo:
grub> ls (hd0,1)/boot/
Una vez identificado el disco desde el que queremos arrancar el sistema tenemos que indicarle a Grub que utilice dicho disco como principal. Para ello lo indicaremos en la variable de entorno root:
grub> set root=(hd0,1)
Ahora que tenemos seleccionado el disco principal, vamos a indicarle el sistema cual es el kernel a utilizar, así como la imagen del ramdisk inicial (initrd). Éstos dos deben de corresponderse en versión, y utilizaremos los siguientes comandos:
grub> linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sda1
grub> initrd /boot/initrd.img-3.13.0-29-generic
Éstos dos comando le indicarán a Grub qué es lo que debe cargar. Hay que tener cuidado de no copiar estos comandos literalmente:
- El disco (hd0,1) -> debéis poner el que os corresponda
- vmlinuz-3.13… -> es la imagen del kernel. Podéis buscar las imágenes instaladas mediante el comando ls seleccionando el directorio /boot del disco que corresponda a vuestro sistema.
- en el argumento root= del comando Linux, debéis seleccionar el device file principal del sistema Linux que vas a arrancar.
- initrd.img-3.13… -> imagen del ramdisk inicial que se utilizará para cargar el sistema. Se trata del sistema de archivos temporal que el kernel utilizará durante el arranque.
Tanto el ramdisk cómo la imagen del kernel, deberían no ser la última versión que se ha tratado de actualizar, ya que ésta ha dado problemas y podría no funcionar correctamente. Se recomienda utilizar justo la anterior a la última, pero se puede utilizar la que se quiera. Si las configuraciones cambian nada más arrancar el disco por haber utilizado una versión del kernel anterior (fondo de pantalla o similares) no os alarméis, se arreglará una vez acabado de reparar el cambio.
Una vez que todo esto está cargado, mandamos arrancar el sistema simplemente con el comando:
grub> boot
La consola de rescate de Grub
Debemos de tener en cuenta que si nos encontramos en la consola de rescate de Grub (grub rescue>), vamos a tener que utilizar unos comandos diferentes, aunque la teoría es la misma:
grub rescue> set prefix=(hd0,1)/boot/grub grub rescue> set root=(hd0,1) grub rescue> insmod normal grub rescue> normal grub rescue> insmod linux grub rescue> linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sda1 grub rescue> initrd /boot/initrd.img-3.13.0-29-generic grub rescue> boot
Reparación definitiva
Ahora que tenemos el sistema arrancado, debemos de tener en cuenta, que el arreglo es temporal. Si reiniciamos el sistema tenemos que volver a realizar todos los pasos anteriores. De forma que ahora debemos hacer que dichos arreglos seas definitivos. Para ello, simplemente abrimos una Shell y tecleamos los siguientes dos comandos:
$> sudo update-grub
$> sudo grub-install /dev/sda
El comando update-grub crea un fichero de configuración de Grub, y grub-install se encarga de instalar Grub en un disco. Tened en cuenta que se instala en el disco, por lo que no debéis indicar un número de partición en /dev/sda.
Ahora ya podéis reiniciar tranquilamente y observar que vuelve a aparecer el menú de Grub en el inicio. Aún así, es posible que la próxima vez que intentéis actualizar ($> sudo apt-get update & sudo apt-get upgrade -y), os salga un problema de configuración de paquetes. Esto puede ser porque el último kernel no haya quedado totalmente bien configurado (aunque puede venir de otros problemas de paquetes), y lo arreglaréis muy sencillamente mediante el comando:
$> sudo dpkg-reconfigure -a
Espero haberos ayudado, no solo a arreglar el problema, si no a comprender un poco mejor por qué apareció en un principio. Si no habéis podido arreglarlo con los pasos que os he indicado, os recomiendo que tratéis de utilizar el Super GRUB2 live rescue disk, o que consultéis el manual de Grub en busca de opciones más avanzadas.
El artículo Rescatar el arranque de Linux con la consola de Grub2 apareció por primera vez en Instinto Binario.