Intro

GRUB (GRand Unified Bootloader) ist ein sog. Bootloader (oder auch BootManager genannt).

Ein solches Programm wird benutzt um ein Betriebssystem zu starten, also bei Linux den Kernel in den Hauptspeicher zu laden. Ein weiter Bootloader ist der LILO.

Fast alle modernen Distributionen benutzen auf x86-Hardware Grub. Seit einiger Zeit wird der Nachfolger Grub2 entwickelt, der im wesentlichen modularer aufgebaut ist und damit auch leichter auf andere Hardwareplattformen eingesetzt werden kann.

Homepage: http://www.gnu.org/software/grub/

Lizenz: GPL

Vergleich zwischen Lilo und GRUB

Festplatten und Partionen werden bei GRUB durchgezählt und stehen in Klammern: (hd0,0) = hda1 GRUB kann Dateisysteme direkt lesen, nach der Installation eines neuen Kernels eines neuen OS muss nur die menu.lst (grub 0.x) bzw. grub.cfg (grub 2.x) angepasst werden, kein Aufruf von GRUB, wie bei LiLO nötig.

Der faszinierende Vorteil von Grub gegenüber LILO ist die Möglichkeit, während des Bootvorgangs die Parameter zu verändern - dadurch können auch Tippfehler schnell ausgeglichen werden. Dabei funktioniert sogar die Ergänzung mit der Tabulatortaste, da Grub herkömmliche DateiSysteme (FAT, ext2/3, reiserfs) lesen kann. Zudem bietet er die Möglichkeit, MD5-verschlüsselte Passwörter zu verwenden.

Tipps & Tricks

Die Benennung der Festplatten folgt einer anderen Logik, als man es gewöhnt sein mag. Die Partitionen und Festplatten werden von "0" aus gezählt. Zum Beispiel steht (hd0,2) für erste Festplatte, dritte Partition und (hd1,0) für zweite Platte, erste Partition 1 . Die Reihenfolge von IDE - und SCSI-Festplatten hängt dabei vom BIOS ab. Diskettenlaufwerke heißen (fd0) und (fd1). Eigentlich sehr einfach, wenn man das weiß... :)

Frage: Ich mag's einfach nicht, wenn mein BootManager allzu farblos daher kommt - weiß jemand eine Lösung?

Antworten:

Wenn du früher den OS/2-Bootmanager benutzt hast, gefällt dir vielleicht diese Zeile im Configfile:

color 0x17 0x71

Mit '''splashimage (hd0,0)/grub/splash.xpm.gz''' kann man ein Hintergrundbild für Grub angeben. Das Bild muss ein gzipptes 640x480 großes XPM mit einer Palette mit 14 Farben sein. Dies geht z.B. mit:

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

Wenn man unter /boot einen Softlink vmlinuz -> z.B. vmlinux-2.4.18-14 (und bei Bedarf auch für initrd.img) anlegt, kann man eine Grubkonfiguration verwenden, in der keine Kernelversionsnummer angegeben ist und die man, dann bei einen neuen Kernel auch unangetastet lassen kann, wenn man die Links wieder richtig setzt. (Achtung /!\ Bei einigen Distributionen (RedHat) wird die grub.conf von den Kernelpaketen automatisch geändert)

Die Installation ist kinderleicht:

# grub
grub> root (hd0,0) # die Partition mit dem /boot/grub Verzeichnis
grub> setup (hd0)

Frage: Wie kann ich mit Grub freebsd 5.x booten?

Antwort: Grub kann nicht direkt auf das ufs-Filesystem zugreifen. Von daher bietet sich an, den BSD-Bootloader in den Bootsektor der BSD-Partition zu legen und dann von Grub aus über chainloader zu starten, genauso wie man auch eine Windows-System startet.

Beispiel: (IDE0, erste Partition=dos, zweite Partition=FreeBSD-Slice)

root (hd0,1,a)
chainloader +1
boot

UPDATE: Inzwischen sollte es möglich sein, freebsd zu booten, da das Filesystem ufs 1 und 2 nun unterstützt werden. Siehe Grub-Wiki CurrentStatus . -- DanielBrüßler 2006-02-07

Konfiguration

Konfigurations-Datei

