update-grub
, i det mindste i Debian og dets slægtninge som Ubuntu, er dybest set bare en indpakning omkring grub-mkconfig
. Så den opretter/opdaterer/genererer GRUB-konfigurationen, ikke selve bootloaderen.
Hvad grub-install
faktisk gør, afhænger af, hvilken version af GRUB du kører: traditionel BIOS GRUB eller UEFI GRUB?
Med den traditionelle BIOS GRUB vil grub-install
(om)skrive den del af GRUB, der er indlejret i Master Boot Record, og indkode de fysiske bloknumre på disken, hvorfra den næste del af GRUB skal læses. Den vil også bestemme, fra hvilken partition den egentlige GRUB-konfigurationsfil (/boot/grub/grub.cfg
) skal læses. En vigtig faktor her er /boot/grub/device.map
-filen, som fortæller GRUB, hvordan BIOS’ (og dermed GRUB’s) enhedsnummerering kortlægges til Linux-diskeenheder.
Med UEFI GRUB vil hoveddelen af GRUB bootloaderen være placeret som en fil i EFI System Partition, typisk som /boot/efi/EFI/<name of distribution>/grubx64.efi
eller lignende. Dette bootloader-pathenavn gemmes i system-NVRAM (= det sted, hvor BIOS-indstillingerne gemmes) i UEFI-opstartsvariablerne. Hoveddelen af GRUB kan være helt selvstændig (og skal være det, hvis Secure Boot er i brug!), eller den kan indlæse yderligere funktionalitet som GRUB-moduler, typisk fra mappen /boot/grub
i den Linux-distribution, som den er en del af.
UEFI-opstartsvariablerne identificerer den disk, som systemet skal bruge til at lede efter EFI-systempartitionen og bootloaderfilen i den. Du kan selv se disse variabler ved hjælp af kommandoen efibootmgr -v
. Kommandoen grub-install
opdaterer disse variabler, medmindre du bruger indstillingen --no-nvram
til at angive andet.
Som følge heraf kan du med både traditionel BIOS og UEFI ved at køre grub-install
opdatere din bootloader til at læse en helt anden GRUB-konfigurationsfil på en helt anden disk – selv om detaljerne i denne proces vil være helt forskellige.
Med UEFI kan du faktisk ændre dit valg af boot-enhed inde fra operativsystemet, med enten efibootmgr
eller grub-install
. Men grub-install
er et massivt overkill til det: Hvis begge dine installationer er UEFI og har deres egne separate ESP-partitioner, vil de have deres egne UEFI-opstartsvariabler, og valg mellem dem kan nemt foretages med efibootmgr
, eller faktisk i UEFI BIOS-indstillingerne.
Med traditionel BIOS er det lidt mere rodet: Du skal sørge for, at hver installations /boot/grub/device.map
identificerer disken for den specifikke installation som hd0
, og den anden som hd1
. Brug derefter grub-install
til kun at skrive bootloaderen til hver installations egen disk; aldrig til den “modsatte” disk. På den måde vil begge diske være helt selvstændige og opstartbare, selv hvis den anden disk er helt fjernet. Du kan tilføje et menupunkt i konfigurationsfilerne for hver GRUB, som giver dig mulighed for at starte den “modsatte” installation op, hvis du ønsker det. Eller du kan bare bruge BIOS til at vælge den disk, der skal bootes fra.
Det du skal vide er, at valg af opstartsrækkefølge i traditionelle BIOSer normalt vil fungere ved at gøre den disk, der er valgt til opstart, til den “første” disk for BIOS-funktioner, og derfor vil GRUBs hd0
altid henvise til “den disk, der i øjeblikket er valgt til opstart i BIOS”.
Så hvis du i øjeblikket starter op fra /dev/sda
(så BIOS siger, at sda
er hd0
), og du vil have et GRUB-menupunkt på den disk til at skifte til /dev/sdb
s opstartsmenu, vil du bruge noget som:
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}
… og på samme måde også på /dev/sdb’s GRUB-konfiguration.