Belug Logo index.html

GNU GRUB - GRand Unified Bootloader

Dieser Artikel beschreibt GNU GRUB (grand unified bootloader) übersetzt etwa "großartiger, einheitlicher Startmanager". GNU/GRUB entstand aus GRUB, der ursprünglich von Erich Stefan Boleyn entwickelt wurde.

Ein Startmanager oder bootloader ist das erste Programm das gestartet wird, wenn ein Computer angeschaltet wird. Er ist verantwortlich für das eigentliche Starten des Betriebssystems, beispielsweise von Hurd, Windows, oder Linux. Der bootloader übergibt danach die Kontrolle an den gestarteten Betriebssystemkern und beendet sich. Der Betriebssystemkern kümmert sich von nun an um das restliche Initialisieren der Hardwarekomponenten und Starten der Anwendungsprogramme.

Einführung

GRUB kann im Gegensatz zu LiLO (ein anderer bekannter Bootloader) Dateisysteme wie ext2, ReiserFS, FAT32, BSD FFS oder xfs direkt lesen. Deshalb muss nach der Installation eines neuen Kernels oder eines neuen Betriebssystems nur die Konfigurationsdatei von Grub angepasst werden. Es ist keine komplette Neuinstallation des bootloaders, wie bei LiLO nötig.

Installation von Grub

Grub wird am einfachstem mit dem Packetmanager Ihrer Distribution (apt, yast...) installiert. Bei Debian reicht dafür ein simples:

als root auf der Kommandozeile.

Alternativ kann Grub auch aus den Quellen compiliert werden. Dazu benötigen Sie den Quellcode von der Grub-Homepage:

Die Installation ist mit dem üblichen Dreierschritt configure/make/make install sehr einfach. Die reine Installation von Grub, über den Paketmanager der Distribution oder durch eigenes Compilieren, verändert den Bootsektor der Festplatte noch nicht.

Grub auf Bootdiskette installieren

Eine Bootdiskette kann auf unterschiedliche Art und Weise erstellt werden. Der einfachste Weg ist der Aufruf von:

Dieser Befehl installiert Grub auf die Diskette. Wenn Grub bereits auf einer Festplatte installiert ist, kann man auch einfach den bootsektor oder masterbootrecord kopieren::

Alternativ können Sie auch von der Grub-Shell aus arbeiten::

Wie auch immer Sie diese Diskette erstellen -- auf jeden Fall sollten Sie sie testen!

Grub auf Festplatte installieren

Sie sollten vor der Installation von Grub in den Bootsektor oder Masterbootrecord eine Bootdiskette erstellen und diese auch auf Funktion testen! Um Grub in den Masterbootrecord der Festplatte zu installieren geben Sie auf der Grub-Konsole ein:

Die Ausgabe (bei mir hd0,9) sollte nun die Festplattenpartition sein, auf der /boot/grub liegt. Das ist nützlich, wenn Sie nicht genau wissen, wo die einzelnen stages auf der Platte liegen. Der Befehl "find" zeigt sie an. 

Dieser Befehl teilt Grub mit, wo seine Dateien (stages, Konfiguration) liegen. Nun können Sie Grub mit:

in den Bootsektor der ersten Festplatte installieren. Grub mit:: 

wieder verlassen und neu booten.

 

Konfiguration

Festplatten und Partitionen werden bei Grub durchgezählt und stehen in Klammern: (hd0,0) = erste Partition auf erster Platte, aka /dev/hda1.

Probleme macht diese Zählweise immer dann,  wenn verschiedene Bussysteme im Rechner verbaut sind. Dann muss man Grub mitteilen, wie das BIOS (Basic Input/ Output System) die Platten sieht. Das Ganze wird in der Datei /boot/grub/device.map erledigt. Ein kleines Beispiel mit 4 über Parallel-ATA, 4 über Seriell-ATA und 4 über einen zusätzlichen Hardware-Raid-Controller angeschlossenen Platten zeigt das Problem: Das Gerät /dev/sde ist hier die Platte, die vom Hardware-Raid-Controller bereit gestellt wird. Im ersten Fall wird der Controller vom Bios ignoriert:

device.map:

Erkennt das Bios jedoch den Hardware-Raid-Controller und initialisiert ihn zuerst, dann ändert sich die Reihenfolge der Erkennung, obwohl das dahinter liegende Betriebssystem unter Umständen seine Zuordnung der Gerätenamen nicht ändert. Dann müsste die Datei /boot/grub/device.map folgendermaßen angepasst werden:

device.map:

Das Problem hierbei ist eigentlich nur, herauszufinden, wie genau das Bios nun die Platten zählt. Dabei kann eine Bootdiskette oder CD mit Grub helfen. Dazu einfach die Grub-Diskette booten und im Bootmenü die Taste "c" drücken, um auf die Grub-shell zu kommen. Dann können mit der Eingabe von:

die Festplatten und die Sichtweise des Bios angezeigt werden. Das Ganze funktioniert nicht zuverlässig, wenn bereits ein System gebootet ist.

Einfache Konfigurationen

Bearbeiten Sie die Datei /boot/grub/menu.lst.

Beachten Sie dabei, dass die Festplatten und Partitionen durchgezählt werden (nochmal: bei 0 beginnen mit Zählen). Zeilen, die mit einer Raute # beginnen, sind Kommentare (was dahinter steht, wird vom System nicht gelesen bzw. ausgewertet). Das folgende Beispiel enthält Kommentare, die die minimale menu.lst eigentlich selbst erklären sollten.

menu.lst:

Diese minimale Konfiguration ist bereits zum booten eines Betriebssystems ausreichend. Mit der folgenden Konfiguration können schon mehrere Betriebssysteme gestartet werden: 

farbiges Menu

Das angezeigte Menü im Beispiel "Einfache Konfiguration" ist sehr schlicht. Etwas Farbe bekommt man durch folgenden Eintrag:

# Konfiguration meines Computers zum booten
#
# Standardmässig wird der erste Eintrag gebootet.
default 0
#
# Automatisch booten nach 30 Sekunden
timeout 30
#
#farbiges Menü
color yellow/blue blink-light-red/dark-grey

#
# Debian Booteintrag
title Debian
kernel (hd0,9)/vmlinuz root=/dev/hda10 ro

Die ersten beiden Farben (yellow/blue) stehen für die gesamte Menüfarbe Vordergrund/Hintergrund, die hinteren beiden Farben (red/black) stehen für den momentan ausgewählten Menüeintrag. Folgende Farben sind für Vordergrund/Hintergrund gültig:

Zusätzlich sind folgende Farben nur für den Vordergrund gültig:

Man kann den Vordergrund zusätzlich blinken lassen, wenn man den Präfix blink- angibt, wie im Beispiel zu sehen.

splashimage (bunte Bilder in Grub)

Auch einfache Bilder kann Grub anzeigen:

Das Bild muss ein gezipptes 640x480 großes XPM mit einer Palette mit 14 Farben sein:

convert -size 640x480 bild.jpg -resize 640x480 -colors 15 bild.xpm && gzip bild.xpm  

Passwörter

Grub kann wahlweise einzelne Booteinträge, die gesamte Konfiguration oder alternative Bootmenüs mit einem Passwort schützen. Die MD5-Summe des Passwortes steht dabei in der Datei menu.lst, deshalb sollte sie mit den Zugriffsrechten 0600 gesichert werden, wenn man Passwörter in der Grubkonsole einsetzt. So gesichert kann nur root diese Datei lesen und schreiben.
Hinweis: In den folgenden Beispielen wird als Passwort "sehrgeheim" verwendet, sie sollten natürlich ein anderes Passwort verwenden!

Ein Passwort für Grub kann folgendermaßen erzeugt werden:

Dieses Passwort kann dann kopiert und in die Konfiguration eingesetzt werden. Alternativ können Sie das Passwort natürlich auch mit der Grub-Shell erzeugen:

Weiterhin können auch Klartextpasswörter in der Konfiguration verwendet werden. Davon rate ich jedoch ab.

Die Grub-Konsole mit Passwort absichern:

Einen Booteintrag erst nach Passworteingabe starten:

Einen Booteintrag mit extra Passwort absichern:

spezielle Konfiguration nach Passwort-Eingabe laden:

deutsche Tastatur auf Grubshell