Die Datei menu.lst in /usr/share/doc/grub/examples/ schlägt für ein MultiBoot-System mit Linux/WinNT/DOS/FreeBSD folgendes vor (leider ungetestet, da ich selber kein Windows habe):

title  GNU/Linux
        root (hd1,0)
        kernel /vmlinuz root=/dev/hdb1
title Windows NT / Windows 95 boot menu
        rootnoverify (hd0,0)
        makeactive
        chainloader  +1
title MS-DOS
        rootnoverify (hd0,0)
        makeactive
        chainload /bootsect.dos
title FreeBSD 4.5
        root (hd0,2,a)
        kernel /boot/loader
# Knoppix-CDs sind auf /dev/hda5 kopiert !
title           Knoppix v3.4 Kernel 2.4
root            (hd0,4)
kernel          /boot/isolinux/linux24
initrd          /boot/isolinux/minirt24.gz
boot
title           Knoppix v3.4 Kernel 2.6
root            (hd0,4)
kernel          /boot/isolinux/linux26
initrd          /boot/isolinux/minirt26.gz
boot

Noch einfacher geht es unter Debian: update-grub erzeugt eine vernünftige menu.lst

Diskettenimages von GRUB aus booten

Manchmal kommt man doch in die Verlegenheit, ein anderes System von Diskette booten zu wollen, wie z.B. irgendwelche Platten-, Speicherprüfer (wie z.B. MemTest86) oder Flashtools. Dies geht auch ohne Disketten und mit GRUB besonders einfach:

Beim nächsten Booten GRUB in die Kommandozeile schalten (Taste C) und folgendes eingeben (man kann TAB benutzen):

kernel /usr/lib/syslinux/memdisk floppy
initrd /boot/dft32_v361_b12.bin
boot

(!) Evtl. muss man im BIOS das Diskettenlaufwerk aktivieren, auch wenn man keines hat! Ansonsten erhält man beim Booten die Fehlermeldung, dass kein gültiges System auf dem Image gefunden werden konnte.

FRAGE: Gibt es auch eine Möglichkeit, auf der Platte liegende ISO-Images zu booten?

CD-ROM booten

Der Eintrag sieht wie folgt aus:

Die zwei 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

(Diesen Tip habe ich von der Seite: http://www.lrz-muenchen.de/~bernhard/grub-chain-cd.html )

Mapping (Festplattenlaufwerke vertauschen)

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:

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

Tastatur-Mapping oder wie bekomme ich eine deutsche Tastatur im GRUB

Da der GRUB die englische Tastatur benutzt ist es zuweilen recht lästig, wenn man versucht, Bootparameter zu ändern und die Tasten nicht findet ;-)

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

Danach kommt der Rest der menu.lst Ab sofort hat man dann die deutsche Tastaturbelegung im GRUB ;-)

Serielle Konsole in Grub

In voller Pracht hier nachzulesen: http://www.faqs.org/docs/Linux-HOWTO/Remote-Serial-Console-HOWTO.html Bei Redat/CentOS bitte unbedingt lesen!

Der Einfachkeit halber hier ein Beispiel:

Die /etc/inittab muss noch angepasst werden:

/etc/securetty: die Konsole mit rein, sonst kann sich root nicht anmelden

Das sollte es gewesen sein.

Splashimages (Hintergrundbilder)

Hintergrundbild erstellen mit:

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

/boot/grub/menu.lst (foreground background Textfarbe) Für diese Optionen sind keine "=" erforderlich.

splashimage (hd0,0)/grub/splash.xpm.gz
foreground ffffff
background 000000

Wenn es nicht will, Grub Splashimage HOWTO http://ruslug.rutgers.edu/%7Emcgrof/grub-images/ Abschnitt 4.2 beachten, und Grub selber patchen.

Splashimages zum Download

Eigene Partition für /boot

Größe einer Bootpartition?

Laut Linux-user.de ist die optimale Größe einer boot-partition etwa 20 bis 50MB. Mit einer Partitionsgröße von 50 MB können nach meinen Erfahrungen bis zu 10 Standard-Kernel gleichzeitig vorrätig gehalten werden, also mehr als genug für einen Normalen Benutzer.

Wenn sehr viele Kernel zum booten vorrätig gehalten werden sollen (beispielsweise für Entwickler oder Menschen, die oft und viel Ihre Kernel bauen) ist eine Größe bis ca. 100 Mb sinnvoll. Über diese Größe hinaus gibt es kaum einen sinnvollen Anwendungsfall.

