¿Cómo reparo GRUB con EFI en Ubuntu?

¡Trabajadores!

Desde los tiempos del Primer Peronismo he explicado cómo recuperar GRUB con el DVD de Ubuntu. Este procedimiento nos servirá para las instalaciones típicas, con viejo arranque desde el BIOS.

Sin embargo, de un tiempo a esta parte el efectivo arrancador GRUB ha debido afrontar la aparición del sistema de arranque firmado, llamado EFI o UEFI, que está presente en los equipos de más moderna factura.

UEFI/EFI es un arrancador compuesto, que es más complejo que el sistema convencional de arranque. GRUB puede utilizarlo, haciendo contacto desde lo que sería la UEFI que reside en la placa madre de nuestro sistema hasta una partición especial dentro del disco rígido que contiene el arrancador EFI. En el caso de Ubuntu 18.04LTS, esta partición tiene unos 512MiB de espacio y va formateada en FAT32 para máxima compatibilidad. Allí se deposita el arrancador en el punto de montaje /boot/sh, y luego en el resto de las particiones de sistema (si existen) continuarán en siguientes particiones, normalmente dentro del misma unidad de disco, o eventualmente en otras (según lo hayamos configurado especialmente).

Si hubiese habido una falla con GRUB o la partición EFI, y el sistema se niega a arrancar desde el disco rígido, podremos recuperarla, siempre y cuando no eliminemos las particiones de manera alguna.

Para ello utilizamos el DVD arrancable de Ubuntu, o un pendrive preparado con la ISO de Ubuntu (idealmente la misma versión que la utilizada para instalar la versión). La arrancamos y elegimos "Probar Ubuntu sin Instalar".

Una vez iniciado el escritorio Live, debemos identificar las particiones del disco. Para ello conviene utilizar gParted, que está incluido en el Ubuntu Live. Debemos prestar especial atención a la identificación de discos, pues la misma describe como /dev/sdx a la unidad de disco, /dev/sdxx es la partición donde se encuentra la EFI, y /dev/sdxxx es la partición de sistema.
Por ejemplo, en una instalación típica de Ubuntu 18.04LTS, en un único disco rígido, el disco podría ser /dev/sda, la partición EFI /dev/sda1 y la partición de sistema /dev/sda2. Sin embargo, debemos prestar atención pues la misma podría variar en otras condiciones, y es importante tomar nota de las identificaciones correctas.

Si lo deseamos hacer desde la terminal, abrimos una con Ctrl+Alt+T e ingresamos:

sudo fdisk -l

Una vez identificadas las particiones EFI y de sistema, debemos montarlas.

Ello lo haremos desde la terminal por medio de los comandos necesarios. Primero montamos la partición de sistema, usamos:

sudo mount /dev/sdxxx /mnt

Luego montamos la partición EFI:

sudo mount /dev/sdxx /mnt/boot/efi

for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done

Luego nos damos de alta como administrador en la partición de sistema recién montada:

sudo chroot /mnt

Confome estemos logueados como Root, tendremos al alcance nuestro disco rígido. Ahora debemos reinstalar la parte de GRUB que va en el disco. Ello se hace con:

grub-install /dev/sdX

...y lo actualizaremos con:


update-grub

Si nos dice que tuvo éxito, ingresamos:

exit

Y luego reiniciamos el sistema (se nos solicitará retirar el DVD o Pendrive de Ubuntu, y el equipo debería reiniciar correctamente desde el disco rígido con EFI, como lo hacía normalmente.


Editar errores de GRUB

Puede haber sucedido que hayamos cometido errores en la configuración de GRUB. Si tal fuese el caso y tuviésemos que editarlo que editarlo, lo haremos con:

mount /dev/sdxxx /mnt
chroot /mnt

Una vez montado el sistema de archivo del disco, lo editamos con:

nano /etc/default/grub

...y revisamos que todo esté correcto.


Si no tuviésemos la referencia del archivo de configuración de GRUB, econtraremos una muestra en /usr/share/grub/default/grub

Recrear la partición EFI para GRUB
Si por alguna causa catastrófica hubiésemos perdido la partición EFI, es fácil hacerla de nuevo.

Podemos usar fdisk o gParted para crear una nueva partición GPT con el tipo "EFI partition (1)", idealmente al principio del disco. Acto seguido la formateamos con:

sudo mkfs.msdos /dev/sdx

...luego la montamos con:

sudo mount /dev/sdXX /mnt/boot/efi

...y seguimos montando el resto del sistema, como en el caso anterior.

sudo mount /dev/sdXXX /mnt
sudo grub-install /dev/sdx


Recuperar la EFI cuando tenemos nuestro sistemas de archivos repartido en distintos discos rígidos
Indudablemente que si al instalar el sistema operativo se repartió el sistema de archivos largo de diferentes particiones (la carpeta raíz "/" en un disco y la carpetas /home, /tmp y /var en otro), la tarea de recuperación de la EFI será algo más desafiante.

En tal caso tenemos que proceder a averiguar y tomar adecuada nota de qué identificador de discos y en qué particiones está cada componente del sistema de archivos (lo averiguamos con sudo fdisk -l).

Ejemplo: Suponiendo que tenemos dos discos, y que nuestro sistema de archivos está estructurado de la siguiente manera:

Disco de estado sólido de arranque y sistema /dev/sda:
Partición /dev/sda1 -> particion EFI
Partición /dev/sda2 -> carpeta "/" del sistema

Disco rígido de trabajo /dev/sdb:
Partición /dev/sdb1 -> carpeta /home
Partición /dev/sdb2 -> carpeta /tmp
Partición /dev/sdb3 -> carpeta /var,

En tal caso, si deseamos recuperar la partición EFI en este sistema de archivos dividido entre dos discos, deberíamos ingresar los siguientes comandos:


sudo mount /dev/sda2 /mnt
sudo mount /dev/sdb1 /mnt/home

sudo mount /dev/sdb2 /mnt/tmp
sudo mount /dev/sdb3 /mnt/var
sudo mount /dev/sda1 /mnt/boot/efi
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
sudo chroot /mnt
grub-install /dev/sda


update-grub

Si nos dice que tuvo éxito, ingresamos:

exit

Y reiniciamos el sistema.


Copiar la EFI a la UEFI de la placa madre

Este ejemplo puede resultar útil cuando cambiamos de disco rígido, o bien cambiamos de placa madre en el equipo. En tal caso la placa madre no podrá encontrar la ruta de UEFI (no tiene que ver aún con el arrancador GRUB. Para resolver este problema deberemos copiar EFI a la memoria UEFI de la placa madre.

    Si nuestro disco es reconocido como /dev/sda (lo cual suele ser típico en computadoras portátiles o nettops, ya que llevan un único disco), el comando será:


sudo efibootmgr -c -l "\EFI\UBUNTU\SHIMX64.EFI" -L ubuntu

    En cambio, si el disco es otro (en caso de instalaciones en sistemas con varios discos), habremos de adaptar el idenfiticador del disco /dev/sdX para que quede así:


sudo efibootmgr -c -l "\EFI\UBUNTU\SHIMX64.EFI" -L ubuntu -d /dev/sdX -p N