Da der GRUB die englische Tastatur benutzt ist es zuweilen recht lästig, wenn man versucht, Bootparameter zu ändern und die Tasten nicht findet.  Auch das Eintippen von Passwörtern gestaltet sich dann mitunter etwas schwierig.

Einfach an den Anfang der /boot/grub/menu.lst folgendes eintragen:

# setkey verändert die Tastaturbelegung auf die deutsche Tastatur
setkey y z
setkey z y
setkey Y Z
setkey Z Y
setkey equal parenright
setkey parenright parenleft
setkey parenleft asterisk
setkey doublequote at
setkey plus bracketright
setkey minus slash
setkey slash ampersand
setkey ampersand percent
setkey percent caret
setkey underscore question
setkey question underscore
setkey semicolon less
setkey less numbersign
setkey numbersign backslash
setkey colon greater
setkey greater bar
setkey asterisk braceright

Danach kommt der Rest der menu.lst. Ab sofort hat man dann die deutsche Tastaturbelegung im GRUB. Diese Einträge sind so ziemlich das einzige, was nicht direkt beim booten aus der Grub- Shell erledigt werden kann. Nach Eingabe von  "setkey y z" ist es unmöglich, den Buchstaben "y" einzugeben, deswegen ist die darauf folgende Eingabe von "setkey z y" unmöglich!

Booten eines Kernels direkt vom Netzwerk

GRUB kann den Kernel auch von einem TFTP-Server holen. Das setzt natürlich voraus, daß eine Netzwerkkarte im Rechner ist, die von GRUB unterstützt wird und mit der eine Verbindung zum TFTP-Server hergestellt werden kann. Das Booten würde dann folgendermaßen aussehen::

Der erste Unterschied zum "normalen" Vorgang ist, dass die Netzwerkkarte mittels ifconfig aktiviert werden muss. Dabei gibt address die eigene IP und server die IP des TFTP-Servers an. Außerdem gibt man bei root als Platte/Partition nd an. Natürlich kann GRUB die Netzwerk-Informationen auch von einem DHCP-, BOOTP- oder RARP-Server abholen.

booten eines Kernels von CD aus Grub heraus

Öfter kommt bei älteren Notebooks oder Computern vor, das nicht direkt von CD gestartet werdenkann, einfach weil das Bios das nicht unterstützt. In diesen Fall kann man einen Bootmanager verwenden, der booten von CD unterstützt, beispielsweise den Smart Boot Manager, den FreeDos in seinen Bootdisketten integriert hat. Grub unterstützt diese Möglichkeit nicht direkt. Um dennoch aus Grub von einer CD-ROM booten zu können braucht es zwei kleine Umwege via memdisk und sbm.

Der Eintrag sieht wie folgt aus:

Die zwei kleinen benötigten Dateien können hier heruntergeladen werden:
memdisk.bin: http://www.lrz-muenchen.de/~bernhard/memdisk.bin
sbootmgr.dsk: http://www.lrz-muenchen.de/~bernhard/sbootmgr.dsk

Erstellen einer grub-bootcd

Grub unterstützt den "no emulation mode" der El Torito Spezifikation. Das bedeutet, das die komplette CD-Rom von Grub aus genutzt werden kann. Ärger und Kompatibilitätsprobleme mit Diskettensimulationen oder Festplattenimages gehören so der Vergangenheit an. Um von einer CD booten zu können benutzt Grub eine spezielle Stage 2 Datei "stage2_eltorito". Das ist eigentlich auch die Einzige Datei die Sie dann wirklich zum booten benötigen, plus eventuell noch eine Konfigurationsdatei menu.lst.

Die Dateien stage1 oder stage2 werden zum booten von einer CD nicht benötigt, da der EL Torido ist ein völlig anderer Bootprozess ist und fast nichts mit dem normalen booten von Festplatte gemeinsam hat. Eine bootbare CD kann mit folgenden Schritten hergestellt werden:

Jetzt kann der eigentliche Inhalt der CD nach boot_cd/ kopiert werden. Zuletzt wird ein ISO9660-Image erstellt:

Das erzeugt eine Datei grub.iso, die auf CD gebrannt werden kann. mkisofs hat das ISO schon so modifiziert, das direkt von der CD gebootet werden kann, es ist also kein zweiter Aufruf von Grub nötig. Der Zusatz "-boot-load-size 4" ist für die Kompatibilität mit dem BIOS vieler älterer Maschinen nötig.

GRUB vom Windows-Bootmanager aus starten

Dabei wird Grub nicht in den MBR der Festplatte geschrieben, sondern in den Bootsektor der Partition. Danach kopiert man einfach diesen bootsektor  als Datei auf die Partition, die das Windows enthält. Wenn nicht direkt auf das Windows-Dateisystem geschrieben werden kann, kopiert man den bootsektor einfach auf eine Diskette oder einen USB-Stick und von Dort nach Windows. Nachdem der bootsektor kopiert wurde muss noch der bootmanager von Windows angepasst werden. Angenommen das sich Windows auf der ersten, und Linux auf der dritten Partition der ersten Festplatte befindet, würde sich folgender Ablauf ergeben:

Danach wird Windows gestartet und die Datei C:\boot.ini bearbeitet. Folgendes muss hinzugefügt werden:

Eventuell muss noch der Timeout verändert werden, damit das Bootmenü von Windows auch angezeigt wird. Danach kann Grub vom Windows-Bootmanager aus gestartet werden

Grub und Raid 1

Festplatten vorbereiten: partitionieren

Beispiel cfdisk:

Den Typ auf Linux raid autodetect stellen das ist die Nummer fd Danach den Raid1 erstellen:

Die restlichen Array's werden analog dazu erstellt. Das formatieren ist dann ganz normal, aber nicht mehr auf /dev/sda1 sondern auf /dev/md0, also etwa in dieser Art:

Das Daten überspielen ist dann auch ganz normal, entweder mit cp, tar, von Live-CD..., wie Sie mögen.

Wenn Sie vom laufendendem System kopieren müssen: wechseln zu init S, die Verzeichnisse  /proc, /sys (und den mountpoint für das raid!!!) auslassen, die fstab anpassen, grub neu installieren, Verzeichnisse /proc und /sys auf dem raid nur anlegen (mkdir /target/md0/sys;mkdir /target/md0/proc), Fertig. Ich bevorzuge jedoch eine Live-CD (am liebsten grml), mounte die alte und neue Platte und gehe so vor:

Nachdem der Rechner vom unvollständigen Raid bootet kann die zweiter Platte eingebaut werden. Sie wird genau wie die erste Platte formatiert, dann muss sie nur noch ins Raid eingehangen werden:

/etc/grub.conf ändern: sollte von der ersten Platte nicht gebootet werden können, automatisch auf der zweiten Platte nach einer Bootmöglichkeit suchen:

Damit weiß grub, von welcher Platte/Partition er alternativ booten soll.

Grub auf beide platten installieren (hd0 und hd1):

wie geht es meinem raid?

oder alternativ mdadmd einrichten, dann werden mails verschickt, wenn es dem Raid nicht gut geht.Wenn eine Platte kaputt geht und im laufendem Betrieb gewechselt wird, muss sie wieder ins Raid eingehangen werden. Dabei vorher überprüfen, ob nur noch die funktionierende Platte im RAID ist, neue Platte anstecken, genau wie die alte Platte formatieren und dann:

... analog die anderen Partitionen. Hier wurde die Platte sda ausgetauscht! Es ist also die Partition anzugeben, die neu hinzugefügt wurde!

serielle Konsole

Für alle Rechner, an denen nicht dauerhaft eine Tastatur oder ein Monitor angeschlossen ist (aka Server) kann eine Serielle Konsole helfen, teure Betriebsausfälle zu vermeiden. Es sind jedoch einige Besonderheiten zu beachten, beispielsweise ist kein farbiges Menü möglich. Der Einfachkeit halber hier ein Beispiel:

default         0
timeout 20
# WICHTIG! keine hübschen Farben, das geht nicht.
#color cyan/blue white/blue
#und _DAS_ geht schon gar nicht!
#splashimage (hd0,0)/grub/splash.xpm.gz
#
#serielle Schnittstelle angeben
serial --unit=0 --speed=9600
terminal --timeout=20 serial console

