
Einige Beispiele im Internet besagen, dass update-grub NACH grub-install ausgeführt werden soll. Andere kehren die Reihenfolge um. Was ist richtig?
Wenn ich zwei Linux-Installationen habe (eine auf SDA und eine auf SDB) und update-grub auf der SDA-Installation ausführe, wird die SDA-Installation ganz oben im Bootmenü platziert. Wenn ich update-grub auf der SDB-Installation ausführe, wird die SDB-Installation ganz oben im Menü platziert.
Unter der Annahme, dass DEFAULT=0 ist, sollte es mir theoretisch möglich sein, mein Betriebssystem auszuwählen, indem ich das Startgerät im BIOS auswähle. Ändert „grub-install /dev/sda“ das SDA-Startmenü so, dass es dem letzten „update-grub“ entspricht, unabhängig davon, ob es von der SDA- oder SDB-Version von Linux ausgeführt wurde?
Antwort1
update-grub
, zumindest in Debian und seinen Verwandten wie Ubuntu, ist im Grunde nur ein Wrapper um grub-mkconfig
. Es erstellt/aktualisiert/regeneriert also den GRUBAufbau, nicht der eigentliche Bootloader selbst.
Was das grub-install
tatsächlich bewirkt, hängt davon ab, welche GRUB-Version Sie ausführen: herkömmliches BIOS-GRUB oder UEFI-GRUB?
Beim herkömmlichen BIOS grub-install
wird GRUB den im Master Boot Record eingebetteten Teil von GRUB (neu) schreiben und darin die physischen Festplattenblocknummern kodieren, von denen der nächste Teil von GRUB gelesen werden soll. Es wird auch bestimmt, von welcher Partition die eigentliche GRUB-Konfigurationsdatei ( /boot/grub/grub.cfg
) gelesen wird. Ein wichtiger Faktor hierbei ist die /boot/grub/device.map
Datei, die GRUB mitteilt, wie die Gerätenummerierung des BIOS (und damit von GRUB) den Linux-Festplattengeräten zugeordnet wird.
Beim UEFI GRUB befindet sich der Hauptteil des GRUB-Bootloaders als Datei in der EFI-Systempartition, normalerweise als /boot/efi/EFI/<name of distribution>/grubx64.efi
oder ähnlich. Dieser Bootloader-Pfadname wird im System-NVRAM (= dem Ort, an dem die BIOS-Einstellungen gespeichert sind) in den UEFI-Bootvariablen gespeichert. Der Hauptteil von GRUB kann vollständig in sich geschlossen sein (und muss es sein, wenn Secure Boot verwendet wird!) oder er kann zusätzliche Funktionen als GRUB-Module laden, normalerweise aus dem /boot/grub
Verzeichnis der Linux-Distribution, zu der er gehört.
Die UEFI-Bootvariablen identifizieren die Festplatte, die das System verwenden soll, um nach der EFI-Systempartition und der darin enthaltenen Bootloaderdatei zu suchen. Sie können diese Variablen mithilfe des efibootmgr -v
Befehls selbst anzeigen. Der grub-install
Befehl aktualisiert diese Variablen, sofern Sie die --no-nvram
Option nicht verwenden, um etwas anderes anzugeben.
Sobald GRUB läuft, muss als Nächstes bestimmt werden: Woher soll es seine Konfigurationsdatei lesen?
grub-install
prefix
hat die Fähigkeit, den gewünschten Wert der GRUB- Variable direkt in den Hauptteil von GRUB einzufügen . Dieseingebettetes PräfixSie können den Pfad entweder vollständig angeben oder einige Teile auslassen, damit sie zur Laufzeit mithilfe architekturspezifischer Standardwerte bestimmt werden.
Bei einem herkömmlichen BIOS-GRUB lässt das eingebettete Präfix normalerweise den tatsächlichen Datenträgerspezifizierer aus, sodass derselbe Datenträger verwendet wird, von dem GRUB geladen wurde. In diesem Fall lautet das gespeicherte Präfix beispielsweise „ (,msdos1)/grub
wann
/boot
ist dies die erste primäre Partition auf dem Datenträger, auf dem GRUB installiert wird?“.
Beim UEFI GRUB gibt das eingebettete Präfix normalerweise nur das Verzeichnis an und verweist dann auf das Verzeichnis der Distribution auf der EFI-Systempartition (ESP). Ein typisches eingebettetes Präfix wäre also /EFI/debian
oder /EFI/redhat
oder ähnlich. Der Standardwert für die Festplatte und Partition ist „dieselbe Partition, von der die UEFI GRUB-Binärdatei geladen wurde“.
Einige Distributionen wie RHEL platzieren die eigentliche Konfiguration für UEFI GRUB direkt auf dem ESP. Debian und verwandte Distributionen machen normalerweise noch einen kleinen Umweg: Die Mini- grub.cfg
Datei auf dem ESP enthält nur ein paar Zeilen, die GRUB anweisen, die echte Konfigurationsdatei zu lesen, die vorhanden sein wird, /boot/grub/grub.cfg
sobald Linux hochgefahren ist und alle Festplatten gemountet hat. In der einfachsten Form besteht diese Mini-Konfiguration nur aus drei Zeilen:
- Einstellen des GRUB-Stammverzeichnisses so, dass es auf das Dateisystem verweist, das die echte GRUB-Konfigurationsdatei (für den nächsten
configfile
Befehl) enthält. In modernen Distributionen wird dazu normalerweise dersearch
Befehl und eine Dateisystem-UUID verwendet. Die ältesten Implementierungen dieses Schemas verwendeten möglicherweise tatsächlich eine feste GRUB-Partitionsspezifikation, z. B.set root=(hd0,gpt1)
- Festlegen der GRUB-
prefix
Variable (um das automatische Laden des GRUB-Moduls zu aktivieren, wenn Secure Boot nicht aktiviert ist). Wenn das Dateisystem, in das die Konfiguration geladen wird, das Linux-Root-Dateisystem ist, lautet diese Zeileset prefix=($root)'/boot/grub'
; wenn/boot
es sich um ein separates Dateisystem handelt, lautet diese Zeileset prefix=($root)'/grub'
- Lesen der eigentlichen GRUB-Konfigurationsdatei mit
configfile $prefix/grub.cfg
.
Wenn sich das Dateisystem, das die GRUB-Konfiguration enthält, auf einem logischen LVM-Volume, einem verschlüsselten Volume oder einem Software-RAID-Set befindet, ist die erste Zeile komplexer oder es können bei Bedarf sogar zusätzliche Zeilen erforderlich sein.
Infolgedessen grub-install
kann sowohl mit dem herkömmlichen BIOS als auch mit UEFI Ihr Bootloader so aktualisiert werden, dass er eine völlig andere GRUB-Konfigurationsdatei auf einer völlig anderen Festplatte liest – die Details dieses Prozesses sind jedoch völlig unterschiedlich.
Mit UEFI können Sie Ihre Startgeräteauswahl tatsächlich direkt im Betriebssystem ändern, entweder mit efibootmgr
oder grub-install
. Das wäre allerdings viel zu viel des Guten: Wenn beide Ihrer Installationen UEFI sind und über eigene ESP-Partitionen verfügen, haben sie ihre eigenen UEFI-Startvariablen und die Auswahl zwischen ihnen kann ganz einfach mit oder in den UEFI-BIOS-Einstellungen grub-install
erfolgen .efibootmgr
Beim herkömmlichen BIOS ist es etwas komplizierter: Sie müssen sicherstellen, dass jede Installation /boot/grub/device.map
die Festplatte dieser bestimmten Installation als hd0
und die andere als identifiziert hd1
. Verwenden Sie dann , grub-install
um den Bootloader nur auf die Festplatte jeder Installation zu schreiben; niemals auf die „entgegengesetzte“ Festplatte. Auf diese Weise sind beide Festplatten vollständig eigenständig und bootfähig, selbst wenn die andere Festplatte vollständig entfernt wird. Sie können den Konfigurationsdateien jedes GRUB ein Menüelement hinzufügen, mit dem Sie die „entgegengesetzte“ Installation booten können, wenn Sie möchten. Oder Sie können einfach das BIOS verwenden, um die Festplatte auszuwählen, von der gebootet werden soll.
Sie müssen wissen, dass die Startreihenfolgeauswahl herkömmlicher BIOS normalerweise so funktioniert, dass die zum Starten ausgewählte Festplatte für die BIOS-Funktionen zur „ersten“ Festplatte gemacht wird. Daher hd0
bezieht sich GRUB immer auf „die Festplatte, die aktuell im BIOS zum Starten ausgewählt ist“.
Wenn Sie also gerade von booten /dev/sda
(das BIOS sagt also sda
) hd0
und Sie möchten, dass ein GRUB-Menüelement auf dieser Festplatte zum /dev/sdb
Boot-Menü von wechselt, würden Sie etwas wie Folgendes 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.