Eigene Partition sinnvoll?

Diese Frage lässt sich nicht pauschal beantworten.

Für Anfänger in Sachen Linux/Unix würde ich persönlich keine /boot- Partition empfehlen. Eine weitere Partition verkompliziert das Setup des Rechners, deshalb einfach /boot mit in das rootdateisystem (also /) installieren lassen und keine eigene Partition anlegen. Im Setup bedeutet das: nichts tun. :-)

Wirklich technisch notwendig ist eine eigene Partition für das Verzeichnis /boot eigentlich nur, wenn die root- Partition (also / ) beim booten nicht direkt lesbar ist. Das ist beispielsweise bei Einsatz von Festplattenverschlüsselung oder LVM der Fall. Bei sehr alten Rechnern macht auch die 1024-Zylinder-Grenze des Bios Schwierigkeiten, auch dann ist eine eigene Partition am Anfang der Platte notwendig, um überhaupt booten zu können.

Es kann sinnvoll sein eine eigene gemeinsame Partition für /boot zu benutzen, wenn mehrere Linux- oder Unixvarianten (Distributionen) gleichzeitig im Dualboot installiert sind. Somit entfällt die Notwendigkeit für jedes installierte System einen eigenen Startmanager zu installieren, ohne das sich die Systeme gegenseitig beeinflussen können. Einfach die Partition als /boot in jede Distribution einhängen, beim installieren einer neuen Distribution darauf achten, das diese Partition nicht neu formatiert wird. Bei Debian ist das beispielsweise die Option "Daten erhalten"

Große Ausnahme ist Suse Linux: bitte in jedem Fall Suse sich selbst verwalten lassen. Yast ist so krank, das es einfach unbekannte booteinträge entfernt. (eigene leidvolle Erfahrung)

Darüber hinaus kann es sinnvoll sein, beim Einsatz von Software-RAID ebenfalls eine eigene Boot-Partition zu erstellen. Vergl. dazu c't 01/2008, Seite 188 ff..

Weiterhin Sinn macht eine eigene Partition für das Härten eines Rechners, die Partition ist im Normalbetrieb nur lesbar oder gar nicht eingehangen und wird bei einem Update des Kernels rw eingehängt. Damit ist eine Kompromittierung des Kernels erschwert. Das macht auf normalen Desktoprechnern jedoch keinen Sinn!

Über die oben genannten Fälle hinaus ist es nicht notwendig, eine eigene Partition für /boot zu benutzen und hängt vom persönlichen Geschmack des Benutzers/Administrators ab, möglich ist es natürlich immer.

Hilfe im Notfall

Grub deinstallieren

Folgende Situation: Auf einer Festplatte sind sowohl Windows als auch Linux installiert. Die Auswahl des betreffenden OS erfolgt über GRUB. Nun wird mittels der Datenträger-Verwaltung in Windows die gesamte Linux-Partition gelöscht und neu formatiert (NTFS), dann wird ein Neustart des Sytems versucht.

Problem: Windows startet nicht mehr, weil das OS über GRUB gestartet werden müßte, GRUB aber mit der Linux-Partition gelöscht worden ist.

Frage: Wie kriegt man nun das Windows wieder zum Laufen?

Deinstallation über Windows

Antwort:

Deinstallation über Linux

Alternativ-MBR-Methode

