
Algunos ejemplos encontrados en línea dicen que update-grub debe ejecutarse DESPUÉS de la instalación de grub. Otros invierten el orden. ¿Cual es correcta?
Si tengo dos instalaciones de Linux (una en sda y otra en sdb), si ejecuto update-grub en la instalación de sda, colocará la instalación de sda en la parte superior del menú de inicio. Si ejecuto update-grub en la instalación de sdb, colocará la instalación de sdb en la parte superior del menú.
Suponiendo que DEFAULT=0, esto debería, en teoría, permitirme seleccionar mi sistema operativo seleccionando el dispositivo de arranque en el BIOS. ¿"grub-install /dev/sda" cambia el menú de inicio de sda para que corresponda al último "update-grub", independientemente de si se ejecutó desde la versión sda o sdb de Linux?
Respuesta1
update-grub
, al menos en Debian y sus parientes como Ubuntu, es básicamente solo un envoltorio grub-mkconfig
. Entonces crea/actualiza/regenera el GRUB.configuración, no el propio gestor de arranque.
Lo que grub-install
realmente hace depende de la versión de GRUB que esté ejecutando: ¿BIOS GRUB tradicional o UEFI GRUB?
Con el BIOS GRUB tradicional, grub-install
(re)escribirá la parte de GRUB incrustada en el Registro de arranque maestro y codificará en él los números de bloque del disco físico desde donde leer la siguiente parte de GRUB. También determinará desde qué partición /boot/grub/grub.cfg
se leerá el archivo de configuración de GRUB real ( ). Un factor importante aquí es el /boot/grub/device.map
archivo, que le dice a GRUB cómo la numeración de dispositivos de BIOS (y por lo tanto de GRUB) se asigna a los dispositivos de disco de Linux.
Con UEFI GRUB, la parte principal del gestor de arranque GRUB se ubicará como un archivo en la partición del sistema EFI, generalmente igual /boot/efi/EFI/<name of distribution>/grubx64.efi
o similar. Este nombre de ruta del cargador de arranque se almacena en la NVRAM del sistema (= el lugar donde se almacena la configuración del BIOS) en las variables de arranque UEFI. La parte principal de GRUB puede ser completamente autónoma (¡y debe serlo si se utiliza el arranque seguro!) o puede cargar funcionalidades adicionales como módulos de GRUB, generalmente desde el /boot/grub
directorio de la distribución de Linux de la que forma parte.
Las variables de arranque UEFI identificarán el disco que el sistema debe usar para buscar la partición del sistema EFI y el archivo del cargador de arranque que contiene. Puede ver estas variables usted mismo mediante efibootmgr -v
el comando. El grub-install
comando actualizará esas variables, a menos que utilice la --no-nvram
opción para especificar lo contrario.
Una vez que GRUB se está ejecutando, lo siguiente que hay que determinar es: ¿desde dónde debería leer su archivo de configuración?
grub-install
tiene la capacidad de insertar el valor deseado de la prefix
variable GRUB directamente en la parte principal de GRUB. Esteprefijo incrustadoPuede especificar completamente la ruta o dejar algunas partes para que se determinen en tiempo de ejecución, utilizando valores predeterminados específicos de la arquitectura.
Con un BIOS GRUB tradicional, el prefijo integrado generalmente deja fuera el especificador de disco real, por lo que se utilizará el mismo disco desde el que se cargó GRUB. En ese caso, el prefijo almacenado será, por ejemplo, (,msdos1)/grub
cuándo
/boot
se encuentra la primera partición primaria en el disco en el que está instalado GRUB.
Con UEFI GRUB, el prefijo integrado generalmente especifica solo el directorio y luego hace referencia al directorio de distribución en la partición del sistema EFI (ESP). Entonces, un prefijo incrustado típico sería /EFI/debian
o /EFI/redhat
o similar. El valor predeterminado para el disco y la partición será "la misma partición desde la que se cargó el binario UEFI GRUB".
Algunas distribuciones como RHEL simplemente colocarán la configuración real de UEFI GRUB directamente en el ESP. Debian y las distribuciones relacionadas generalmente harán un poco más de direccionamiento indirecto: el miniarchivo grub.cfg
en el ESP contendrá solo unas pocas líneas que le indicarán a GRUB que lea el archivo de configuración real de lo que será /boot/grub/grub.cfg
una vez que Linux haya arrancado y montado todos los discos. . En su forma más simple, esta miniconfiguración constará de solo tres líneas:
- Configurar la raíz de GRUB para que apunte al sistema de archivos que contiene el archivo de configuración de GRUB real (para el próximo
configfile
comando), en distribuciones modernas generalmente se usa elsearch
comando y un UUID del sistema de archivos. Las implementaciones más antiguas de este esquema podrían haber utilizado una especificación de partición GRUB fija, por ejemploset root=(hd0,gpt1)
- Configuración de la variable GRUB
prefix
(para habilitar la carga automática del módulo GRUB si el arranque seguro no está vigente). Si el sistema de archivos donde se cargará la configuración es el sistema de archivos raíz de Linux, esta línea seráset prefix=($root)'/boot/grub'
; si/boot
es un sistema de archivos separado, esta línea seráset prefix=($root)'/grub'
- Leyendo el archivo de configuración de GRUB real con
configfile $prefix/grub.cfg
.
Si el sistema de archivos que contiene la configuración de GRUB está en un volumen lógico LVM, un volumen cifrado o un conjunto RAID de software, entonces la primera línea será más compleja o incluso podría haber líneas adicionales según sea necesario.
Como resultado, tanto con BIOS tradicional como con UEFI, la ejecución grub-install
puede actualizar su gestor de arranque para leer un archivo de configuración de GRUB completamente diferente en un disco completamente diferente, aunque los detalles de ese proceso serán completamente diferentes.
Con UEFI, puedes cambiar la selección de tu dispositivo de arranque desde el sistema operativo, con efibootmgr
o grub-install
. Pero grub-install
es una exageración enorme para eso: si ambas instalaciones son UEFI y tienen sus propias particiones ESP separadas, tendrán sus propias variables de arranque UEFI y la selección entre ellas se puede hacer fácilmente con efibootmgr
, o incluso en la configuración del BIOS UEFI.
Con el BIOS tradicional, es un poco más complicado: querrás asegurarte de que cada instalación /boot/grub/device.map
identifique el disco de esa instalación específica como hd0
, y el otro como hd1
. Luego utilícelo grub-install
para escribir únicamente el gestor de arranque en el disco propio de cada instalación; nunca al disco "opuesto". De esa manera, ambos discos serán completamente independientes y podrán arrancar incluso si el otro disco se extrae por completo. Puede agregar un elemento de menú en los archivos de configuración de cada GRUB que le permitirá iniciar la instalación "opuesta", si lo desea. O simplemente puede usar el BIOS para seleccionar el disco desde el que iniciar.
Lo que debe saber es que el selector de orden de inicio de los BIOS tradicionales generalmente funcionará haciendo que el disco seleccionado para iniciar sea el "primer" disco para las funciones del BIOS, por lo que GRUB hd0
siempre se referirá al "disco que está actualmente seleccionado para iniciar en el BIOS". ".
Entonces, si actualmente está iniciando desde ( como /dev/sda
dice el BIOS ) y desea que un elemento del menú GRUB en ese disco cambie al menú de inicio de, usaría algo como:sda
hd0
/dev/sdb
menuentry "Switch to /dev/sdb"
{
# flip the disk mappings and reload configuration
drivemap -s (hd0) (hd1)
set root=<the identifier for sdb's partition that contains grub.cfg>
configfile /boot/grub/grub.cfg # or just /grub/grub.cfg is /boot is a separate partition
}
... y también en la configuración GRUB de /dev/sdb.