Wie funktioniert eigentlich der Systemstart? Wir erklären, woher Ihr Computer weiß, welches Betriebssystem er starten soll, und wie sich die gängigen Bootloader von Linux und Windows unterscheiden.
Grub, Lilo und ntldr – vielleicht haben Sie diese Namen bereits gehört und sich gefragt, was es eigentlich damit auf sich hat. Oder Sie haben Ihren Computer beim Starten beobachtet und sich dabei gefragt, woher der Rechner eigentlich weiß, welches Betriebssystem er starten soll. Der Bootvorgang eines Computers ist grundlegend für die Funktion der Maschine und trotzdem vielen Anwendern ein Rätsel. Wenn es Ihnen genauso geht, hilft Ihnen dieser Artikel dabei, den gesamten Bootvorgang zu verstehen.
Aller Anfang
Was ist eigentlich die “Stunde 0” des Bootvorgangs? Um dies zu erfahren, ist es notwendig, dass Sie sich zunächst die Schritte vor Augen halten, die beim Start eines Computers nacheinander ablaufen. Nach dem obligatorischen Druck auf die Einschalttaste sehen Sie zunächst einige Meldungen über die in Ihrem Computer vorhandene Hardware. Diese kommen nicht von einem Betriebssystem, das zu diesem Zeitpunkt bereits geladen wäre, sondern vom so genannten BIOS Ihres Computers. Die Abkürzung BIOS steht für “Basic Input Output System” und ist salopp gesagt die “Firmware” Ihres Mainboards. Es ist auf Standard-PCs die erste Software überhaupt, die läuft. Sie liegt auf einem auf das Mainboard montierten Flashspeicher und wird unmittelbar nach der Aktivierung der Stromzufuhr ausgeführt.
Das BIOS hat mehrere Aufgaben: Zunächst sammelt es Informationen über die in Ihrem Computer vorhandene Hardware. Dazu gehören eine Liste der Laufwerke in Ihrem PC sowie eine Auflistung der installierten Erweiterungskarten, eine Übersicht über die eingesetzten RAM-Bausteine und nicht zuletzt auch der Blick auf die Temperaturdaten, welche die einzelnen Sensoren übermitteln. Wenn das BIOS eine vollständige Liste der verfügbaren Laufwerke hat, setzt es den Systemstart, also den eigentlichen Boot-Prozess, in Gang. Am Anfang eines PC-kompatiblen Datenträgers (dazu gehören Disketten und CDs bzw. DVDs genauso wie Festplatten) kann sich eine so genannte Bootsignatur befinden. Diese ist ein nach strengen Regeln konzipierter kleiner Bereich auf dem Datenträger, in dem Informationen zu dem zu startenden Betriebssystem liegen. Das BIOS prüft nach dem Finden der vorhandenen Laufwerke jedes einzelne Laufwerk auf einen solchen Eintrag hin. Die Reihenfolge, in der dies geschieht, können Sie in den BIOS-Einstellungen Ihres Computers festlegen. Traditionell versucht das BIOS zunächst, die “Bootrecords” auf Disketten zu finden. Wenn es dort keine passenden Bereiche gibt oder der Computer über gar kein Diskettenlaufwerk verfügt, durchsucht das BIOS den nächsten festgelegten Datenträger – entweder das CD-/DVD-Laufwerk oder die Festplatte.
Der Master Boot Record
Festplatten, die für den Bootvorgang mit einem PC vorgesehen sind, verfügen immer über einen “Master Boot Record”, in dem neben eventuell hinterlegten Boot-Einträgen auch die Partitionstabelle der Platte liegt. Jede Festplatte hat mindestens eine Partition – in der Praxis sind große Laufwerke oft in mehrere Partitionen eingeteilt. Das BIOS Ihres Computers schaut dabei zunächst nach Einträgen im Master Boot Record der Festplatte, die zu einem startfähigen System führen. Findet es unmittelbar im MBR einen solchen, übergibt es die Kontrolle an die im MBR gespeicherte Software. Die einfachste Variante eines MBR-Bootloaders ist eine kleine Routine, welche die Partitionstabelle ausliest und auf einer als “aktiv” markierten Partition nach einem weiteren Bootloader sucht, der dort im Bootsektor liegt. Der Bootsektor einer Partition heißt analog zum MBR “Partition Boot Record” (PBR).
Verläuft die Suche nach einem Bootloader ergebnislos, hält das BIOS den Bootvorgang an und gibt eine Fehlermeldung aus.
Der erste Teil der Frage, wie der Bootvorgang überhaupt funktioniert, ist damit beantwortet. Offen bleibt, wie die kleinen Programme, die in den Bootrecords der Laufwerke oder Partitionen liegen, arbeiten. Dazu betrachten wir im Folgenden Grub, Lilo und die Bootloader von Windows XP.
Wer anderen eine GRUBe gräbt
Grub hat sich mittlerweile zum Standard-Bootloader der Linux-Distributionen gemausert und findet auf praktisch allen Linux-Systemen Verwendung. Dabei ist das Programm im Vergleich zum Lilo, dem “Linux Loader”, noch gar nicht so alt. Die Vorteile, die es gegenüber Lilo hat, sind allerdings erheblich. Zunächst war Grub nur als Bootloader für das Betriebssystem des GNU-Projekts gedacht, das den Namen “GNU Hurd” trägt. Weil es allerdings noch einige Zeit dauern wird, bis Hurd tatsächlich benutzbar ist, der Bootloader Grub aber ganz am Anfang der Hurd-Entwicklung bereits existierte und gute Dienste leistete, ist das Programm mittlerweile viel verbreiteter als Hurd selbst.
Grub besteht aus mehreren Komponenten. Der Teil, an den das BIOS die Kontrolle übergibt, heißt im Fachjargon “Stage 1” – Etappe 1. Die Stage 1 hat keine besondere Funktion – ihre einzige Aufgabe ist es, die “Stage 2” nachzuladen. Der Platz innerhalb des Master Boot Records ist nämlich begrenzt und für den gesamten Bootloader-Code von Grub viel zu klein. Die Stage 2 wiederum enthält den gesamten Bootloader inklusive der Informationen, die Grub benötigt, um im Anschluss ein Betriebssystem zu laden. Sie ist eine Datei, die schon nicht mehr im Boot Record liegt, sondern im Linux-Dateisystem; Sie finden sie meist unter /boot/grub/stage2. Der einzige veränderliche Inhalt der Stage 1 ist dann auch die physikalische Adresse der Stage 2 auf dem Laufwerk.
Wie es nach dem Laden der Stage 2 weitergeht, hängt einerseits von der Konfiguration von Grub ab und andererseits vom Betriebssystem, das Grub starten soll: Ein Linux-System hat ganz andere Voraussetzungen für den Start als beispielsweise Windows oder eine der BSD-Varianten.
In allen Fällen muss das, was Grub in dieser Phase des Bootvorgangs tut, am Ende zu einem laufenden Betriebssystemkernel führen, an den Grub die Kontrolle über den Computer abgibt. In dem Moment, in dem Grub einen Kernel gestartet hat, ist der eigentliche Bootvorgang im Grunde beendet – zumindest, wenn man den Begriff so auslegt, dass er lediglich das Starten eines Betriebssystems bezeichnet. Alles, was nach diesem Augenblick passiert, wird unmittelbar vom Kernel eines Systems und nicht mehr vom Bootloader beeinflusst. Eine Ausnahme von dieser Regel bildet das Chainloading, das weiter unten noch Thema sein wird.
Die Funktionsweise von Grub
Nachdem die Stage 1 von Grub die Stage 2 nachgeladen hat, landen Sie in den meisten Fällen im Bootmenü von Grub – falls Grub nicht so eingestellt ist, dass er automatisch einen Betriebssystemkernel lädt. Damit die Stage 2 das eigentliche Betriebssystem starten kann, liest sie die Konfigurationsdatei von Grub und wertet sie aus – das geht nur, weil Grub auch eigene Dateisystemtreiber für die wichtigsten bekannten Dateisysteme enthält, zum Beispiel für Ext2/Ext3, ReiserFS und XFS.
Es kommt auf das Zusammenspiel der einzelnen Komponenten von Grub an: Die Grub-eigenen Dateisystemtreiber erlauben es dem Bootmanager, beliebige Dateien von der Platte zu lesen – zum Beispiel seine eigene Konfigurationsdatei /boot/grub/menu.lst, in der steht, wo ein lauffähiger Linux-Kernel liegt. Wird einer dieser Einträge ausgewählt, liest Grub den Kernel aus dem Dateisystem und aktiviert den Kernel. Damit ist die Arbeit von Grub beendet.

