update-grub
, zumindest in Debian und seinen Verwandten wie Ubuntu, ist im Grunde nur ein Wrapper um grub-mkconfig
. Es erstellt/aktualisiert/regeneriert also die GRUB-Konfiguration, nicht den eigentlichen Bootloader selbst.
Was grub-install
tatsächlich tut, hängt davon ab, welche Version von GRUB Sie verwenden: traditionelles BIOS GRUB oder UEFI GRUB?
Beim traditionellen BIOS GRUB wird grub-install
den Teil von GRUB, der im Master Boot Record eingebettet ist, (neu) schreiben und die Nummern der physischen Festplattenblöcke, von denen der nächste Teil von GRUB gelesen werden soll, darin kodieren. Es bestimmt auch, von welcher Partition die eigentliche GRUB-Konfigurationsdatei (/boot/grub/grub.cfg
) gelesen wird. Ein wichtiger Faktor ist hier die /boot/grub/device.map
-Datei, die GRUB mitteilt, wie die Gerätenummerierung des BIOS (und damit auch die von GRUB) auf die Linux-Festplattengeräte abgebildet wird.
Beim UEFI-GRUB befindet sich der Hauptteil des GRUB-Bootloaders als Datei in der EFI-Systempartition, typischerweise als /boot/efi/EFI/<name of distribution>/grubx64.efi
oder ähnlich. Dieser Bootloader-Pfadname wird im System-NVRAM (= der Ort, an dem die BIOS-Einstellungen gespeichert werden) in den UEFI-Boot-Variablen gespeichert. Der Hauptteil von GRUB kann komplett eigenständig sein (und muss es auch sein, wenn Secure Boot verwendet wird!) oder er kann zusätzliche Funktionen als GRUB-Module laden, typischerweise aus dem /boot/grub
-Verzeichnis der Linux-Distribution, zu der er gehört.
Die UEFI-Boot-Variablen identifizieren die Festplatte, die das System verwenden soll, um nach der EFI-Systempartition und der Bootloader-Datei darin zu suchen. Sie können diese Variablen mit dem Befehl efibootmgr -v
selbst einsehen. Der Befehl grub-install
aktualisiert diese Variablen, es sei denn, Sie verwenden die Option --no-nvram
, um etwas anderes zu spezifizieren.
Das Ergebnis ist, dass sowohl bei traditionellem BIOS als auch bei UEFI das Ausführen von grub-install
Ihren Bootloader aktualisieren kann, um eine völlig andere GRUB-Konfigurationsdatei auf einer völlig anderen Festplatte zu lesen – obwohl die Details dieses Prozesses völlig unterschiedlich sein werden.
Bei UEFI können Sie die Auswahl des Bootgeräts tatsächlich vom Betriebssystem aus ändern, entweder mit efibootmgr
oder grub-install
. Aber grub-install
ist dafür ein ziemlicher Overkill: Wenn beide Installationen UEFI sind und ihre eigenen separaten ESP-Partitionen haben, haben sie ihre eigenen UEFI-Boot-Variablen und die Auswahl zwischen ihnen kann einfach mit efibootmgr
oder in den UEFI-BIOS-Einstellungen erfolgen.
Bei einem traditionellen BIOS ist es ein bisschen chaotischer: Sie müssen sicherstellen, dass /boot/grub/device.map
für jede Installation die Festplatte dieser speziellen Installation als hd0
identifiziert und die andere als hd1
. Verwenden Sie dann grub-install
, um den Bootloader nur auf die eigene Festplatte jeder Installation zu schreiben; niemals auf die „andere“ Festplatte. Auf diese Weise sind beide Festplatten völlig eigenständig und bootfähig, selbst wenn die andere Festplatte komplett entfernt wird. Sie können in den Konfigurationsdateien jedes GRUB einen Menüpunkt hinzufügen, der es Ihnen ermöglicht, die „gegenüberliegende“ Installation zu booten, wenn Sie möchten. Oder Sie können einfach das BIOS verwenden, um die Platte auszuwählen, von der gebootet werden soll.
Das, was Sie wissen müssen, ist, dass der Boot-Reihenfolge-Selektor traditioneller BIOSe in der Regel so funktioniert, dass die Platte, die zum Booten ausgewählt wurde, die „erste“ Platte für BIOS-Funktionen ist, so dass sich GRUB’s hd0
immer auf „die Platte bezieht, die aktuell im BIOS zum Booten ausgewählt ist“.
Wenn Sie also gerade von /dev/sda
booten (BIOS sagt also, dass sda
hd0
ist) und Sie möchten, dass ein GRUB-Menüpunkt auf dieser Platte zum Boot-Menü von /dev/sdb
wechselt, würden Sie etwas wie folgt verwenden:
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}
… und das Gleiche gilt auch für die GRUB-Konfiguration von /dev/sdb.