GRUB Installation + Boot CDs/Disketten erstellen
 

Frei nach dem Motto: "Alle Wege führen nach Rom" gibt es unter GRUB mehrere Wege ein und dasselbe zu machen. Zum Beispiel um GRUB in den MBR der ersten IDE-Festplatte zu installieren (das Linux-System befindet sich in diesem Beispiel auf der Partition /dev/hda5), kann man entweder sich des Installations-Skripts
grub-install bedienen oder der sogenannten grub-shell. Also macht die Eingabe
# grub-install '(hd0)'
das gleiche wie
# grub
> root (hd0,4)
> setup (hd0)
> quit
Beachten sollte man die kleinen, feinen Unterschiede in dem sogenannten INSTALL_DEVICE, also wohin GRUB eigentlich installiert werden soll, denn dafür gibt es mehrere Möglichkeiten:

  • grub-install /dev/sda Installiert GRUB im MBR der ersten SCSI-Festplatte
  • grub-install /dev/hda Installiert GRUB im MBR der ersten IDE-Festplatte
  • grub-install '(hd0)' Installiert GRUB im MBR der ersten Festplatte
  • grub-install /dev/sda1 Installiert GRUB in der ersten primären Partition der ersten SCSI-Festplatte
  • grub-install /dev/hda1 Installiert GRUB in der ersten primären Partition der ersten IDE-Festplatte
  • grub-install '(hd0,0)' Installiert GRUB in der ersten primären Partition der ersten Festplatte

Ich habe auch schon Varianten gesehen mit grub-install (hd0), also ohne die einfachen Anführungszeichen, gebe aber keine Garantie, daß das funktioniert. In der Regel wird man Grub im MBR der ersten Festplatte installieren, daher wird die Bezeichnung meistens (hd0) oder /dev/hda heißen. Sollte dies aus irgendwelchen Gründen schief gegangen sein, oder man hat die Installationsreihenfolge der Betriebssysteme falsch gewählt (zuerst Windows, dann Linux, da Windows GRUB überschreibt mit dem eigenen Bootloader), gibt es mehrere Wege GRUB wieder herzustellen. Zunächst beschäftigen wir uns mit dem Erstellen einer GRUB-Diskette, welche zwar für die Installation von GRUB in den MBR nicht von Nöten wäre, aber für die Zukunft falls man öfter mal den Bootloader zerschießt, das wiederherstellen vereinfacht, da man ohne Live-CD auskommt.

1. Erstellen einer GRUB-Boot-Diskette - Möglichkeit 1

Benötigt werden lediglich zwei Dateien
/usr/lib/grub/i386-pc/stage1
/usr/lib/grub/i386-pc/stage2

Man kann diese Dateien auch aus dem Verzeichnis /boot/grub kopieren, jedoch waren selbige Dateien aus dem Verzeichnis /boot/grub bei mir bei 2 von 3 Debian Installationen fehlerhaft (um 1 Bit verschieden), oder eventuell von Debian verändert oder falsch erstellt, was beim booten zu den Fehlermeldungen ReadError und GeomError führte. Daher ist es besser man nimmt die Dateien aus dem library-Verzeichnis von GRUB.
Hat man keine Linux-Installation zur Hand, kann man auch eine Live-Linux-CD, wie z.B. Knoppix verwenden. Um Komplikationen zu vermeiden, sollte man eine Live-Distribution wählen, die dem zu rettendem System sehr ähnlich ist (z.B. Knoppix basiert auf Debian, ist also für Debian sehr geeignet, während für Suse besser eine Suse-Live-CD verwendet werden sollte). Mit folgenden Befehlen in genau dieser Reihenfolge wird eine Grub-Boot-Diskette erstellt:
dd if=/usr/lib/grub/i386-pc/stage1 of=/dev/fd0 bs=512 count=1
dd if=/usr/lib/grub/i386-pc/stage2 of=/dev/fd0 bs=512 seek=1

stage1 ist gerade mal 512 Bytes lang und enthält lediglich die Anweisungen um stage2 aufzurufen, welches den Programmcode von GRUB lädt. Nach dem Start von der Diskette befindet man sich in der Eingeabeaufforderung von GRUB, einer sogenannten GRUB-Shell. Der Befehl help liefert eine liste der möglichen Befehle. Wie man nun eine bestehende Linux-Installation abstartet, wird unter dem Punkten a) und b) beschrieben. Zunächst noch eine weitere Möglichkeit zum Erstellen einer Boot-Diskette.

2. Erstellen einer GRUB-Boot-Diskette - Möglichkeit 2

