domingo, 23 de noviembre de 2025

efibootmgr en Debian

Que son el EFI y UEFI


EFI y UEFI son firmwares para controlar e inicializar el hardware de un ordenador antes de cargar el sistema operativo. 


- EFI (Extensible Firmware Interface) es el firmware desarrollado por Intel, para mejorar y superar las limitaciones de la antigua BIOS, dispone de interfaz gráfica de usuario, con la posibilidad de usar ratón, con conexión a internet, dispone de sistema de arranque seguro (garantiza que solo puede arrancar, aquel sistema operativo que previamente hemos instalado).


- UEFI (Unified Extensible Firmware Interface) es un firmware mas moderno y actualizado, basado en EFI. Incluye: todas la novedades del EFI, pero con mejoras y mas seguridad.


En resumen, ambos son firmware, EFI fue el primero en actualizar la antigua BIOS y UEFI es la actualización que amplia y mejora al EFI. Actualmente, por defecto, las nuevas placas base incluyen el firmware UEFI por defecto. 


NOTA: En este manual usaremos el termino EFI para referirnos tanto a firmwares EFI como UEFI, ya que el comando que usaremos se llama: efibootmgr, de esta manera es mas fácil recordar el nombre del comando. 



Que es efibootmgr


efibootmgr es un programa que se usa desde la linea de comando para gestionar las entradas de arranque en sistemas que utilizan tanto el firmware EFI como el UEFI. Pudiendo: añadir, eliminar, modificar y reordenadar la lista de entradas del gestor de arranque EFI.


Observaciones para el comando efibootmgr: este comando soporta parámetros, y cada parámetro tiene la versión abreviada y la versión sin abreviar, es decir, el parámetro es el mismo, la única diferencia, es que la versión corta, generalmente es una sola letra y la versión larga, es una, dos o varias palabras.


Ejemplo real:


-c | --createCrea una nueva variable bootnum y la agréga a bootorder



Instalación de efibootmgr


Como siempre hacemos en este blog, lo primero que tenemos que hacer es instalar el paquete: efibootmgr


apt install efibootmgr



1- Visualizar las entradas actuales del EFI


El primer comando que vamos a usar es:


sudo efibootmgr


Nos muestra todas las entradas, el orden de estas, el sistema de arranque por defecto, el tiempo de demora antes de arrancar, y mas detalles.


Nota muy importante: la primera línea de arranque comienza por: 0000 (numeración hexadecimal: del 0-9 y de la A-F)


=============================
BootCurrent: 0001
Timeout: 2 seconds
BootOrder: 0001,0002,0000
Boot0000* Windows Boot Manager
Boot0001* Debian GNU/Linux
Boot0002* Ubuntu
=============================

Explicación:

BootCurrent: 0001  >  Es el sistema operativo que va a arrancar por defecto

Timeout: 2 seconds  >  Es el tiempo por defecto que espera antes de arrancar la línea BootCurrent

BootOrder: 0001,0002,0000   >  Es el orden en el que aparecen los sistemas operativos que puede arrancar

Boot0000* Windows Boot Manager   >   Es la primera entrada a arrancar

Boot0001* Debian GNU/Linux   >   Es la segunda entrada a arrancar

Boot0002* Ubuntu   >   Es la tercera entrada a arrancar



1- Añadir una nueva entrada de arranque


Vamos añadir una nueva entrada a la lista de arranque EFI, para ello pasaremos los siguientes parámetros a efibootmgr:


-c | --create  : para crear una nueva entrada


-d | --disk /dev/sdX: seguido por el disco en el que se aloja la partición EFI, sustituye la X por el numero del disco duro en el que se encuentra la partición EFI


-p | --part Y: seguido por el número de partición en la que se aloja la partición EFI sustituye la Y con el numero de la partición en la que se encuentra la partición EFI.


-L | --label: es la etiqueta (el nombre que vamos a visualizar en la lista de sistemas operativos) que vamos a utilizar como entrada de arranque


-l | --loader: Dependiendo del sistema operativo que tenemos instalado, tenemos que usar un cargador especifico. Aquí tenemos dos cargadores, uno para Debian y otro para Windows:

"\EFI\debian\grubx64.efi"
"\EFI\Microsoft\Boot\bootmgfw.efi"


- Información de como se genera la entrada en el EFI

sudo efibootmgr --create --disk /dev/sdX --part Y --loader "\EFI\debian\grubx64.efi--label "Debian"

sudo efibootmgr -c -d /dev/sdX -p Y -l "\EFI\debian\grubx64.efi" -L "Debian"

Ejemplo real de como se genera la entrada en el EFI

sudo efibootmgr -c -d /dev/sda -p 3 -l "\EFI\"label"\grubx64.efi" -L "Debian"

sudo efibootmgr -c -d /dev/sda -p-l "\EFI\Microsoft\Boot\bootmgfw.efi"
 -L "Windows 10"


Muy Importante 1:

=========================================================

La ruta de la imagen de arranque EFI debe usar barra invertida (\), en lugar de la barra diagonal (/), como separador de ruta. 



Porque indicamos la ruta relativa y no la ruta absoluta

La razón es por cómo funciona el firmware EFI/UEFI y la partición EFI System Partition (ESP)
 
El firmware UEFI "ve" directamente la partición EFI

Cuando el firmware UEFI arranca:

- Monta automáticamente la partición EFI (ESP)
- Asigna una letra de unidad EFI virtual (como fs0:, fs1:, etc.)
- El punto de montaje raíz para el firmware es la raíz de la partición EFI 

Estructura estándar de la partición EFI:

/boot/efi/EFI/          ← Este es el punto de montaje en Linux
├── BOOT/
├── Microsoft/
├── debian/
│   └── grubx64.efi
└── ubuntu/

¿Qué "ve" el firmware UEFI?

fs0:\EFI\               ← Raíz desde la perspectiva del firmware
    ├── BOOT\
    ├── Microsoft\
    ├── debian\
    │   └── grubx64.efi
    └── ubuntu\

Por qué la ruta relativa:

- En Linux se monta en /boot/efi → archivo en /boot/efi/EFI/debian/grubx64.efi
- El firmware UEFI ve \EFI\debian\grubx64.efi

Si usaras la ruta "absoluta" de Linux:

\boot\efi\EFI\debian\grubx64.efi el firmware buscaría: fs0:\boot\efi\EFI\debian\grubx64.efi 

¡Y esto no existe! Porque /boot/efi es solo el punto de montaje en Linux, no existe en la estructura real de la partición EFI.

Resumen: Siempre se tiene que usar rutas relativas a la raíz de la partición EFI porque el firmware ya está "dentro" de esa partición cuando busca el cargador. 
=========================================================


Muy Importante 2: Si la partición de arranque ESP fue creada por Debian, la ruta es: \EFI\debian\grubx64.efi. Y si es creada por otro sistema operativo linux, se le cambia el nombre: debian por el nombre del otro sistema operativo linux. Y si es creada por un sistema operativo de microsoft la ruta es: \EFI\Microsoft\Boot\bootmgfw.efi




2- Cambiar el orden de arranque:


Primero vemos el orden actual, usando el siguiente comando:


sudo efibootmgr


Nos devuelve el orden actual (Esto es un ejemplo):

=============================================== 
[root@localhost ~]# efibootmgr
BootCurrent: 0004
BootNext: 0003
BootOrder: 0004,0000,0001,0002,0003
Timeout: 30 seconds
Boot0000* Diskette Drive(device:0)
Boot0001* CD-ROM Drive(device:FF)
Boot0002* Hard Drive(Device:80)/HD(Part1,Sig00112233)
Boot0003* PXE Boot: MAC(00D0B7C15D91)
Boot0004* Linux
================================================

 

Ahora reordenamos según nuestras necesidades, usando el parámetro: -o | --bootorder (cualquiera de los tres métodos de abajo son validos)

 

sudo efibootmgr --bootorder 0004,0000,0001,0002,0003

sudo efibootmgr -o 0000,0001,0002,0003,0004

sudo efibootmgr -o 0,1,2,3,4

 


3- Eliminar una entrada de arranque:

 

Para borrar / eliminar una entrada de la lista de arranque, usamos los parámetros:


-b | --bootnum =  borra la entrada seleccionada
-B | --delete-bootnum = borra la entrada de la lista bootorder

 

El orden de los parámetros es indiferente, pero tienen que estar presentes ambos parámetros en caso contrario, No borrará / eliminará ninguna entrada, y nos devolverá un error, nos dirá que no sabe cual tiene que eliminar.


Muy importante:

===========================================================

- Asegúrate de seleccionar realmente el número de boot que quieres eliminar: XXXX 

- Los cambios son inmediatos (no requiere confirmación adicional)

- El firmware UEFi actualiza la NVRAM automáticamente, con lo cual se borra directamente

===========================================================

(cualquiera de los tres métodos de abajo son validos)

sudo efibootmgr --delete-bootnum --bootnum 0003

sudo efibootmgr -b 0003 -B

sudo efibootmgr -B -b 0003



4- Especificar una entrada activa o desactiva

 

Una entrada de inicio seguida de un asterisco (Boot0001*) indica que está activo. En caso contrario, está inactivo (Boot0001).

 

Para establecer una entrada de arranque activa, usaremos los siguientes parámetros:

 

-b | --bootnum = indica el numero de la entrada

-a | --active = activar la entrada


sudo efibootmgr --bootnum 0003 --active

sudo efibootmgr -b 0003 -a


Para establecer una entrada de arranque inactiva, usaremos los siguientes parámetros:

 

-b | --bootnum = indica el numero de la entrada

-A | --inactive = desactivar la entrada


sudo efibootmgr --bootnum 0003

sudo efibootmgr -b 0003 --inactive

 

Ejemplo:

=============================================== 
[root@localhost ~]# efibootmgr
BootCurrent: 0004
BootNext: 0003
BootOrder: 0004,0000,0001,0002,0003
Timeout: 30 seconds
Boot0000* Diskette Drive(device:0)
Boot0001* CD-ROM Drive(device:FF)
Boot0002* Hard Drive(Device:80)/HD(Part1,Sig00112233)
Boot0003* PXE Boot: MAC(00D0B7C15D91)
Boot0004* Linux
Boot0005  Windows
================================================
 



5- Habilitar arranque seguro (Secure Boot)


Para habilitar el Secure Boot, normalmente se tiene que hacer desde la configuración del firmware EFI/UEFI del ordenador, el método correcto consiste en reiniciar el ordenador para acceder a la configuración del firmware EFI/UEFI, localizar la opción de Arranque seguro en la pestaña "Seguridad" o "Arranque" y configurarla como "Habilitado". También se tiene que desactivar el CSM (Módulo de Soporte de Compatibilidad) o modo de arranque "Legacy" a modo "UEFI".   

Para acceder al EFI / UEFI, en el siguiente reinicio del ordenador lo más fácil es usar el siguiente comando:

sudo systemctl reboot --firmware-setup


Si quieres gestionar las opciones del Secure Boot sin necesidad de acceder al firmware EFI/UEFI, podemos usar el programa: mokutil, que permite activar y descativar el secure boot, y configuraciones relacionadas con claves de arranque en sistemas Linux.


  Interfaz gráfica de usuario para efibootmgr  


Ahora vamos a usar una interfaz gráfica para efiibootmgr que h
e encontrado en github. (No me hago responsable del uso de este programa, que es totalmente ajeno a este blog. Lo encontré en github, y lo informo aquí por si alguien lo quiere usar)

En Debian GNU/Linux, tenemos que instalar las siguientes dependencias:

sudo apt install efibootmgr python3

No todas las distribuciones instalan pyhton-gobject automáticamente con Python3, pero es necesario para ejecutar este script.

python3 efibootmgr_gui.py
# that should be the same as
./efibootmgr_gui.py

Nota muy importante:
Este programa asume que la Partición del Sistema EFI (ESP) está montada en:  /boot/efi

Sin embargo, puede usar --efi=/dev/sdXX (por ejemplo: sda1) para especificar manualmente su Partición del Sistema EFI (ESP).


Información sacada de github:
https://github.com/Swaphelaer/efibootmgr-gui/tree/master