Auf fast jeder Linux-Live-CD (wie z.B. der ["grml"] ist das Programm install-mbr vorhanden.

Mit dem Befehl

# install-mbr -p 1 /dev/hda

Wird die Partition 1 der Festplatte hda gebootet.

Weiterführende Infos:

Lösch-Methode

Um nur den MBR zu entfernen einfach die entsprechenden Stellen wipen:

# dd if=/dev/zero of=/dev/hdX bs=446 count=1

Danach noch zu bootenden Partionen aktiv und bootfähig setzen (z.B. mit cfdisk).

Bootloader reparieren

So kommt man schnell bei einem zerschossenen System wieder zu einem Bootloader:

sudo -s
# root-Partition schreibbar (mit Devices für chroot) zugänglich machen:
mount -o rw,dev /dev/hda8 /mnt/hda8
# Alle notwendigen grub-Dateien auf /mnt/hda8/boot/grub installieren
# und grub-Masterboot-Sektor auf /dev/hda schreiben
grub-install --root-directory=/mnt/hda8 \(hd0\)
# update-grub arbeitet immer auf /boot:
chroot /mnt/hda8
# menu.lst erzeugen:
update-grub
exit
reboot

Hier noch eine Alternative, die auch auf Knoppix beruht:

sudo -s
# root-Partition schreibbar zugänglich machen:
mount -o rw /dev/hda2 /mnt/hda2
# Nun das /boot der Knoppix mit dem originalen /boot tauschen
rmdir /boot
link /mnt/hda2/boot /boot
# Nun nur noch grub aufrufen
grub
# Und Grub sagen, dass Root auf hda2 ist
grub# root (hd0,1)
# Und dass er den MBR schreiben soll
grub# setup (hd0)
# Und Grub verlassen
grub# quit
# Und Neustart
reboot

noch wesentlich einfacher ist es, beim start einer live-CD wie kannotix nicht über das grub der live-CD hinauszugehen, sondern

* die auswahl abzubrechen mit 'esc','ok'
* dann 'c' für console zu drücken und
* root (hd0,..) zu schreiben, wobei (hd#,#) die BIOS-schreibweise für die grub-enthaltende partition darstellt. BIOS zählt die # ab 0, dh nicht iwe linux. mit der expansion der bezeichnung mit tab wie in bash kann die richtigkeit kontrolliert werden.
* setup (hd0)
* reboot

fertig!

Grub Diskette

Um ein System mit zerschossenem GRUB wieder gangbar zu machen, kann eine Grub-Diskette sehr hilfreich sein.

fdformat /dev/fd0H1440
mkfs -t ext2 /dev/fd0
mount /dev/fd0 /mnt/floppy
grub-install --root-directory=/mnt/floppy /dev/fd0

Einige Systeme kennen auch den Befehlt grub-floppy zum direkten Erstellen einer Grub Diskette

grub-floppy /dev/fd0

Wenn man von dieser Diskette startet, kommt man in die Grub-Shell und kann dort z.B. mit

root (hd0,0)
configfile /boot/grub/grub.conf

seine normale Konfiguration laden. Alternativ kann man natürlich auch alle möglichen Grub Befehle manuell eingeben.

Besonders nützlich ist der Befehl find, wenn man nicht weiß, auf welcher Partition der Kernel etc. liegt.

find /boot/vmlinuz

siehe auch: http://home.datacomm.ch/donittel/Grub_startet_linux_NotfallBoot bzw. http://home.tiscalinet.ch/donittel/Grub_startet_linux_NotfallBoot

Das passende Image dazu: http://home.datacomm.ch/donittel/grubdisk.img

Mehrere Festplatten

Falls mehrere Festplatten angeschlossen sind und immer noch kein Bootmenu angezeigt wird (z.B. bei "MBR Error 1") sollte unbedingt noch die im BIOS eingestellte Boot-Reihenfolge (der Festplatten) kontrolliert werden. Hier sollte nach den Wechseldatenträgern wie z.B. dem DVD-Laufwerk, die Festplatte am Anfang stehen, in der auch GRUB - wie zuvor beschrieben - installiert wurde.

VGA Parameter

und überhaupt, 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. Nochwas: framebuffer (kann) ist sehr langsam!

Codetabelle für VGA

col/res

640x400

640x480

800x600

1024x768

1152x864

1280x1024

1600x1200

1680x1050

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)

0x368 (872)

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

0x369 (873)

Grub auf einen USB-Stick installieren

Heutige PC's sind inzwischen fast alle in der Lage, von einem USB-Stick zu booten. Das kann durchaus sinnvoll sein, z.B. wenn das booten von Festplatte nicht mehr klappt, weil Windows den Bootsektor wieder überschrieben hat ... Die Methoden, die man dazu im Internet findet, um einen USB-Stick zum booten zu bringen haben mich aber alle nicht befriedigt und so hab ich ein wenig experimentiert, in der Hoffnung es ohne die sonst übliche Kombination aus FAT32 und syslinux hinzubekommen und ich war überrascht, wie einfach es letztendlich ist. Alles was man dazu braucht, ist ein per Grub bootbares Linux.

Ich beschreibe im folgenden die Installation von Grub auf einem 4GB USB-Stick wobei in meinem Fall reiserfs als Dateisystem auf dem Stick zum Einsatz kam, es geht aber ganuso mit ext2, ext3 vfat...

Der erste Schritt ist das anpassen der device.map in /boot/grub/ - diese Änderung kann am Ende des Prozesses einfach wieder gelöscht werden, da es sich nur um eine einzige Zeile handelt, die hinzugefügt werden muß.

Meine device.map sieht in etwa so aus:

root@linuxbox>cat /boot/grub/device.map
(hd0)   /dev/sda
(hd1)   /dev/sdb
(hd2)   /dev/sdc
(hd3)   /dev/sdd

Es handelt sich hierbei um meine vier SATA-Platten, mein USB-Stick wird nach dem einstecken zu /dev/sde. Um ihn anzusprechen ergänze ich die device.map um eine Zeile wobei man das X gegen den entsprechenden Gerätebuchstaben austauschen muß.

root@linuxbox>echo "(hd4) /dev/sdX" >> /boot/grub/device.map

Ab jetzt kennt grub auch meinen USB-Stick. Um diesen jetzt bootbar zu machen müssen noch ein paar Dateien kopiert werden. Der folgende Ausschnitt zeigt das exemplarisch für einen mit ReiserFS formatierten Stick. Für ein anderes Dateisystem muß nur das entsprechende Stage-File mitkopiert werden.

#Mounten der ersten Partition des USB-Stick nach /mnt
root@linuxbox>mount /dev/sde1 /mnt/

#Das Verzeichnis für die Grub-Startdateien anlegen
root@linuxbox>mkdir -p /mnt/boot/grub

#Kopieren der benötigten Dateien
root@linuxbox>cp -v /boot/grub/stage* /mnt/boot/grub/
„/boot/grub/stage1“ -> „/mnt/boot/grub/stage1“
„/boot/grub/stage2“ -> „/mnt/boot/grub/stage2“

#Kopieren der Dateisystemspeziefischen Datei (also hier reiserfs)
root@linuxbox>cp /boot/grub/reiserfs_stage1_5 /mnt/boot/grub/

Damit sind alle benötigten Dateien auf dem Stick. Man kann ihn jetzt sogar schon wieder unmounten, muß aber nicht.

Ist die device.map angepasst, kann man jetzt einfach in die Grub-Shell wechseln, die USB-Partition als Grub-Root definieren und setup aufrufen, den Rest erledigt der Grand Unified Bootloader für einen.

root@linuxbox>grub


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename. ]
grub>root (hd4,0)
 Filesystem type is reiserfs, partition type 0x83
