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