Cómo usar la consola de GRUB y no morir en el intento

Publicado el 20 octubre 2016 por Drassill
GRUB es indudablemente un gestor de arranque increíblemente popular cuyo funcionamiento tanto a nivel de uso como de configuración es muy sencillo... Es cierto que con la implantación de GRUB2 la dificultad ha aumentado ligeramente, pero en esencia el concepto ha persistido. Anteriormente se ha tratado temas tales como la seguridad que hay que tener en cuenta en GRUB, pues permite hacer cosas increíblemente peligrosas con una asombrosa facilidad; pero hoy quiero hablar sobre un aspecto de GRUB que da mucho respeto a todos los usuarios, desde los recién iniciados a los más veteranos... Hablo por supuesto de la temida consola... pero no de la consola de shell que todo el mundo conoce, sino de la consola de GRUB

Así es, GRUB también posee una consola; una consola a la que generalmente no necesitaremos acceder, pero que está allí, disponible para todo aquel que la quiera usar y que puede ayudarle a uno a realizar cosas que el menú de GRUB de por sí no permite... Lo mejor que podemos hacer para experimentar con dicha consola en nuestras propias carnes es arrancar cualquier sistema Linux que tenga el gestor de arranque GRUB/GRUB2 y tan pronto como nos aparezca el menú de selección de sistema operativo y/o kernel pulsaremos la tecla c. Tan pronto como pulsemos dicha tecla, entraremos en el modo consola el cual si bien tiene una ligera similitud con la shell tradicional, nuestros conocimientos sobre la susodicha no nos servirán de mucho... 
La primera recomendación que haría al entrar en esta consola sería que se activase la paginación de ésta... ¿Este cambio que implicaría? Que en caso de que un comando nos mostrase un resultado que no cupiese dentro de la pantalla, nos paginaría el resultado para poder leer el contenido integro de la salida del comando; cosa especialmente útil al intentar recurrir a la ayuda de la consola, que generalmente nos mostrará bastante contenido... Esta paginación se activaría mediante este pequeño comando:
setpager=1
Gracias a lo que acabamos de hacer dispondremos de una cierta "comodidad"; ahora bien... ¿Qué podemos hacer en este punto? Esta consola nos permite conocer qué dispositivos USB tenemos conectados o qué puertos COM tenemos disponibles mediante los comandos: usb y serial, respectivamente. 
Obviamente también tenemos algunos comandos que nos recordarán a shell, comandos típicos tales como halt (para apagar el equipo), reboot (para reiniciarlo) cat o clear; comandos que funcionan exactamente igual que en una shell normal y corriente, si bien existe una excepción: Uno de los comandos más famosos que funciona ligeramente distinto a lo que estamos acostumbrados; ls.
Este comando cumple su función, que es el listado de directorios, pero la cuestión está que al no hallarnos dentro de ninguna unidad (lógico debido a que todavía no hemos "arrancado" nada), no nos haría un listado de los típicos directorios de Linux tales como home o etc... Este comando nos hará un listado de las particiones y discos disponibles. He aquí una pequeña captura de la salida de dicho comando:

Además debemos tener presente que podemos usar/declarar variables de entorno tal y como podemos hacer en una shell corriente mediante el comando set, cosa que si bien nos puede parecer extraño en un entorno tan limitado como éste, nos puede resultar muy útil.
Por otro lado tenemos varios comandos especialmente útiles que serían exactamente dos tres:
  • linux: Así es, el comando tiene dicho nombre y tiene una gran función: Especificar a qué Kernel queremos apuntar; Kernel que más adelante podría ser arrancando desde la consola de GRUB. Es un comando muy útil, tal y como veremos más adelante.
  • initrd: Especifica a qué fichero initrd queremos apuntar... El fichero initrd (Initial RAM Disk) se encarga de cargar un sistema de ficheros temporal que ayudaría a que ayudaría al Kernel a ejecutar algunas funciones.  El fichero initrd al que apuntaríamos tendría la misma versión que el kernel, pues en caso contrario habría problemas... Tal vez nos parezca un concepto complicado, pero más adelante veréis que no es así.
  • boot: Arranca el sistema operativo que hemos seleccionado previamente gracias a la combinación de los dos comandos anteriores.