Man formatiert z.B. mit Kfloppy eine Diskette im ext2-Format. Anschließend legt man auf dem Medium den Verzeichnisbaum /boot/grub an und kopiert die beiden Dateien stage1 und stage2 hinein. Möchte man eine deutsche Tastatur-belegung unter GRUB, sollte man noch eine menu.lst-Datei erstellen mit den entsprechenden setkey-Befehlen (mittels setkey werden den Tasten unter Grub andere Belegungen zugewiesen) und ebenfalls im Verzeichnis /grub ablegen. Für die deutsche Tastaturbelegung gibts hier eine menu.lst zum download. Mittels dem Befehl grub startet man die Eingabeaufforderung von GRUB und gibt folgendes ein:
# device (fd0) /dev/fd0
# root (fd0)
# setup (fd0)
# quit

Daraufhin wird GRUB auf der Diskette installiert und man befindet sich wie bei Möglichkeit 1 nach dem Booten in einer GRUB-Shell. Der Vorteil gegenüber Möglichkeit 1 liegt in der deutschen Tastaturbelegung, so daß man die Zeichen
/ (slash) und = (gleich) nicht suchen muß. Selbige brauchen wir nämlich gleich zum abstarten unserer Distribution.

a) Abstarten der Linux-Partiton ohne menu.lst
In dem man lediglich die Einträge der menu.lst in der
GRUB-Eingabeaufforderung eingibt, startet man die jeweilige Linux-Partition. Weiß man die Partition nicht, so kann mittels
# find /boot/grub/stage1
(hd0,6)

die korrekte herausgefunden werden, bzw. es werden sämtliche Partitionen die den Suchpfad enthalten aufgelistet. Abstarten kann man z.B. eine Debian-Distribution mit folgenden Befehlen. Natürlich können die Kernelnamen anders lauten und müssen daher angepaßt werden. Ein kleiner Tip der die Sache ungemein erleichtert: Die GRUB-Shell unterstützt wie die Bash-Shell die Autovervollständigung von Befehlen und Pfaden mittels der TAB-Taste, daher reicht es wenn man
kernel /boot/vm
eingibt und das ganze mit der TAB-Taste vervollständigen läßt.
> root (hd0,6)
> kernel /boot/vmlinuz-2.6.26-1-486 root=/dev/hda7 ro quiet
> initrd /boot/initrd.img-2.6.26-1-486
> boot

Zu beachten ist, daß GRUB die Partitionen von 0 an aufwärts zählt, also muß für die Angabe des root-Verzeichnisbaums immer +1 dazu gezählt werden. Hier im Beispiel verwendet GRUB die Partition hd0,6, welche der Partition /dev/hda7 entspricht.

b) Abstarten der Linux-Partiton mit menu.lst
Ist eine menu.lst vorhanden, genügt im Normalfall eine Zeile bei grub:
> configfile (hd0,6)/boot/grub/menu.lst
die Bezeichnung (hd0,6) vor dem Pfad gibt die Festplattenpartition an, auf der das Verzeichnis /boot/grub liegt. Es wird die menu.lst gelesen und es erscheint das gewohnte Auswahlmenü von GRUB. Wie so eine menu.lst im Detail aussieht, wird in diesem Beitrag behandelt. Machen wir weiter mit Möglichkeit 3 um eine GRUB-Diskette zu erstellen.

3. Erstellen einer GRUB-Boot-Diskette - Möglichkeit 3

Diese Möglichkeit unterscheidet sich ein wenig von den beiden Erstgenannten. Ihr kommt eine Bedeutung zu, wenn man GRUB auf einer Diskette installieren will, ohne den vorhandenen Bootloader zu überschreiben. Zum Beispiel, wenn man eine Windows-Partition hat und beim aufspielen von Linux bewußt keinen Bootloader angegeben hat, um den von Windows nicht zu überschreiben.
Man startet GRUB wieder durch Eingabe von grub in einer Shell:
# grub
Danach gibt man folgenden Befehl ein:
> install= (hd0,6) /boot/grub/stage1 d (fd0) (hd0,6)/boot/grub/stage2 0x8000 p /boot/grub/menu.lst
Natürlich muß man die Angabe (hd0,6) durch die Angabe der eigenen Partition auf dem sich das Linux-System befindet, ersetzen! (zum suchen siehe find weiter oben)
Mit diesem Befehl wird GRUB auf der Diskette installiert, greift jedoch auf die menu.lst unter /dev/hda7 zu. Nach dem Booten von der Diskette befindet man sich nicht in der Eingabeaufforderung, sondern es wird gleich die menu.lst in der angegebenen Festplattenpartition angezeigt. Theoretisch kann man auf diese Weise sogar sehr einfach schon beim Einschalten des PCs festlegen, welches System gestartet werden soll:
Diskette vorher einlegen -> GRUB wird aufgerufen und startet nach dem Timeout das Default-System, welches natürlich Linux sein sollte.
Diskette vorher raus -> Es wird automatisch Windows geladen.

