GRUB
Getestet mit openSUSE | Empfohlene Artikel | Verwandte Artikel | |||
|
Inhaltsverzeichnis
Funktion
GRUB wurde innerhalb des GNU-Hurd-Projektes entwickelt. Wie der Bootmanager LILO besteht auch GRUB im wesentlichen aus zwei Stufen: eine erste Stufe (512 Byte groß), die in den MBR oder den Bootsektor einer Partition geschrieben wird, und eine größere zweite Stufe (stage2), die im Anschluss geladen wird und den eigentlichen Programmcode enthält.
In einigen Konfigurationen gibt es eine zusätzliche Zwischenstufe 1.5, die die Stufe 2 auf einem geeigneten Dateisystem lokalisiert und lädt. Wenn diese Methode zur Verfügung steht, wird sie bei der Installation oder bei der anfänglichen Einrichtung von GRUB mit YaST standardmäßig gewählt.
stage2 kann auf zahlreiche Dateisysteme zugreifen. Derzeit werden Ext2, Ext3, ReiserFS, Minix und das von Windows verwendete DOS FAT-Dateisystem unterstützt. Bis zu einem gewissen Grad werden auch die von BSD-Systemen verwendeten , XFS, UFS und FFS unterstützt. Seit Version 0.95 kann GRUB auch von einer CD oder DVD booten, die das ISO 9660-Standarddateisystem nach der „El Torito“-Spezifikation enthält. GRUB kann noch vor dem Booten auf Dateisysteme unterstützter BIOS-Datenträgerlaufwerke (vom BIOS erkannte Disketten-, Festplatten-, CD- oder DVD-Laufwerke) zugreifen. Daher ist keine Neuinstallation des Bootmanagers nötig, wenn die Konfigurationsdatei von GRUB (menu.lst) geändert wird. Beim Booten des Systems liest GRUB die Menüdatei sowie die aktuellen Pfade und Partitionsdaten zum Kernel oder zur Initial RAM-Disk (initrd) neu ein und findet diese Dateien selbstständig.
Die eigentliche Konfiguration von GRUB basiert auf den im Folgenden beschriebenen drei Dateien:
- /boot/grub/menu.lst
Diese Datei enthält alle Informationen zu Partitionen oder Betriebssystemen, die mit GRUB gebootet werden können. Wenn diese Angaben nicht zur Verfügung stehen, muss der Benutzer in der GRUB-Kommandozeile das weitere Vorgehen angeben. - /boot/grub/device.map
Diese Datei übersetzt Gerätenamen aus der GRUB- und BIOS-Notation in Linux-Gerätenamen. - /etc/grub.conf
Diese Datei enthält die Befehle, Parameter und Optionen, die die GRUB-Shell für das ordnungsgemäße Installieren des Bootloaders benötigt.
GRUB kann auf mehrere Weisen gesteuert werden. Booteinträge aus einer vorhandenen Konfiguration können im grafischen Menü (Eröffnungsbildschirm) ausgewählt werden. Die Konfiguration wird aus der Datei 'menu.lst' geladen.
In GRUB können alle Bootparameter vor dem Booten geändert werden. Auf diese Weise können beispielsweise Fehler behoben werden, die beim Bearbeiten der Menüdatei aufgetreten sind. Außerdem können Bootbefehle über eine Art Eingabeaufforderung interaktiv eingegeben werden. &GRUB bietet die Möglichkeit, noch vor dem Booten die Position des Kernels und die Position von initrd zu ermitteln. Auf diese Weise können Sie auch ein installiertes Betriebssystem booten, für das in der Konfiguration des Bootloaders noch kein Eintrag vorhanden ist.
GRUB ist in zwei Versionen vorhanden: als Bootloader und als normales Linux-Programm in '/usr/sbin/grub'. Dieses Programm wird als GRUB-Shell bezeichnet. Es stellt auf dem installierten System eine Emulation von GRUB bereit, die zum Installieren von GRUB oder zum Testen neuer Einstellungen verwendet werden kann. Die Funktionalität, GRUB als Bootloader auf einer Festplatte oder Diskette zu installieren, ist in Form der Befehle install und setup in GRUB integriert. Diese Befehle sind in der GRUB-Shell verfügbar, wenn Linux geladen ist.
Das GRUB-Bootmenü
Der grafische Eröffnungsbildschirm mit dem Bootmenü basiert auf der GRUB-Konfigurationsdatei '/boot/grub/menu.lst', die alle Informationen zu allen Partitionen oder Betriebssystemen enthält, die über das Menü gebootet werden können.
Bei jedem Systemstart liest GRUB die Menüdatei vom Dateisystem neu ein. Es besteht also kein Bedarf, GRUB nach jeder Änderung an der Datei neu zu installieren. Mit dem YaST-Modul Konfiguration des Bootloaders können sie die GRUB-Konfiguration ändern.
Die Syntax ist recht 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 ein Rautezeichen (#) 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 auswählbare Option angezeigt. Alle Befehle bis zum nächsten title werden nach Auswahl dieses Menüeintrags ausgeführt.
Der einfachste Fall ist die Umleitung zu Bootloadern anderer Betriebssysteme. Der Befehl lautet chainloader und das Argument ist normalerweise der Bootblock einer anderen Partition in der Blocknotation von GRUB. Beispiel:
chainloader (hd0,3)+1
Dieses Beispiel spezifiziert den ersten Block der vierten Partition auf der ersten Festplatte. Mit dem Befehl Kernel wird ein Kernel-Image angegeben. Das erste Argument ist der Pfad zum Kernel-Image auf einer Partition. Die restlichen Argumente werden dem Kernel in seiner Kommandozeile übergeben.
Wenn der Kernel nicht über die erforderlichen Treiber für den Zugriff auf die root-Partition verfügt oder ein aktuelles Linux-System mit erweiterten Hotplug-Funktionen verwendet wird, muss initrd mit einem separaten GRUB-Befehl angegeben werden, dessen einziges Argument der Pfad zur Datei initrd ist. Da die Ladeadresse von initrd in das geladene Kernel-Image geschrieben wird, muss der Befehl initrd auf den Befehl Kernel folgen.
Der Befehl root vereinfacht die Angabe der Kernel- und initrd-Dateien. Das einzige Argument von root ist ein Gerät oder eine Partition. Allen Kernel-, initrd- oder anderen Dateipfaden, für die nicht explizit ein Gerät angegeben ist, wird bis zum nächsten root-Befehl das Gerät vorangestellt.
Am Ende eines jeden Menüeintrags steht implizit der boot-Befehl, sodass dieser nicht in die Menüdatei geschrieben werden muss. Wenn Sie GRUB jedoch interaktiv zum Booten verwenden, müssen Sie den boot-Befehl am Ende eingeben. Der Befehl selbst hat keine Argumente. Er führt lediglich das geladene Kernel-Image oder den angegebenen Chainloader aus.
Wenn Sie alle Menüeinträge geschrieben haben, müssen sie einen Eintrag als default festlegen. Anderenfalls wird der erste Eintrag (Eintrag 0) verwendet. Sie haben auch die Möglichkeit, ein Zeitlimit in Sekunden anzugeben, nach dem der default-Eintrag gebootet wird. timeout und default werden den Menüeinträgen in der Regel vorangestellt.
Namenskonventionen für Festplatten und Partitionen
Die von GRUB für Festplatten und Partitionen verwendeten Namenskonventionen unterscheiden sich von denen, die für normale Linux-Geräte verwendet werden. Sie sind der einfachen Plattennummerierung, die das BIOS durchführt, sehr ähnlich und die Syntax gleicht derjenigen, die in manchen BSD-Derivaten verwendet wird. In GRUB beginnt die Nummerierung der Partitionen mit null. Daher ist (hd0,0) die erste Partition auf der ersten Festplatte. Auf einem gewöhnlichen Desktop-Computer, bei dem eine Festplatte als Primary Master angeschlossen ist, lautet der entsprechende Linux-Gerätename /dev/sda1.
Die vier möglichen primären Partitionen haben 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 Partition (gewöhnlich eine erweiterte Partition)
- (hd0,4) erste logische Partition
- (hd0,5) zweite logische Partition
In seiner Abhängigkeit von BIOS-Geräten unterscheidet GRUB nicht zwischen IDE-, SATA-, SCSI- und Hardware RAID-Geräten. Alle Festplatten, die vom BIOS oder anderen Controllern erkannt werden, werden der im BIOS voreingestellten Bootreihenfolge entsprechend nummeriert.
Leider ist eine eindeutige Zuordnung zwischen Linux-Gerätenamen und BIOS-Gerätenamen häufig nicht möglich. Es generiert die Zuordnung mithilfe eines Algorithmus und speichert sie in der Datei device.map, in der sie bei Bedarf bearbeitet werden kann.
Ein vollständiger GRUB-Pfad besteht aus einem Gerätenamen, der in Klammern geschrieben wird, und dem Pfad der Datei im Dateisystem auf der angegebenen Partition. Der Pfad beginnt mit einem Schrägstrich. Auf einem System mit einer einzelnen IDE-Festplatte und Linux auf der ersten Partition könnte der bootbare Kernel beispielsweise wie folgt spezifiziert werden:
(hd0,0)/boot/vmlinuz
Beispiel einer Menüdatei
Das folgende Beispiel zeigt die Struktur einer GRUB-Menüdatei. Diese Beispiel-Installation beinhaltet eine Linux-Bootpartition unter /dev/sda5, eine Root-Partition unter /dev/sda7 und eine Windows-Installation unter /dev/sda1:
gfxmenu (hd0,4)/message color white/blue black/light-gray default 0 timeout 8 title linux kernel (hd0,4)/vmlinuz root=/dev/sda7 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/sda7 ide=nodma \ apm=off acpi=off vga=normal nosmp maxcpus=0 3 initrd (hd0,4)/initrd.shipped
Der erste Block definiert die Konfiguration des Eröffnungsbildschirms:
- gfxmenu (hd0,4)/message
Das Hintergrundbild message befindet sich im Verzeichnis der obersten Ebene der Partition /dev/sda5. - color white/blue black/light-gray
Farbschema: white (Vordergrund), blue (Hintergrund), black (Auswahl) und light gray (Hintergrund der Markierung). Das Farbschema wirkt sich nicht auf den Eröffnungsbildschirm, sondern nur auf das anpassbare GRUB-Menü aus, auf das Sie zugreifen können, wenn Sie den Eröffnungsbildschirm mit Esc beenden. - default 0
Der erste Menüeintrag title linux soll standardmäßig gebootet werden. - timeout 8
Nach acht Sekunden ohne Benutzereingabe bootet GRUB den Standardeintrag automatisch. Um das automatische Booten zu deaktivieren, löschen Sie die Zeile timeout. Wenn Sie timeout 0 einstellen, bootet GRUB den Standardeintrag sofort.
Im zweiten und größten Block sind die verschiedenen bootbaren Betriebssysteme aufgelistet. Die Abschnitte für die einzelnen Betriebssysteme werden durch title eingeleitet.
- Der erste Eintrag (title linux) ist für das Booten von openSUSE verantwortlich. Der Kernel (vmlinuz) befindet sich in der ersten logischen Partition (die Bootpartition) der ersten Festplatte. Hier werden Kernel-Parameter, z. B. die Root-Partition und der VGA-Modus, angehängt. Die Angabe der root-Partition erfolgt nach der Linux-Namenskonvention (/dev/sda7/), da diese Information für den Kernel bestimmt ist und nichts mit GRUB zu tun hat. Die initrd befindet sich ebenfalls in der ersten logischen Partition der ersten Festplatte.
- Der zweite Eintrag ist für das Laden von Windows verantwortlich. Windows wird von der ersten Partition der ersten Festplatte aus gebootet (hd0,0). Mit chainloader +1 wird das Auslesen und Ausführen des ersten Sektors der angegebenen Partition gesteuert.
- Der nächste Eintrag dient dazu, das Booten von Diskette zu ermöglichen, ohne dass dazu die BIOS-Einstellungen geändert werden müssten.
- Die Bootoption failsafe dient dazu, Linux mit einer bestimmten Auswahl an Kernel-Parametern zu starten, die selbst auf problematischen Systemen ein Hochfahren von Linux ermöglichen.
Die Menüdatei kann jederzeit geändert werden. GRUB verwendet die geänderten Einstellungen anschließend für den nächsten Bootvorgang. Sie können diese Datei mit dem Editor Ihrer Wahl oder mit YaST editieren und dauerhaft speichern. Alternativ können Sie temporäre Änderungen interaktiv über die Bearbeitungsfunktion von GRUB vornehmen.
Ändern von Menü-Einträgen während des Bootvorgangs
Wählen sie im grafischen Bootmenü das zu bootende Betriebssystem mit den Pfeiltasten aus. Wenn Sie ein Linux-System wählen, können Sie an der Booteingabeaufforderung zusätzliche Bootparameter eingeben. Um einzelne Menüeinträge direkt zu bearbeiten, drücken Sie die Esc-Taste. Der Eröffnungsbildschirm wird geschlossen und das textbasierte GRUB-Menü aufgerufen. Drücken sie anschließend die Taste E. Achtung! Während des Bootvorganges ist nur die amerikanische Tastaturbelegung verfügbar. Auf diese Weise vorgenommene Änderungen gelten nur für den aktuellen Bootvorgang und können nicht dauerhaft übernommen werden.
Durch die Möglichkeit, die Menüeinträge zu bearbeiten, kann ein defektes System, das nicht mehr gebootet werden kann, repariert werden, da die fehlerhafte Konfigurationsdatei des Bootloaders mittels der manuellen Eingabe von Parametern umgangen werden kann. Die manuelle Eingabe vom Parametern während des Bootvorgangs ist zudem hilfreich um neue Einstellungen zu testen , ohne dass diese sich auf das native System auswirken.
Aktivieren sie den Bearbeitungsmodus und wählen sie mithilfe der Pfeiltasten den Menüeintrag aus, dessen Konfiguration sie ändern möchten. Um die Konfiguration zu bearbeiten, drücken sie die Taste E erneut. Auf diese Weise korrigieren sie falsche Partitions- oder Pfadangaben, bevor sich diese negativ auf den Bootvorgang auswirken. Drücken sie die Eingabetaste, um den Bearbeitungsmodus zu verlassen und zum Menü zurückzukehren. Drücken Sie anschließend die Taste B, um diesen Eintrag zu booten. Im Hilfetext am unteren Rand werden weitere mögliche Aktionen angezeigt.
Um die geänderten Bootoptionen dauerhaft zu übernehmen und an den Kernel zu übergeben, öffnen sie die Datei 'menu.lst' als Benutzer root und hängen sie die entsprechenden Kernel-Parameter an folgende vorhandene Zeile getrennt durch Leerzeichen an:
title linux kernel (hd0,0)/vmlinuz root=/dev/sda3 additional parameter initrd (hd0,0)/initrd
GRUB übernimmt den neuen Parameter beim nächsten Booten automatisch. Alternativ können sie diese Änderung auch mit dem YaST-Bootloader-Modul vornehmen. Hängen sie die neuen Parameter getrennt durch Leerzeichen an die vorhandene Zeile an.
Die Datei "device.map"
Die Datei device.map enthält Zuordnungen zwischen den GRUB- und BIOS-Gerätenamen und den Linux-Gerätenamen. In einem Mischsystem aus IDE- und SCSI-Festplatten muss GRUB anhand eines bestimmten Verfahrens versuchen, die Bootreihenfolge zu ermitteln, da die BIOS-Informationen zur Bootreihenfolge für GRUB unter Umständen nicht zugänglich sind. GRUB speichert das Ergebnis dieser Analyse in der Datei '/boot/grub/device.map'. Auf einem System, für das IDE vor SCSI gebootet werden soll, kann die Datei 'device.map' beispielsweise wie folgt aussehen:
(fd0) /dev/fd0 (hd0) /dev/sda (hd1) /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 Datei 'device.map' manuell festzulegen. Wenn beim Booten Probleme auftreten sollten, prüfen sie, ob die Reihenfolge in dieser Datei der BIOS-Reihenfolge entspricht, und ändern sie sie notfalls temporär mithilfe der GRUB-Eingabeaufforderung. Sobald das Linux-System gebootet ist, können sie die Datei 'device.map' mithilfe des YaST-Bootloader-Moduls oder eines Editors Ihrer Wahl dauerhaft bearbeiten.
Installieren sie nach der manuellen Bearbeitung von 'device.map' GRUB über den folgenden Befehl erneut:
grub --batch < /etc/grub.conf
Dieser Befehl führt dazu, dass die Datei 'device.map' neu geladen wird und die in 'grub.conf' aufgelisteten Befehle ausgeführt werden.
Die Datei "/etc/grub.conf"
Nach 'menu.lst' und 'device.map' ist '/etc/grub.conf' die drittwichtigste Konfigurationsdatei von GRUB. Diese Datei enthält die Befehle, Parameter und Optionen, die die GRUB-Shell für das ordnungsgemäße Installieren des Bootloaders benötigt.
root (hd0,4) install /grub/stage1 (hd0,3) /grub/stage2 0x8000 (hd0,4)/grub/menu.lst quit
Bedeutung der einzelnen Einträge:
- root (hd0,4)
Mit diesem Befehl wird GRUB angewiesen, folgende Befehle auf die erste logische Partition der ersten Festplatte anzuwenden. Dort befinden sich die Bootdateien. - install
Führen sie den Befehl grub mit dem Parameter install aus. Installieren sie stage1 des Bootloaders im erweiterten Partitionscontainer (/grub/stage1 (hd0,3)). Dies ist eine etwas "alternative" Konfiguration, die jedoch meist funktioniert. stage2 muss in die Speicheradresse 0x8000 (/grub/stage2 0x8000) geladen werden. Der letzte Eintrag ((hd0,4)/grub/menu.lst) zeigt GRUB, wo sich die Menüdatei befindet.
Festlegen eines Bootpassworts
Schon vor dem Booten des Betriebssystems ermöglicht GRUB den Zugriff auf Dateisysteme. Dies bedeutet, dass Benutzer ohne root-Berechtigungen auf Dateien des Linux-Systems zugreifen können, auf die sie nach dem Booten keinen Zugriff haben. Um diese Zugriffe oder das Booten bestimmter Betriebssysteme zu verhindern, können sie ein Bootpasswort festlegen. Wenn sie für GRUB ein Bootpasswort verwenden, wird der übliche Eröffnungsbildschirm nicht angezeigt. Legen Sie als Benutzer root das Bootpasswort wie folgt fest:
- Verschlüsseln Sie an der root-Eingabeaufforderung das Passwort mit Hilfe von grub-md5-crypt:
# grub-md5-crypt
Password: ****
Retype password: ****
Encrypted: $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/ - Fügen sie die verschlüsselte Zeichenkette 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/
Jetzt können GRUB-Befehle in der Booteingabeaufforderung nur ausgeführt werden, wenn die Taste P gedrückt und das Passwort eingegeben wurde. Benutzer können jedoch über das Bootmenü weiterhin alle Betriebssysteme booten. - Um zu verhindern, dass ein oder mehrere Betriebssysteme über das Bootmenü gebootet werden, fügen Sie den Eintrag lock zu allen Abschnitten in menu.lst hinzu, die ohne Eingabe eines Passworts nicht gebootet werden sollen. Beispiel:
title linux
kernel (hd0,4)/vmlinuz root=/dev/sda7 vga=791
initrd (hd0,4)/initrd
lock
Nach dem Neubooten des Systems und der Auswahl des Linux-Eintrags im Bootmenü erscheint zunächst folgende Fehlermeldung:
Error 32: Must be authenticated
Drücken sie die Eingabetaste, um das Menü zu öffnen. Drücken sie anschließend die Taste P, um die Eingabeaufforderung für das Passwort zu öffnen. Wenn sie das Passwort eingegeben und die Eingabetaste gedrückt haben, sollte das ausgewählte Betriebssystem (in diesem Fall Linux) gebootet werden.