GRUB (Grand Unified Bootloader) besteht wie LILO aus zwei Stufen. Die erste Stufe (stage1) besteht aus 512 Byte und wird in den MBR oder den Bootsektor einer Plattenpartition oder Diskette geschrieben. Die zweite, größere Stufe (stage 2) wird im Anschluss daran geladen und enthält den eigentlichen Programmcode. Einzige Aufgabe der ersten Stufe ist bei GRUB, die zweite Stufe des Bootloaders zu laden.
Ab diesem Punkt unterscheidet sich GRUB von LILO. stage2 kann auf Dateisysteme zugreifen. Derzeit werden Ext2, Ext3, ReiserFS, JFS, XFS, Minix und das von Windows verwendete DOS FAT FS unterstützt. GRUB kann noch vor dem Booten auf Dateisysteme unterstützter BIOS-Disk-Devices (Diskette oder vom BIOS erkannte Festplatten) zugreifen, weshalb Änderungen an der GRUB-Konfigurationsdatei keine Neuinstallation des Bootmanagers mehr bedeuten. Beim Booten liest GRUB die Menüdatei samt der aktuellen Pfade und Partitionsangaben zu Kernel oder initialer Ramdisk (initrd) neu ein und findet diese Dateien selbständig.
GRUB hat den großen Vorteil, dass alle Bootparameter vor dem Booten bequem geändert werden können. Wurde zum Beispiel beim Editieren der Menüdatei ein Fehler gemacht, kann er auf diese Weise „ausgewetzt“ werden. Darüber hinaus können Boot-Kommandos interaktiv über eine Art von Eingabeaufforderung eingegeben werden. GRUB bietet die Möglichkeit, noch vor dem Booten die Lage von Kernel und initrd festzustellen. So booten Sie Betriebssysteme, die noch keinen Eintrag im Bootmenü haben.
Hinter dem grafischen Splash-Screen mit dem Bootmenü steht die GRUB-Konfigurationsdatei /boot/grub/menu.lst, die alle Informationen zu allen Partitionen oder Betriebssystemen enthält, die mit Hilfe des Menüs gebootet werden können.
GRUB liest bei jedem Systemstart die Menüdatei vom Dateisystem neu ein. Es besteht also kein Bedarf, GRUB nach jeder erfolgten Änderung an der Datei zu aktualisieren — verwenden Sie einfach YaST oder Ihren favorisierten Editor.
Die Menüdatei enthält Befehle. Die Syntax ist sehr einfach. Jede Zeile enthält einen Befehl, gefolgt von optionalen Parametern, die wie bei der Shell durch Leerzeichen getrennt werden. Einige Befehle erlauben aus historischen Gründen ein Gleichheitszeichen vor dem ersten Parameter. Kommentare werden durch einen Hash (#) eingeleitet.
Zur Erkennung der Menüeinträge in der Menü-Übersicht, müssen Sie für jeden Eintrag einen Namen oder einen title vergeben. Der nach dem Schlüsselwort title stehende Text wird inklusive Leerzeichen im Menü als selektierbare Option angezeigt. Alle Befehle bis zum nächsten title werden nach Auswahl dieses Menüeintrages ausgeführt.
Einfachster Fall ist das Verzweigen zu Bootloadern anderer Betriebssysteme. Der Befehl lautet chainloader und das Argument ist normalerweise der Boot-Block einer anderen Partition in GRUBs Block-Notation, zum Beispiel:
chainloader (hd0,3)+1
Die Devicenamen unter GRUB werden in Abschnitt 7.4.1.1. “Namenskonventionen für Festplatten und Partitionen” erklärt. Obiges Beispiel spezifiziert den ersten Block der vierten Partition auf der ersten Festplatte.
Mit dem Kommando kernel wird ein Kernel-Image spezifiziert. Das erste Argument ist der Pfad zum Kernel-Image auf einer Partition. Die restlichen Argumente werden dem Kernel auf der Kommandozeile übergeben.
Wenn der Kernel nicht die erforderlichen Treiber für den Zugriff auf die root-Partition einkompiliert hat, dann muss initrd angegeben werden. Hierbei handelt es sich um einen separaten GRUB-Befehl, der den Pfad zur initrd-Datei als einziges Argument hat. Da die Ladeadresse der initrd in das bereits geladene Kernel-Image geschrieben wird, muss der Befehl initrd auf den kernel-Befehl folgen.
Der Befehl root vereinfacht die Spezifikation der Kernel- und initrd-Dateien. root hat als einziges Argument entweder ein GRUB-Device oder eine Partition auf einem solchen. Allen Kernel-, initrd- oder anderen Dateipfaden, bei denen nicht explizit ein Device angegeben ist, wird bis zum nächsten root-Befehl das Device vorangestellt. In einer menu.lst-Datei, die während der Installation generiert wurde, kommt dieser Befehl nicht vor. Er dient der Vereinfachung beim händischen Editieren.
Am Ende jeden Menü-Eintrags steht implizit das boot-Kommando, so dass dieses nicht in die Menüdatei geschrieben werden muss. Sollten Sie jedoch in die Situation kommen, GRUB interaktiv zum Booten zu benutzen, müssen Sie am Ende das boot-Kommando eingeben. boot hat keine Argumente, es führt lediglich das geladene Kernel-Image oder den angegebenen Chain Loader aus.
Wenn Sie alle Menü-Einträge geschrieben haben, müssen Sie einen Eintrag als default festlegen. Andernfalls wird der erste (Eintrag 0) verwendet. Sie haben auch die Möglichkeit, einen Timeout in Sekunden anzugeben, nach dem dies geschehen soll. timeout und default werden üblicherweise vor die Menüeinträge geschrieben. Eine Beispieldatei samt Erläuterung finden Sie im Abschnitt 7.4.1.2. “Beispiel einer Menü-Datei”.
GRUB verwendet für die Bezeichnung von Festplatten und Partitionen andere Konventionen, als Sie es von den normalen Linux-Devices (z.B. /dev/hda1) her gewohnt sind. Die erste Festplatte wird immer hd0 genannt, das Diskettenlaufwerk fd0.
![]() | Partitionzählung in GRUB |
|---|---|
Die Zählung der Partitionen in GRUB beginnt bei Null. (hd0,0) entspricht der ersten Partition auf der ersten Festplatte; in einem gewöhnlichen Desktop-Rechner mit einer Platte als Primary Master angeschlossen lautet der Device-Name /dev/hda1. | |
Die vier möglichen primären Partitionen belegen die Partitionsnummern 0 bis 3. Ab 4 werden die logischen Partitionen hochgezählt:
(hd0,0) erste primäre Partition auf der ersten Festplatte (hd0,1) zweite primäre Partition (hd0,2) dritte primäre Partition (hd0,3) vierte primäre (und meist die erweiterte) Partition (hd0,4) erste logische Partition (hd0,5) zweite logische Partition ...
![]() | IDE, SCSI oder RAID |
|---|---|
GRUB unterscheidet nicht zwischen IDE-, SCSI- oder RAID-Devices. Alle Festplatten, die vom BIOS oder weiteren Controllern erkannt werden, werden der im BIOS voreingestellten Bootreihenfolge entsprechend durchgezählt. | |
Das Problem, dass Linux-Device-Namen nicht eindeutig zu BIOS-Device-Namen zugeordnet werden können, besteht für sowohl LILO als auch GRUB. Beide benutzen vergleichbare Algorithmen, um diese Zuordnung zu generieren. Jedoch speichert GRUB diese Zuordnung in einer Datei (device.map) ab, die bearbeitet werden kann. Mehr Informationen zur Datei device.map finden Sie im Abschnitt 7.4.2. “Die Datei device.map”.
Ein kompletter GRUB-Pfad besteht aus einem Device-Namen, der in Klammern geschrieben wird sowie dem Pfad der Datei in dem Dateisystem auf der angegebenen Partition. Der Pfad wird durch einen Slash eingeleitet. Als Beispiel, auf einem System mit einer einzelnen IDE-Festplatte und Linux auf der ersten Partition, könnte der bootbare Kernel wie folgt aussehen:
(hd0,0)/boot/vmlinuz
Zum besseren Verständnis des Aufbaus einer GRUB-Menüdatei stellen wir ein kurzes Beispiel vor. Diese Beispiel-Installation beinhaltet eine Linux-Bootpartition unter /dev/hda5, eine Root-Partition unter /dev/hda7 und eine Windows-Installation unter /dev/hda1.
gfxmenu (hd0,4)/message color white/blue black/light-gray default 0 timeout 8 title linux kernel (hd0,4)/vmlinuz root=/dev/hda7 vga=791 initrd (hd0,4)/initrd title windows chainloader(hd0,0)+1 title floppy chainloader(fd0)+1 title failsafe kernel (hd0,4)/vmlinuz.shipped root=/dev/hda7 ide=nodma \ apm=off acpi=off vga=normal nosmp maxcpus=0 3 initrd (hd0,4)/initrd.shipped
Der erste Block behandelt die Konfiguration des Splash-Screens:
Das Hintergrundbild liegt auf /dev/hda5 und trägt den Namen message
Das Farbschema: weiss (Vordergrund), blau (Hintergrund), schwarz (Auswahl) und hellgrau (Hintergrund der Auswahl). Das Farbschema wirkt sich nicht auf den Splashscreen aus, sondern erst, wenn Sie diesen mit Esc verlassen.
Der erste Menüeintrag mit title linux soll standardmäßig gebootet werden.
Nach acht Sekunden ohne Benutzerfeedback bootet GRUB automatisch durch.
Der zweite und größte Block listet die verschiedenen bootbaren Betriebssysteme auf.
Der erste Eintrag (title linux) ist für das Booten von SUSE LINUX zuständig. Der Kernel (vmlinuz) liegt auf der ersten Festplatte in den ersten logischen Partition (hier der Bootpartition). Kernelparameter wie zum Beispiel die Angabe der Rootpartition, des VGA-Modus etc. werden hier angehängt. Die Angabe der Rootpartition erfolgt nach dem Linux-Schema (/dev/hda7/) da diese Information für den Kernel bestimmt ist und nichts mit GRUB zu tun hat. Die initrd liegt ebenfalls in der ersten logischen Partition der ersten Festplatte.
Der zweite Eintrag ist für das Laden von Windows zuständig. Windows wird von der ersten Partition der ersten Festplatte aus gestartet (hd0,0). Mittels chainloader +1 wird das Auslesen und Ausführen des ersten Sektors der angegebenen Partition gesteuert.
Der nächste Abschnitt dient dazu, das Booten von Diskette zu ermöglichen, ohne dass dazu das BIOS umgestellt werden müsste.
Die Bootoption failsafe dient dazu, Linux mit einer bestimmten Auswahl an Kernelparametern zu starten, die selbst auf problematischen Systemen ein Hochfahren von Linux ermöglichen.
Die Menüdatei kann jederzeit geändert werden und wird von GRUB automatisch beim nächsten Booten übernommen. Sie können diese Datei mit dem Editor Ihrer Wahl oder mit YaST permanent editieren. Alternativ können Sie temporäre Änderungen interaktiv über die Edit-Funktion von GRUB vornehmen.
![]() | Festplattenreihenfolge tauschen |
|---|---|
Manche Betriebssysteme (z.B. Windows) können nur von der ersten Festplatte starten. Wenn Sie ein solches Betriebssystem auf einer anderen als der ersten Festplatte installiert haben, können Sie beim entsprechenden Menüeintrag einen logischen Tausch veranlassen. Dies funktioniert allerdings nur, wenn das Betriebssystem beim Start über das BIOS auf die Festplatten zugreift. ... title windows map (hd0) (hd1) map (hd1) (hd0) chainloader(hd1,0)+1 ... Hier soll Windows von der zweiten Festplatte gestartet werden. Dazu wird die logische Reihenfolge der Festplatten mit map getauscht. Beachten Sie dabei jedoch, dass sich durch den Tausch die Logik innerhalb der GRUB-Menüdatei nicht ändert. Nach wie vor müssen Sie bei chainloader die zweite Festplatte angeben. | |
Aus dem grafischen Bootmenü von GRUB können Sie mittels der Cursortasten auswählen, welches der verfügbaren Betriebssysteme gestartet werden soll. Wählen Sie ein Linux-System, können Sie am Bootprompt – wie auch von LILO gewohnt – eigene Bootparameter einfügen. GRUB geht noch über dieses Konzept hinaus. Drücken Sie Esc und verlassen Sie den Splash-Screen, können Sie nach der Eingabe von e (edit) einzelne Menü-Einträge gezielt direkt editieren. Änderungen, die Sie auf diese Weise vornehmen, gelten nur für diesen einen Bootvorgang und werden nicht dauerhaft übernommen.
![]() | Tastaturbelegung während des Bootens |
|---|---|
Bitte beachten Sie, dass beim Booten nur die amerikanische Tastaturbelegung verfügbar ist. Achten Sie auf die vertauschten Sonderzeichen. | |
Nach Aktivieren des Editiermodus wählen Sie mittels der Cursortasten den Menü-Eintrag, dessen Konfiguration Sie verändern wollen. Um die Konfiguration editierbar zu machen, geben Sie ein weiteres Mal e ein. So korrigieren Sie falsche Partitions- oder Pfadangaben, bevor diese sich negativ auf den Bootprozess auswirken. Mit Enter verlassen Sie den Editiermodus, kehren ins Menü zurück und booten diesen Eintrag mit b. Im Hilfetext am unteren Rand werden weitere Handlungsmöglichkeiten angezeigt.
Möchten Sie geänderte Bootoptionen dauerhaft eintragen, öffnen Sie als Benutzer root die Datei menu.lst und hängen die zusätzlichen Kernelparameter durch ein Leerzeichen getrennt an die bestehende Zeile an:
title linux kernel (hd0,0)/vmlinuz root=/dev/hda3 <zusätzlicher parameter> initrd (hd0,0)/initrd
GRUB übernimmt den neuen Parameter beim nächsten Booten automatisch. Alternativ können Sie für diese Änderung auf das YaST-Bootloadermodul aufrufen. Auch hier wird der neue Parameter lediglich durch ein Leerzeichen getrennt an die bestehende Zeile angehängt.
Die schon erwähnte Datei device.map enthält die Zuordnungen von GRUB-Devicenamen und Linux-Devicenamen. Sollten Sie ein Mischsystem aus IDE- und SCSI-Festplatten vorliegen haben, muss GRUB anhand eines bestimmten Verfahrens versuchen, die Bootreihenfolge zu ermitteln. Die BIOS-Informationen zur Bootreihenfolge sind GRUB nicht zugänglich. Das Ergebnis dieser Überprüfung speichert GRUB unter /boot/grub/device.map ab. Eine Beispieldatei device.map für ein Beispielsystem – angenommen wird eine im BIOS eingestellte Bootreihenfolge von IDE vor SCSI – sieht so aus:
(fd0) /dev/fd0 (hd0) /dev/hda (hd1) /dev/hdb (hd2) /dev/sda (hd3) /dev/sdb
Da die Reihenfolge von IDE, SCSI und anderen Festplatten abhängig von verschiedenen Faktoren ist und Linux die Zuordnung nicht erkennen kann, besteht die Möglichkeit, die Reihenfolge in der device.map manuell festzulegen. Sollten Sie Probleme beim Booten haben, kontrollieren Sie, ob die Reihenfolge in dieser Datei der BIOS-Reihenfolge entspricht und ändern Sie sie notfalls mithilfe der GRUB-Shell (siehe Abschnitt 7.4.3.1. “Die GRUB-Shell”) ab. Ist das Linux-System erst gebootet, können Sie die device.map mithilfe des YaST Bootloader-Moduls oder eines Editors Ihrer Wahl dauerhaft abändern.
Nach manuellen Änderungen der device.map Datei, rufen Sie den folgenden Befehl auf, um GRUB neu zu installieren:
grub --batch --device-map=/boot/grub/device.map < /etc/grub.conf
Die dritte wichtige Konfigurationsdatei von GRUB neben menu.lst und device.map ist /etc/grub.conf. Hier werden die Parameter und Optionen aufgeführt, die der Befehl grub benötigt, um den Bootloader korrekt zu installieren:
root (hd0,4) install /grub/stage1 d (hd0) /grub/stage2 0x8000 (hd0,4)/grub/menu.lst quit
Die Bedeutung der einzelnen Einträge im Detail:
Mit diesem Befehl wird GRUB angewiesen, sich bei den folgenden Befehlen auf die erste logische Partition der ersten Festplatte zu beziehen, auf denen er seine Bootdateien findet.
Der Befehl grub soll mit dem install-Parameter gestartet werden. stage1 als erste Stufe des Bootloaders soll in den MBR der ersten Festplatte installiert werden (/grub/stage1 d (hd0)). stage2 soll in die Speicheradresse 0x8000 geladen werden (/grub/stage2 0x8000). Der letzte Eintrag (hd0,4)/grub/menu.lst weist grub an, wo die Menüdatei zu finden ist.
GRUB existiert in zwei Versionen. Einmal als Bootloader und einmal als normales Linux-Programm unter /usr/sbin/grub. Dieses Programm wird als GRUB-Shell bezeichnet. Die Funktionalität, GRUB als Bootloader auf eine Festplatte oder Diskette zu installieren, ist direkt in GRUB integriert in Form der Kommandos install oder setup. Damit ist sie in der GRUB-Shell verfügbar, wenn Linux geladen ist. Diese Befehle sind aber auch schon während des Bootvorgangs verfügbar, ohne dass Linux dazu laufen müsste. Dadurch vereinfacht sich die Rettung eines defekten Systems.
Nur wenn die GRUB-Shell als Linux-Programm läuft (aufzurufen mit grub wie beispielsweise unter Abschnitt 7.4.2. “Die Datei device.map” beschrieben), kommt der Zuordnungsalgorithmus von GRUB-Device und Linux-Device-Namen ins Spiel. Das Programm liest hierzu die Datei device.map. Mehr dazu im Abschnitt 7.4.2. “Die Datei device.map”.
GRUB unterstützt schon zum Bootzeitpunkt den Zugriff auf Dateisysteme, das heisst es können auch solche Dateien Ihres Linux-Systems eingesehen werden, zu denen Benutzer ohne Root-Rechte im einmal gestarteten System keinen Zugriff hätten. Durch Vergabe eines Passworts verhindern Sie solche Zugriffe. Einerseits können Sie lediglich den Dateisystemzugriff zur Bootzeit für Unbefugte sperren oder auch das Ausführen bestimmter Betriebsysteme für die Benutzer sperren.
Zur Vergabe eines Boot-Passworts gehen Sie als Benutzer root folgendermaßen vor:
Geben Sie am Rootprompt grub ein.
Verschlüsseln Sie in der GRUB-Shell das Passwort:
grub> md5crypt Password: **** Encrypted: $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
Fügen Sie den verschlüsselten Wert in den globalen Abschnitt der Datei menu.lst ein:
gfxmenu (hd0,4)/message color white/blue black/light-gray default 0 timeout 8 password --md5 $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
Nun ist das Ausführen von GRUB-Befehlen am Bootprompt geschützt. Erst nach Eingabe von p und des Passworts wird diese Möglichkeit wieder freigegeben. Das Starten eines Betriebssystems aus dem Bootmenü heraus ist weiterhin für alle Benutzer möglich.
Um zusätzlich das Starten einer oder mehrerer Betriebssysteme aus dem Bootmenü zu verhindern, ergänzen Sie in der Datei menu.lst den Eintrag lock für jeden Abschnitt, der nicht ohne Passworteingabe starten soll. Im Beispiel sähe dies so aus:
title linux kernel (hd0,4)/vmlinuz root=/dev/hda7 vga=791 initrd (hd0,4)/initrd lock
Nach einem Reboot des Systems und der Auswahl des Linux-Eintrags im Bootmenü erscheint zunächst folgende Fehlermeldung:
Error 32: Must be authenticated
Drücken Sie Enter, um ins Menü zu gelangen und anschließend p, um einen Prompt für das Passwort zu erhalten. Nach Eingabe des Passworts und Enter bootet das gewünschte Betriebssystem (in diesem Fall Linux).
![]() | Bootpasswort und Splashscreen |
|---|---|
Verwenden Sie ein Bootpasswort für GRUB, steht Ihnen der gewohnte Splashscreen nicht zur Verfügung. | |
![]() | Bootprobleme mit GRUB |
|---|---|
GRUB überprüft die Geometrie der angeschlossenen Festplatten erst beim Booten. In seltenen Fällen macht das BIOS hier inkonsistente Angaben, so dass GRUB einen GRUB Geom Error meldet (siehe hierzu http://portal.suse.com/sdb/de/2003/02/fhassel_geom-error.html). In solchen Fällen verwenden Sie LILO oder aktualisieren ggf. das BIOS. Detaillierte Informationen zur Installation, Konfiguration und Wartung von LILO finden Sie in der Support-Datenbank http://portal.suse.de/sdb/de/2004/01/lilo_overview.html. | |
Auf der Webseite http://www.gnu.org/software/grub/ finden Sie ausführliche Informationen zu GRUB in den Sprachen Deutsch und Englisch. Das Online-Handbuch existiert allerdings nur in Englisch.
Wenn texinfo auf dem Rechner installiert ist, können Sie sich in der Shell mit info grub die Info-Seiten zu GRUB anzeigen lassen. Suchen Sie auch in der Support-Datenbank http://portal.suse.de/sdb/de/index.html nach dem Stichwort GRUB, um Informationen zu speziellen Themen zu erhalten.