grub>setup (hd4)
setup (hd4)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/reiserfs_stage1_5" exists... yes
 Running "embed /boot/grub/reiserfs_stage1_5 (hd4)"...  18 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd4) (hd4)1+18 p (hd4,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.
grub>quit

Ab jetzt ist der Stick bootbar und sollte wenn man von ihm startet eine Grub-Console beim Starten bringen. Aber was ist jetzt passiert, eine kurze Erklärung.

Der Aufruf von root (hd4,0) sagt grub, dass ab jetzt ein neues Wurzelverzeichnis für ihn gilt, auf das sich sie folgenden Operationen beziehen. Er erkennt dabei, dass es sich um eine mit ReiserFS formatierte Platte handelt. Der Aufruf von setup (hd4) sorgt dafür, dass Grub einen Bottsektor schreibt, und zwar mit den Informationen die für die Formatierung wichtig sind. Dafür ist das reiserfs_stage1_5 zuständig. Damit kann Grub jetzt ReiserFS formatierte Partitionen lesen.

Ab jetzt ist es Geschmackssache, was man damit macht. device.map anlegen - ist aber kein muß, menu.lst anlegen, Kernel eintragen ...

Mal schauen was mir noch so einfällt, vom Mini-Linux über bootbare ISO's gibt es ja doch einiges an Möglichkeiten.

Links

  1. Das ist nicht unbedingt /dev/hdb1 -- wenn es keine hdb gibt, ist es hdc; wenn es nur SCSI gibt, ist es vielleicht /dev/sdb2 usw. (1)

GRUB (zuletzt geändert am 2011-11-11 22:16:24 durch kobz-4d0016ff)