7.4. Booten mit GRUB

GRUB (engl. Grand Unified Bootloader) besteht 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.

stage2 kann auf Dateisysteme zugreifen. Derzeit werden Ext2, Ext3, ReiserFS, Minix und das von Windows verwendete DOS FAT FS unterstützt. Mit Einschränkungen werden JFS, XFS und auch das von BSD-Systemen verwendete UFS/FFS unterstützt. Seit der Version 0.95 ist GRUB auch in der Lage, gemäß der „El Torito“-Spezifikation von einer CD oder DVD mit einem Standarddateisystem nach ISO 9660 zu booten. GRUB kann noch vor dem Booten auf Dateisysteme unterstützter BIOS-Disk-Devices (Diskette oder vom BIOS erkannte Festplatten, CD- oder DVD-Laufwerke) zugreifen, weshalb Änderungen an der GRUB-Konfigurationsdatei (menu.lst) 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.

Zur eigentlichen Konfiguration von GRUB werden drei Dateien benötigt, auf die in den folgenden Abschnitten näher eingegangen wird:

/boot/grub/menu.lst

Diese Datei enthält alle Angaben zu Partitionen oder Betriebsystemen, die mit Hilfe von GRUB bootbar sind. Ohne diese Angaben ist die Übergabe der Systemkontrolle an das Betriebssystem nicht möglich.

/boot/grub/device.map

Diese Datei „übersetzt“ die Gerätenamen von der GRUB/BIOS-Notation in die Linux-Gerätenamen.

/etc/grub.conf

In dieser Datei werden die Parameter und Optionen aufgeführt, die die GRUB-Shell benötigt, um den Bootloader korrekt zu installieren.

GRUB lässt sich auf verschiedene Art steuern. Booteinträge aus einer bereits existierenden Konfiguration werden über das grafische Menü (Splashscreen) ausgewählt. Die Konfiguration wird unverändert aus der Datei menu.lst ausgelesen.

Alle Bootparameter können bei GRUB vor dem Booten geändert werden. Wurde zum Beispiel beim Editieren der Menüdatei ein Fehler gemacht, kann er auf diese Weise umgangen werden. Darüber hinaus können Boot-Kommandos interaktiv über eine Art von Eingabeaufforderung eingegeben werden (siehe Abschnitt 7.4.1.3. “Ändern von Menü-Einträgen während des Bootvorgangs”). GRUB bietet die Möglichkeit, noch vor dem Booten die Lage von Kernel und initrd festzustellen. So booten Sie gegebenenfalls ein zusätzlich installiertes Betriebssystem, für das Sie noch keinen Eintrag in die Bootloaderkonfiguration eingefügt haben.

Schließlich existiert mit der GRUB-Shell eine Emulation von GRUB im installierten System. Die GRUB-Shell können Sie nutzen, um GRUB zu installieren oder um neue Einstellungen zu testen, bevor Sie sie einsetzen (siehe Abschnitt 7.4.4. “Die GRUB-Shell”).

7.4.1. Das GRUB-Bootmenü

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 neu zu installieren. Für Änderungen der GRUB Konfigurationen können Sie das YaST Bootloader-Modul verwenden (siehe Abschnitt 7.5. “Bootloader-Konfiguration mit YaST”).

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 manuellen 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”.

7.4.1.1. Namenskonventionen für Festplatten und Partitionen

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.

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
...

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.

GRUB hat das Problem, dass Linux-Device-Namen nicht eindeutig zu BIOS-Device-Namen zugeordnet werden können. Er generiert diese Zuordnung mit Hilfe eines bestimmten Algorithmus und speichert diese in der 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 Eintrag für den bootbaren Kernel wie folgt aussehen:

(hd0,0)/boot/vmlinuz

7.4.1.2. Beispiel einer Menü-Datei

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:

gfxmenu (hd0,4)/message

Das Hintergrundbild liegt auf /dev/hda5 und trägt den Namen message

color white/blue black/light-gray

Das Farbschema: weiß (Vordergrund), blau (Hintergrund), schwarz (Auswahl) und hellgrau (Hintergrund der Auswahl). Das Farbschema wirkt sich nicht auf den Splashscreen aus, sondern erst auf das änderbare GRUB-Menü, in das Sie gelangen, wenn Sie den Splashscreen mit Esc verlassen.

default 0

Der erste Menüeintrag mit title linux soll standardmäßig gebootet werden.

timeout 8

Nach acht Sekunden ohne Benutzerfeedback bootet GRUB automatisch durch.

Der zweite und größte Block listet die verschiedenen bootbaren Betriebssysteme auf; die Abschnitte für die einzelnen Betriebssysteme werden jeweils mit title eingeleitet.

  • 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 YaST oder einem Editor Ihrer Wahl permanent editieren. Alternativ können Sie temporäre Änderungen interaktiv über die Edit-Funktion von GRUB vornehmen (siehe Abschnitt 7.4.1.3. “Ändern von Menü-Einträgen während des Bootvorgangs”).

7.4.1.3. Ändern von Menü-Einträgen während des Bootvorgangs

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 eigene Bootparameter einfügen. 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.

[Important]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 und an den Kernel weiterreichen, ö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.

7.4.2. Die Datei device.map

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/sda

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 temporär mithilfe der GRUB-Shell (siehe Abschnitt 7.4.4. “Die GRUB-Shell”) beim Booten 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. Hierbei wird die device.map neu eingelesen und die in grub.conf enthaltenen Befehle ausgeführt:

grub --batch < /etc/grub.conf
  

7.4.3. Die Datei /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:

root (hd0,4)

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.

install parameter

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.

7.4.4. Die GRUB-Shell

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.

Die setup- und install-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 (nicht mehr bootbaren) Systems, da die fehlerhafte Konfigurationsdatei des Bootloaders durch die manuelle Parametereingabe zu umgehen ist. Die manuelle Angabe von Parametern zum Bootzeitpunkt eignet sich außerdem zum Testen neuer Einstellungen, wenn das native System nicht beeinträchtigt werden soll. Geben Sie einfach den experimentellen Konfigurationsbefehl mit ähnlicher Syntax wie in menu.lst ein; testen Sie die Funktionalität dieses Eintrags, ohne die bestehende Konfigurationsdatei zu ändern und damit die Bootbarkeit des Systems zu beeinträchtigen. Wenn Sie beispielsweise einen neuen Kernel testen wollen, übergeben Sie den kernel-Befehl samt Pfadangabe zum alternativen Kernel. Schlägt der Bootvorgang fehl, greifen Sie beim nächsten Booten einfach auf die weiterhin intakte menu.lst zurück. Damit eignet sich die Kommandozeilenschnittstelle umgekehrt natürlich auch, um bei einer fehlerhaften menu.lst das System durch Eingabe der korrigierten Parameter an der Kommandozeile trotzdem zu booten. Im laufenden System tragen Sie diese Parameter nun wieder in Ihre menu.lst ein. Damit ist das System wieder dauerhaft bootbar.

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”.

7.4.5. Bootpasswort setzen

GRUB unterstützt schon zum Bootzeitpunkt den Zugriff auf Dateisysteme, das heißt, 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).

[Important]Bootpasswort und Splashscreen

Verwenden Sie ein Bootpasswort für GRUB, steht Ihnen der gewohnte Splashscreen nicht zur Verfügung.


SUSE LINUX 9.2