27.4 Bootmanager
In diesem Abschnitt soll es um die Bootmanager gehen, mit denen man Linux (und andere Betriebssysteme) hochfahren kann. Bootloader mit einem Auswahlmenü werden in der Regel im Master Boot Record (MBR) platziert [Fn. Theoretisch kann man einen Bootloader auch in den ersten Sektor einer Partition stecken, was jedoch nur selten sinnvoll ist.] und dazu verwendet, beim Start des Computers eines von mehreren installierten Betriebssystemen zu starten.
Typische Bootmanager sind GAG und die beiden besonders populären Vertreter LILO und GRUB. Viele Distributionen sind mittlerweile vom »alten« Linux Loader (LILO) zu GRUB(2) gewechselt, doch es gibt auch einige, etwa Slackware-Linux, die noch immer den LILO verwenden. Wir werden in diesem Buch daher beide Bootmanager besprechen.
27.4.1 GRUB (alte Version)
Die großen Linux-Distributionen wie Debian, Ubuntu und openSUSE setzen allesamt GRUB als Bootmanager ein. Die Software ist so komfortabel, dass man sich in der Regel um nichts kümmern muss. Modifiziert man die GRUB-Konfiguration jedoch von Hand, sind folgende Schritte notwendig:
- In den MBR installieren
- Die Kernel-Liste updaten
Möchte man den Bootmanager in den Bootsektor der ersten Festplatte installieren, ruft man einfach grub-install mit der Gerätedatei der entsprechenden Festplatte als Argument auf:
Listing 27.1 grub-install
# grub-install /dev/hda
Installation finished. No error reported.
[...]
(hd0) /dev/hda
Neuer Kernel?
Im Normalfall erkennt GRUB alle installierten Kernel und alle weiteren Betriebssysteme auf der Platte automatisch. Um diese Erkennung nach der Installation eines neuen Kernels jedoch manuell noch einmal anzustoßen, genügt folgender Aufruf:
Listing 27.2 update-grub
# update-grub
Searching for GRUB installation directory ... \
found: /boot/grub
Testing for an existing GRUB menu.list file ... \
found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping
Found kernel: /boot/vmlinuz-2.6.14-2-686
Found kernel: /boot/vmlinuz-2.6.8-2-386
Updating /boot/grub/menu.lst ... done
Dieses Skript wurde für Debian entwickelt, ist aber auch für andere Distributionen verfügbar. Zum Standardumfang des GNU-GRUB-Projekts gehört es jedoch leider nicht.
Die Datei /boot/grub/menu.lst
Sie kommen also möglicherweise in die Verlegenheit, die menu.lst selbst editieren zu müssen. Da dies bei der Benutzung von update-grub automatisch geschieht, sollte man nur die Direktiven ändern, die einfach kommentiert sind. Doppelte Kommentare nach zwei Rauten sind dabei erst normale Kommentare, und alles, was nicht kommentiert ist, wird automatisch erstellt. Möchte man zum Beispiel die allen Kerneln gemeinsamen Bootoptionen ändern, editiert man folgende Zeile:
Listing 27.3 menu.lst mit update-grub
## e.g. kopt=root=/dev/hda1 ro
## kopt_2_6_8=root=/dev/hdc1 ro
## kopt_2_6_8_2_686=root=/dev/hdc2 ro
# kopt=root=/dev/hda5 ro
Für GRUB ist diese Zeile ein Kommentar, für update-grub jedoch nicht. Darum werden nach einem erneuten Aufruf des Skripts auch alle Einträge des Kernels automatisch angepasst. Verzichtet man selbst oder eben die Distribution der Wahl auf dieses Skript, so muss man für einen neuen Kernel einen neuen Eintrag nach folgendem Beispiel einfügen:
Listing 27.4 Ein Eintrag im Bootmenü
title Debian GNU/Linux, kernel 2.6.8-2-386
root (hd0,1)
kernel /boot/vmlinuz-2.6.8-2-386 root=/dev/hda1 ro
initrd /boot/initrd.img-2.6.8-2-386
savedefault
boot
Dieses Beispiel ist weitestgehend selbsterklärend; einzig die Wurzel des Dateisystems muss dem Kernel wie auch GRUB extra mit auf den Weg gegeben werden. Schließlich befindet sich die Datei /etc/fstab mit diesen Informationen ja auf der Partition, die man einbinden will.
[»]Wenn Sie beim Booten etwas in diesen Einstellungen ändern wollen, drücken Sie einfach die Taste E. GRUB erlaubt Ihnen dann, den entsprechenden Eintrag quasi zur Laufzeit anzupassen. Sollen die Änderungen jedoch dauerhaft gespeichert werden, müssen Sie sie noch in der Datei menu.lst fixieren.
Wenn Sie mehr über GRUB erfahren möchten, sei Ihnen die Manpage sowie die Homepage des Projekts auf gnu.org ans Herz gelegt.
27.4.2 GRUB Version 2
Gegenüber der Vorgängerversion bietet GRUB2 einige Vorteile, darunter die Unterstützung für weitere Dateisystemtypen und UUIDs (also die neuen Identifikationsnummern für Dateisysteme). Bei neueren Versionen von Ubuntu Linux sowie einigen weiteren Distributionen ist GRUB2 mittlerweile der Standard-Bootloader. Die Konfiguration von GRUB2 erfolgt über die Datei /etc/default/grub, die Sie im folgenden Listing sehen.
Listing 27.5 Die Datei /etc/default/grub unter Debian 6
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""
GRUB_DEFAULT=0 legt fest, dass der erste (0.) Booteintrag standardmäßig im GRUB-Menü ausgewählt werden soll. Ansteller einer Zahl kann auch ein String für die Bezeichnung des jeweiligen Eintrags oder das Wort »saved« angegeben werden, womit der zuletzt gebootete Eintrag automatisch beim nächsten Boot vorselektiert wird. Um »saved« verwenden zu können, sollte zudem GRUB_SAVEDEFAULT=true gesetzt werden, was bewirkt, dass sich GRUB2 auch tatsächlich den zuletzt gebooteten Eintrag abspeichert.
GRUB_TIMEOUT=5 legt die Zeitspanne (in Sekunden) fest, die gewartet werden soll, bis der Standardeintrag gebootet wird. Wird der Timeout-Wert auf 0 gesetzt, wird sofort gebootet, ohne dem Benutzer eine Auswahlmöglichkeit zu bieten. Falls Sie Ihrer Linux-Distribution einen eigenen Namen vergeben möchten, können Sie zudem die Zeile GRUB_DISTRIBUTOR anpassen. Die beiden Zeilen GRUB_CMDLINE_LINUX und GRUB_CMDLINE_LINUX_DEFAULT übergeben Parameter an den Kernel, wobei beide Variablen für den normalen Bootmodus gelten, aber nur GRUB_CMDLINE_LINUX auch für den Recovery-Bootmodus verwendet wird.
Die Konfiguration der Booteinträge und des Bootscreens erfolgt über die Dateien im Verzeichnis /etc/grub.d, wobei gilt, dass die Skripte mit dem niedrigsten Nummernprefix zuerst ausgeführt werden. Es handelt sich hierbei um relativ komplexe Shellskripte, weshalb wir ihre Innereien hier nicht im Einzelnen besprechen können. Mit Hilfe des Wissens aus den vorherigen Kapiteln zur Shell und zur Shellskriptprogrammierung werden Sie allerdings in der Lage sein, sie zu verstehen.
Listing 27.6 /etc/grub.d
/etc/grub.d$ /bin/ls
00_header 10_linux 30_os-prober 41_custom
05_debian_theme 20_linux_xen 40_custom README
Das Programm grub-mkconfig verwendet die Dateien in /etc/grub.d und die Einstellungen, die in /etc/default/grub angegeben wurden, um daraus die eigentliche Konfigurationsdatei für GRUB2, nämlich /boot/grub/grub.cfg, zu generieren. In der Regel brauchen Sie dazu aber nur update-grub aufzurufen, welches grub-mkconfig von sich aus aufruft. [Fn. Im Detail ruft update-grub genau grub-mkconfig -o /boot/grub/grub.cfg auf.] In der grub.cfg finden Sie anschließend auch die zur Verfügung stehenden Booteinträge und weiteren Konfigurationswerte für GRUB2 (etwa das Laden von Video-Modulen für die grafische Ausgabe oder die Konfiguration von Farbeinstellungen). Wenn Sie sich die Datei anschauen, werden Sie feststellen, dass der Aufbau gemäß der durchnummerierten Skripte in /etc/grub.d gestaltet ist. Die weniger wichtigen Designparameter werden an dieser Stelle nicht besprochen und sind zum Großteil selbst erklärend, doch ist es wichtig und interessant, einen Menüeintrag zu verstehen. Ein solcher Menüeintrag in der Datei sieht folgendermaßen aus (die Backslash-Zeichen signalisieren einen Umbruch, den wir zur besseren Lesbarkeit eingefügt haben und der in der Originaldatei nicht vorkam):
Listing 27.7 Auszug aus der grub.cfg
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-686'\
--class debian --class gnu-linux --class gnu \
--class os {
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set \
fbe90871-9893-4899-aefb-4e6377e114bc
echo 'Loading Linux 2.6.32-5-686 ...'
linux /boot/vmlinuz-2.6.32-5-686 \
root=UUID=fbe90871-9893-4899-aefb-4e6377e114bc \
ro quiet
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-2.6.32-5-686
}
Um den Eintrag zu verstehen, sollten wir zunächst den generellen Aufbau eines Menüeintrags betrachten:
Listing 27.8 Der Aufbau von menuentry
menuentry Titel [--class=Klasse ..] [--users=Benutzer ..] \
[--hotkey=Taste] { Konfigurationsbefehle }
Die Angabe eines Titels für den Menüeintrag ist selbsterklärend. Klassen dienen der Gruppierung von Einträgen und sind optional, sie können für unterschiedliche Darstellungen von Menüeinträgen verwendet werden. Mit Benutzerzuordnungen (ebenfalls optional) kann der Zugriff auf den Menüeintrag bestimmten Benutzern vorbehalten werden (diese müssen allerdings erst in GRUB angelegt werden). Mit hotkey lässt sich dem Eintrag eine Taste zuordnen. Wird diese gedrückt, wird der entsprechende Eintrag ausgewählt. Auch für Hotkeys gilt: Es ist kein Muss, sie zu vergeben.
Betrachten wir nun die restlichen Komponenten des menuentry-Eintrags. insmod lädt ein dynamisches GRUB-Modul in den Speicher, während set Umgebungsvariablen setzt. Mit search werden bootbare Partitionen gesucht, wobei --set der Variable root das erste gefundene Gerät zuweist. Alternativ können mit set auch andere Variablen gesetzt werden, wobei diese dann direkt angegeben werden müssen: --set=Variable. Mit --no-floppy wird verhindert, das Diskettenlaufwerke durchsucht werden. --fs-uuid bewirkt, dass search nach einer bestimmten UUID (nämlich der am Zeilenende angegebenen) sucht.
echo erzeugt wie in der Shell eine Ausgabe, und linux bewirkt, dass ein Linux-Kernel gestartet werden soll. Die Angabe des Bootkernels und der zu verwendenen UUID (die zuvor über search ermitelt wurde, und weitere Bootparameter für den Kernel können dort angeben werden. Mit initrd wird hingegen die RAM-Disk spezifiziert, die verwendet werden soll.
27.4.3 LILO
Der ältere und etwas weniger komfortable LILO (Linux Loader) wird über die Datei /etc/lilo.conf konfiguriert. Diese Datei wird von den meisten Distributionen automatisch durch Tools wie liloconfig erzeugt. Mithilfe dieser Datei wird schließlich auch die Installation des LILO im MBR vollzogen. Die bisher im LILO konfigurierten Betriebssysteme kann man mit dem Tool /sbin/lilo abfragen.
Listing 27.9 lilo -q
# lilo -q
Slackware102 *
Windows2000
Betrachten wir einmal eine Beispielkonfiguration, um die einzelnen Konfigurationsoptionen zu verstehen.
Listing 27.10 /etc/lilo.conf
boot = /dev/hda
delay = 10
prompt
lba32
menu-title="Bootmenue Host yorick.sun"
# Linux-Partition
image = /boot/vmlinux
root = /dev/hda3
label = Slackware102
read-only
# Windows-Partition
other = /dev/hda1
table = /dev/hda
label = Windows2000
Mit dem Schlüsselwort boot gibt man die Festplatte an, die den Bootsektor enthält – in diesem Fall also /dev/hda, die erste IDE-Festplatte. Die Zeit, die LILO warten soll, bis das Standardbetriebssystem gebootet wird, wird via delay angegeben. Durch prompt erscheint die Eingabemöglichkeit, in der das Bootlabel angegeben werden kann, das LILO laden soll.
Falls Sie jenseits der 1024-Zylinder-Grenze booten möchten, so müssen Sie LILO bei der Konfiguration noch das Schlüsselwort lba32 mit auf den Weg geben, um den Bootvorgang in diesem Fall überhaupt zu ermöglichen. Via menu-title wird, wie Sie vielleicht schon ahnen, der Titel des LILO-Menüs angepasst.
Mit image geben Sie an, wo sich der Linux-Kernel befindet. Da dies allein aber noch nicht ausreicht, weil eine Datei auf mehreren Partitionen vorhanden sein könnte, müssen Sie auch noch angeben, von welcher Partition der Kernel geladen werden soll – hierzu nutzen Sie root=xxx. Die Option label verpasst dem Eintrag im Bootmenü einen Namen.
Unter Linux wird das Root-Dateisystem aus Sicherheitsgründen zunächst nur mit Leserechten gemountet, daher das Schlüsselwort read-only. Später wird es dann mit Schreibzugriff gemountet. Sie können mit read-write aber auch erzwingen, dass es gleich während des Bootvorgangs mit Schreibzugriff gemountet wird.
Um ein System, bei dem es sich nicht um Linux handelt, als Booteintrag zu verwenden, gibt man dies durch other an. Mit table wird noch spezifiziert, wo die Partitionstabelle liegt.
LILO installieren
Um den LILO im Bootsektor zu installieren, rufen Sie /sbin/lilo auf.
Listing 27.11 LILO installieren
# /sbin/lilo
Added Slackware102 *
Added Windows2000
[»]Um den LILO wieder aus dem Bootsektor zu entfernen, rufen Sie lilo -u auf.
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.