Pasemos a la parte más seria de esta consola... Hasta ahora hemos visto los características globales y lo que nos puede ofrecer pero... ¿En qué nos puede servir este conocimiento más allá de la mera curiosidad? La consola de GRUB rara vez será usada por nosotros pero en verdad os digo que habrá momentos cruciales en los que nos salvará la vida. Imaginemos que el GRUB se ha corrompido y que no nos aparece el menú de selección de sistema operativo/kernel sino que directamente nos aparece la consola o que el menú nos aparece pero que no apunta correctamente al sistema que queremos cargar... En casos tan raros, pero extremos, como esos, es cuando esta consola cobra una enorme relevancia... Es por eso que a continuación os enseñaré el uso más común que se le da a esta consola: El arranque "manual" de un sistema operativo desde la consola de GRUB.
En caso de vernos en dicha situación, lo primero que tendríamos que hacer es realizar el comando ls, tal y como hemos realizado anteriormente... Allí veremos un listado parecido al de la anterior captura, el cual nos será especialmente informativo... Generalmente lo que buscaremos será que arranque la primera partición del primer disco duro, es decir hd0,msdos1, pero para ello tendremos que saber qué arrancar de de dicha partición; es por eso que haremos un listado de dicha partición mediante ls, pero en concreto listaremos el directorio boot de dicha partición, directorio que almacena tanto las imágenes de kernel como los ficheros initrd.
ls(hd0,msdos1)/boot/
Allí veremos un listado de fichero que empezarán o por vmlinuz o por initrd.img.

Si nos fijamos bien, ambos ficheros comparten la misma versión, cosa que debe de ser así, con lo que a sabiendas de que dicho dato es cierto y que conocemos sus nombres completos (que incluyen su número de versión) podremos pasar al siguiente paso... Que será la selección de la partición que tiene el sistema de ficheros raíz (/). Hemos visto que dicha partición hd0,msdos1, que se puede abreviar como hd0,1, con lo que lo primero que haremos será realizar dicha especificación:
setroot=(hd0,1)
Ahora que tenemos dicha especificación realizada, podríamos pasar al procedimiento que arrancará el sistema, procedimiento que se basa en la combinación de los tres comandos "especiales" arriba mencionados. Basándonos en el resultado de nuestro último ls, los comandos serían los siguiente:
  1. linux /boot/vmlinuz-3.16.0-4-686-pae root=/dev/sda1
  2. initrd /boot/initrd.img-3.16.0-4-686-pae
  3. boot

Si observáis bien, en esta ocasión no mencionaremos el nombre de la partición debido a que anteriormente hemos mencionado dicha partición mediante el comando set. Además veréis que en el comando linux hemos añadido la sintaxis root=/dev/sda1. ¿Cómo sabemos que es sda1 y no otro número? Eso lo sabremos gracias al nombre de la partición: hd0 sería equivalente a sda, hd2 a sdb... y así sucesivamente mientras que el último dígito permanecería intacto; es decir que si por ejemplo tuviésemos hd0,1 sería /dev/sda1 mientras que si tuviésemos hd3,2, tendríamos /dev/sdd2. Tras aplicar ambos comandos linux e initrd, pasaríamos a ejecutar el comando boot, con el que arrancaríamos el sistema operativo de la misma forma de que lo habríamos hecho en el propio menú de GRUB, solo que mediante un método mucho más artesanal.
Como podéis ver, la consola de GRUB guarda menos misterios de los que a primera vista parece, solamente hay que perderle el miedo para descubrir que nos puede sacar de más de un atolladero.
Espero que os haya resultado útil.
Saludos.