Abbildung 1: Nachdem Grub seine Konfigurationsdatei gelesen hat, zeigt er das Bootmenü an – hier in der Suse-Version mit winterlicher Untermalung.

Abbildung 2: Flexibel wie Grub ist, lässt es Anwender noch beim Booten Einstellungen ändern und etwa den Kernel von einer anderen Partition laden.
Chainloading
Zwar ist Grub im Gegensatz zu Lilo bereits sehr universell konzipiert, es wäre allerdings zu viel verlangt, sämtliche für PCs erhältlichen Betriebssysteme direkt starten zu können. Da fremde Betriebssysteme ihren eigenen Bootloader mitbringen, können Grub und Lilo einen solchen Fremd-Bootmanager aufrufen. Im Standard-Setup mit Windows und Linux auf einer Platte liegt Lilo oder Grub im MBR und startet von dort wahlweise direkt den Linux-Kernel oder aktiviert den Windows-Bootmanager, der im Partions Boot Record (PBR) der Windows-Partition liegt. Weil hier zwei Bootloader “in einer Kette” zusammenarbeiten, heißt das Prinzip “Chainloading” (von englisch: “chain” = “Kette”).
Es ist auf diese Weise auch möglich, mehrere Linux-Bootloader auf einer Platte zu installieren, die sich gegenseitig aktivieren – die beiden Beispiel-Konfigurationsdateien im Kasten Beispiel-Grub-Konfiguration würden genau so etwas erledigen.
Beispiel-Grub-Konfiguration
In der folgenden Beispielkonfiguration rufen sich zwei Grub-Bootmanager gegenseitig auf:
Der Rechner enthält folgende Partitionstabelle (jeweils vorne die Standardbezeichnung mit der Linux-Gerätedatei und hinten die Partitionsbezeichnung, wie Grub sie verwendet):
hda1/(hd0,0): Laufwerk C: von Windowshda2/(hd0,1): Root-Dateisystem von OpenSuse 10.3hda3/(hd0,2): Root-Dateisystem von Ubuntu 7.10hda4/(hd0,3): Linux Swap
Auf hda (also im MBR der Festplatte) ist der Grub von OpenSuse 10.3 mit folgender Konfigurationsdatei installiert:
default 0
title OpenSuse 10.3
root (hd0,1)
kernel /vmlinuz-2.6.18 root=/dev/hda2 ro
title Chain: Ubuntu Bootmanager
root (hd0,2)
chainloader +1
title Chain: Windows
root (hd0,0)
chainloader +1
Im Partition Boot Record (PBR) der Ubuntu-Partition sitzt der Ubuntu-eigene Grub mit folgender Konfigurationsdatei:
default 0
title Ubuntu 7.10
root (hd0,2)
kernel /vmlinuz-2.6.20 root=/dev/hda3 ro
title Chain: OpenSuse Bootmanager
root (hd0)
chainloader +1
title Chain: Windows
root (hd0,0)
chainloader +1
Der Aufbau ist ähnlich, und über die Einträge Chain: Ubuntu Bootmanager und Chain: OpenSuse Bootmanager ist nun möglich, endlos zwischen den beiden Grub-Menüs hin und her zu wechseln.
Der Vorfahr: Lilo
Grub hat den älteren Bootloader Lilo sehr schnell verdrängt: Lilo ist technisch deutlich simpler aufgebaut als Grub – die einzige Information, die Lilo in den Bootloader schreibt, ist die physikalische Adresse auf dem Laufwerk, an der ein bootfähiger Kernel zu finden ist. (Bei Einsatz einer Initial Ramdisk gilt das Gleiche für deren Adresse.)
Deswegen muss Lilo nach jeder Änderung am Kernel oder an der Konfiguration neu (mit /sbin/lilo) in den Boot Record installiert werden, während Grub nur bei der allerersten Einrichtung (mit /sbin/grub-install) eingerichtet wird – Änderungen an der Konfiguration wirken sich hier unmittelbar auf den nächsten Systemstart aus.
Windows-XP-Bootloader
Zum Schluss kann ein Blick über den Tellerrand nicht schaden, denn auch bei anderen Betriebssystemen stellt sich das Bootloader-Problem in ähnlicher Weise. Der mit Abstand am häufigsten benutzte Bootloader dürfte der von Windows sein – er arbeitet grundlegend anders als Grub.
Das liegt nicht zuletzt daran, dass der Windows-Bootloader nie dafür vorgesehen war, etwas anderes als Windows zu booten. Trotzdem gleicht er Grub in gewisser Weise: Der eigentliche Bootblock ist ähnlich wie die Stage 1 lediglich ein kleines Stück Code, in dem die Adresse der Datei ntldr vermerkt ist. Diese wird geladen und setzt danach die Datei ntdetect.com in Gang, bevor sie schließlich die Konfigurationsdatei boot.ini ausliest und entsprechend der Einstellungen in dieser Datei fortfährt.