#
title Debian GNU/Linux, kernel 2.6.15.3
root (hd0,0)
kernel /boot/vmlinuz-2.6.15.3
root=/dev/md0 ro console=tty0 console=ttyS0,9600
savedefault
boot

Die /etc/inittab muss noch angepasst werden, damit auch ein Login auf der seriellen Konsole möglich ist:

co:23:respawn:/sbin/getty -L ttyS0 9600 vt102 

/etc/securetty: Auch hier muss die serielle Konsole eingetragen werden, sonst kann sich root nicht anmelden:

/securetty
...
/dev/ttyS0
...

 

Mapping von Festplatten

Mittels mapping kann man vor dem Starten eines Betriebssystem die Festplatten vertauschen (die zweite wird zur ersten und umgekehrt). Dies ist zum Beispiel für Windows nötig, da dies scheinbar immer auf der ersten Festplatte sein will.

Falls Windows zum Beispiel auf der zweiten Festplatte auf der ersten Partion ist sieht der Eintrag wie folgt aus:

VGA Parameter 

Ich frage mich, warum ich die Tabelle aus mehreren Webseiten zusammensuchen muss, Kerneldoku lese, und
nirgends die komplette Tabelle steht. Naja, mache ich mir eben selbst die Mühe, hier ist sie:

Kernel VESA mode codes: (für VESA mode numbers einfach 0x200 abziehen)

für eine Auflösung von 1024x768 einfach den bootparameter vga=791 oder vga=0x317 nehmen. Nicht alle bootparameter funktionieren überall. Bis 1024x768 sollte jedoch immer gehen. Anmerkung: framebuffer ist sehr langsam! 

Codetabelle für VGA

col/res

640x400

640x480

800x600

1024x768

1152x864

1280x1024

1600x1200

2 (4bit)

x

x

(770)

x

x

x

x

256 (8bit)

0x300 (768)

0x301 (769)

0x303 (771)

0x305 (773)

0x161 (353)

0x307 (775)

0x31C (796)

32k (15bit)

x

0x310 (784)

0x313 (787)

0x316 (790)

0x162 (354)

0x319 (793)

0x31D (797)

64k (16bit)

x

0x311 (785)

0x314 (788)

0x317 (791)

0x163 (355)

0x31A (794)

0x31E (798)

16M (24bit)

x

0x312 (786)

0x315 (789)

0x318 (792)

x

0x31B (795)

0x31F (799)

16M (32bit)

x

x

x

x

0x164 (356)

x

x

 

 

Fazit:

Grub ist ein ausgewachsener , zuverlässiger und sehr vielseitiger Bootmanager geworden. Zur Zeit entsteht der Nachfolger grub2, der von Grund auf neu geschrieben wurde und erweiterte Möglichkeiten mit sich bringt, modularisierbar ist und auf noch mehr Hardware-Plattformen lauffähig ist.

GRUB 2 targets at the following goals:

Links

gnu/grub oder grub-legacy genannt (Version 0.9.xx):
http://www.gnu.org/software/grub/

grub2:
http://www.gnu.org/software/grub/grub-2.en.html

Bootsplash:
http://ruslug.rutgers.edu/~mcgrof/grub-images/
http://www.bootsplash.org/

Artikel zu Grub:
http://www.pl-berichte.de/t_system/grub-howto.html

alternative Bootloader:
http://freshmeat.net/projects/lilo/

Chain-Loader für grub:
http://www.lrz-muenchen.de/~bernhard/grub-chain-cd.html

Mapping:
http://f24.parsimony.net/cgi-bin/topic-indent.cgi?Nummer=54930&ThreadNummer=47493

serielle Konsole:
http://www.faqs.org/docs/Linux-HOWTO/Remote-Serial-Console-HOWTO.html

 

Dieser Artikel darf -auch Teilweise-  auf anderen Webseiten frei verwendet, kopiert und zitiert werden, solange ein Link auf die ursprüngliche Seite gesetzt und dieser Hinweis nicht entfernt wird. Bei Publikation in Printmedien ist vor Drucklegung meine Zustimmung nötig. Über Mails mit Ergänzungen/Kritik zu diesen Artikel freue ich mich.
Zuletzt geändert im Mai 2007, Version 1.3 Lutz Willek lutz.willek(at)belug.de