GRUB Boot-CD
Wie man eine Boot-CD für GRUB erstellt ist ein wenig aufwendiger. Man benötigt dafür die Datei stage2_eltorito, welche ebenfalls unter /usr/lib/grub/i386-pc/ zu finden ist. Zuerst erstellt man auf der Festplatte ein Verzeichnis namens iso, in dem man die Unterverzeichnisse /boot/grub/ anlegt. Das geht mit
# mkdir iso
# mkdir -p iso/boot/grub
dann kopiert man die Datei stage2_eltorito hinein
# cp /usr/lib/grub/i386-pc/stage2_eltorito iso/boot/grub
für die deutsche Tastatur-Belegung ist auch eine entsprechende menu.lst nicht schlecht (siehe Boot-Diskette Möglichkeit 2).
Anschließend erstellt man das iso-Image mit folgendem Befehl:
# mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o grub.iso iso
man erhält eine grub.iso Datei, die man mittels eines Brennprogrammes auf einen Rohling bannen kann. Wem das zuviel Arbeit ist, kann das iso-Image auch hier runterladen.


Sollte man keine Boot-Diskette erstellen wollen, oder nicht einmal ein Disketten-Laufwerk haben (wie bei Notebooks) kann man GRUB mit den folgenden Möglichkeiten wieder herstellen:

Vorarbeiten zum installieren von GRUB:
Mit Hilfe einer Live-CD-Distribution eine Linux-Umgebung starten und die Partition des zu rettenden Systems einhängen. Als Beispiel:
# mount -t ext3 /dev/hda6 /mnt
hängt die Partition /dev/hda6 unter /mnt ein.

GRUB wiederherstellen - Möglichkeit 1 (nicht empfehlenswert):
Obwohl diese Möglichkeit nicht empfehlenswert ist, erwähne ich sie hier trotzdem:
# grub-install --root-directory=/mnt --recheck /dev/hda
grub-install führt das Installations-Skript aus.
root-directory gibt ein anderes als das momentane Root-Verzeichnis an, welches ja das von der Live-CD ist.
recheck überprüft die device.map, in welcher GRUB die Block-Devices speichert.
/dev/hda der Speicherort von GRUB hier der MBR (Master Boot Record)
Hinweis: Es wird die GRUB-Version vom gestarteten Rescue-System installiert, jedoch die menu.lst vom zu rettendem System, welches in das Verzeichnis /mnt eingehängt wurde. Bei nicht kompatiblen Systemen kann das zu Problemen führen.

GRUB wiederherstellen - Möglichkeit 2:
GRUB abstarten (Eingabe grub am prompt) und mit folgendem Befehl GRUB im MBR installieren:
grub> install= (hd0,6) /boot/grub/stage1 d (hd0) (hd0,6)/boot/grub/stage2 0x8000 p /boot/grub/menu.lst

GRUB wiederherstellen - Möglichkeit 3:
Zuerst noch zusätzlich /proc und /dev in das gemountete System mit einbinden:
# mount -t proc /proc /mnt/proc
# mount -o bind /dev /mnt/dev

danach mit chroot das Root-Verzeichnis wechseln:
# chroot /mnt
Anschließend GRUB im MBR installieren:
# grub-install hd0
oder bei Fehlermeldungen:
# grub-install --recheck hd0

GRUB wiederherstellen - Möglichkeit 4 (beste Möglichkeit):

Diese Möglichkeit ist meine Favorisierte, da hier das zu rettende und nicht ein "fremdes" System (Live-CD) läuft und das GRUB-Programm auf jeden Fall vom eigenem System stammt und nicht von der Live-CD.
Mittels einer GRUB-Boot-CD/Diskette das Linux-System abstarten, eine GRUB-Shell öffnen und für die korrekte Partition das Kommando find verwenden:
# find /boot/grub/stage1
(hd0,6)

für die Installation in den MBR folgendes eingeben:
# root (hd0,6)
# setup (hd0)
# quit

Auch hier wird GRUB im MBR (hd0) installiert.

WICHTIGER HINWEIS:
Suse hat mit der Version 10.3 GRUB so verändert, daß er entweder nicht mehr korrekt funktioniert, oder nicht mehr mit Debian kompatibel ist. Auf jeden Fall war es mir mit dem Suse-GRUB nicht möglich ein Debian-System abzustarten. Umgekehrt allerdings schon! Ich weiß nicht, ob es daran liegt, daß Suse die Festplatten-Bezeichnungen geändert hat (hda gibt es nicht mehr, das heißt jetzt sda bei Suse) oder eine geänderte Block-Größe dafür verantwortlich ist. Meine Lösung bestand im installieren des Debian-GRUBs, welcher beide Systeme abstarten kann.

Anleitung zu GRUB
Installiert man das Paket grub-doc erhält man eine Anleitung wenn man die Infoseiten von GRUB aufruft, also im Konqueror info:grub eingibt.