Esta pagina se ve mejor con JavaScript habilitado

Recuperar UEFI en Linux/Windows/FreeBSD

 ·  🎃 kr0m

Las placas base modernas traen UEFI como sistema de arranque, esto aporta una serie de ventajas como la posibilidad de arrancar un SO sin bootloader, soporte de particiones GPT, capacidades de red desde el propio arranque entre otras.

UEFI utiliza una partición donde guarda las imágenes de EFI, si esta es borrada hay que restaurarla para poder arrancar, en este manual explicaré dicho procedimiento tanto en Linux como Windows10.

Primero debemos tener claro que hay una partición donde residirán todas las imágenes de arranque(/boot/efi), mientras esta partición vfat exista y tenga el contenido correcto tanto la BIOS-UEFI como Grub serán capaces de arrancar dichas imágenes. En el arranque UEFI se carga el boot loader principal /EFI/BOOT/BOOTX64.EFI y es este el encargado de buscar el resto de imágenes UEFI de cada sistema operativo.

En este artículo describiremos como hacerlo bajo varios sistemas operativos:


Linux

Bajo Linux es tan sencillo como chrootear a la partición del sistema y reinstalar grub.
Las particiones en mi sistema son:

fdisk -l /dev/sda

Disposit. Comienzo Final Sectores Tamaño Tipo
/dev/sda1 2048 4095 2048 1M Arranque de BIOS
/dev/sda2 4096 413695 409600 200M Sistema EFI
/dev/sda3 413696 2510847 2097152 1G Sistema de ficheros de Linux
/dev/sda4 2510848 468862094 466351247 222,4G Sistema de ficheros de Linux

Chrooteamos:

mount /dev/sda4 /mnt/gentoo
mount /dev/sda3 /mnt/gentoo/boot
mount /dev/sda2 /mnt/gentoo/boot/efi

mount -t proc none /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev

chroot /mnt/gentoo /bin/bash
env-update
source /etc/profile
export PS1="(chroot) $PS1"

Montamos el directorio /sys/firmware/efi/efivars con la opción rw para poder escribir en él:

mount -o remount,rw /sys/firmware/efi/efivars

Reinstalamos el EFI y regeneramos la config de grub:

grub-install --target=x86_64-efi --efi-directory=/boot/efi /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg

Salimos del chroot:

exit

Reiniciamos:

reboot

NOTA: Tendremos que compilar Grub del siguiente modo

vi /etc/make.conf
GRUB_PLATFORMS="efi-64"

Windows

En windows debemos arrancar desde el cd de instalación, acceder a la línea de comandos y reinstalar la imagen EFI.

Arrancamos diskpart

diskpart

Seleccionamos el disco donde está la partición EFI:

list disk
select disk 0

Seleccionamos la partición donde está la partición EFI y le asignamos la letra A:

list partition
select partition 1
assign letter=A

Seleccionamos la partición donde está Windows instalado y le asignamos la letra C:

list partition
list vol
select vol 3
assign letter=C
exit

Cambiamos al directorio de EFI y copiamos los ficheros necesarios:

cd /d a:\EFI\Microsoft\Boot
bootrec /fixboot
bcdboot c:\Windows /l en-gb /s a: /f ALL

Tras esto podremos ejecutar grub-mkconfig -o /boot/grub/grub.cfg y obtendremos una entrada adicional de Windoz.


FreeBSD

En FreeBSD es incluso mas fácil, tan solo copiamos los ficheros efi del memstick a la partición GPT, para ello nos bajamos la imagen iso y la volcamos a un usb para arrancar desde él:

Volcamos la imagen:

dd if=FreeBSD-12.1-RELEASE-amd64-mini-memstick.img of=/dev/XXX bs=1M conv=sync

Al arrancar seleccionaremos la opción “shell” y localizaremos la partición GPT:

gpart list

Debe aparecer una con type: efi:

3. Name: ada0p3
   type: efi

Montamos la partición en un directorio montado mediante unionfs para que sea escrivible:

mkdir /tmp/mnt
mount_unionfs /tmp/mnt /mnt/
mount -t msdosfs /dev/ada0p3 /mnt

Creamos el directorio donde copiaremos las imágenes efi y copiamos dichas imágenes:

mkdir /mnt/EFI/FreeBSD
cp /boot/*.efi /mnt/EFI/FreeBSD/

Consultamos el estado de UEFI en estos momentos:

efibootmgr -v

Insertamos una entrada nueva:

efibootmgr --create --activate --label FreeBSD --loader /dev/ada0p3:/EFI/FreeBSD/boot1.efi

Si añadimos una entrada incorrecta y queremos eliminarla ejecutaremos:

efibootmgr -B ID

Para mas información acerca de efibootmgr y UEFI sobre FreeBSD:
https://www.freebsd.org/cgi/man.cgi?query=efibootmgr&sektion=8&manpath=freebsd-release-ports
https://www.freebsd.org/cgi/man.cgi?query=uefi&sektion=8&manpath=freebsd-release-ports


Si además tenemos Linux instalado y utilizamos Grub como gestor de arranque debemos introducir una entrada manual desde Linux:

mount -o remount,rw /sys/firmware/efi/efivars

vi /etc/grub.d/40_custom

#!/bin/sh
exec tail -n +3 $0
menuentry "FreeBSD chainloader" {
        insmod part_gpt
        insmod fat
        set root='hd0,gpt3'
        chainloader /efi/freebsd/boot1.efi
}

Instalamos y regeneramos la configuración de Grub:

grub-install --target=x86_64-efi --efi-directory=/boot/efi /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg

Si te ha gustado el artículo puedes invitarme a un RedBull aquí