Abbildung 3: Meist sieht man den Windows-Bootloader nur, wenn etwas schief gegangen ist – dann hat man die Wahl zwischen normalem Starten und einem abgesicherten Modus.
Wenn die für ein Bootmenü zuständige Option in boot.ini aktiviert ist (in der Standardversion ist sie das nicht) – sehen Sie beim Start einen Auswahlbildschirm, aus dem Sie ein Betriebssystem auswählen müssen. Windows aktiviert dieses Menü nur in den Konstellationen automatisch, in denen Sie eine neue Windows-Version installiert haben, ohne ein bereits vorhandenes älteres Windows zu löschen.
Da auch der Windows-Bootmanager Chainloading unterstützt, können Sie Grub oder Lilo in den PBR der Linux-Partition installieren und dann mit Hilfe des Programms Grub4DOS [2] (einer speziellen Version von Grub) einen Eintrag in boot.ini erzeugen und Linux über den Windows-Bootloader aktivieren. Grub4DOS sucht auf allen Partitionen nach einer Datei namens menu.lst und öffnet die erste, die es findet. Den Windows-Bootmanager verwendet auch das Programm WUBI (Windows Ubuntu Installer).
Vista hat ein vollständig neues Bootkonzept namens BCD (Boot Configuration Data), das mit dem alten Bootloader von Windows NT bis XP nichts mehr zu tun hat. Es wird über bcdedit konfiguriert und ist komplexer und mächtiger als der alte Bootmanager. Auch BCD beherrscht kann andere Linux-Partitionen aktivieren.
Zukunftsmusik
Das Bootschema der aktuellen PCs genießt den zweifelhaften Ruf, starr und unflexibel zu sein. Andere Plattformen wie PowerPC (die ältere Generationen von Apple-Macintosh-Rechnern verwendeten) verfolgten von Anfang an andere Ansätze. Computer, die statt eines Standard-BIOS dessen Nachfolger, Intels Extensible Firmware Interface (EFI) verwenden, sind beim Start von Betriebssystemen wesentlich flexibler – auch Linux-Bootloader für EFI gibt es bereits.
Auch Grub wird weiter entwickelt, derzeit ist eine neue Version von Grub (Grub2) in der Mache, die im Rahmen eines kompletten Redesigns viele konzeptionelle Fehler der alten Version ausbügeln soll. Einen Veröffentlichungstermin für die zweite Grub-Generation haben die Entwickler aber noch nicht angekündigt.
[1] Grub und Grub 2: http://www.gnu.org/software/grub/
[2] Grub4DOS: https://gna.org/projects/grub4dos/
[3] Extensible Firmware Interface: http://www.intel.com/technology/efi/





