Bewertung: 1


Die Kandidaten sollten in der Lage sein, aus den Bootmeldungen die vier verschiedenen Stufen des Bootprozesses zu erkennen und zu unterscheiden.

Schlüsseldateien, Begriffe und Hilfsmittel beinhalten:

  • Start des Bootloaders und die Weitergabe an den Kernel
  • Laden des Kernels
  • Hardware Initialisierung und Setup
  • Daemon Initialisierung und Setup

Der Bootvorgang von Linux läßt sich in die oben genannten vier Stufen einteilen. Die genaue Unterscheidung der Stufen ist notwendig, um eventuell auftretende Fehler richtig behandlen zu können. An dieser Stelle sollen also noch einmal diese Stufen beschrieben werden, in ihren jeweils unterschiedlichen Möglichkeiten.

Start des Bootloaders und die Weitergabe an den Kernel

Mit welcher Methode Linux auch immer gebootet werden soll, in jedem Fall besteht die erste Stufe des Bootvorgangs aus dem entsprechenden Bootloader. Das liegt in der Natur des Bootvorganges selbst begründet, denn die Industriestandard-Computer arbeiten alle mit mehr oder weniger dem selben Vorgang.

Das BIOS sucht nach dem im Setup eingestellten Bootlaufwerk und dort nach dem Bootsektor bzw. Master-Boot-Record. In diesem Bootsektor befindet sich ein kleines Programm, das den weiteren Bootvorgang steuert. Unabhängig vom verwendeten Betriebssystem ist dieser Vorgang immer sehr ähnlich. Um Linux zu booten, gibt es dabei verschiedene Programme, die alle in der Lage sind, eben diese Aufgabe zu übernehmen:

  • LILO
  • SYSLINUX
  • GRUB
  • LOADLIN

Von diesen vier Programmen tanzt nur LoadLin aus der Reihe, denn dieses Programm läd Linux aus einer bestehenden DOS/Windows Umgebung. Das heißt, der eigentliche (BIOS-gesteuerte) Bootvorgang ist schon zu Ende.

Allen vier Programmen ist aber gemeinsam, dass sie die Möglichkeit anbieten, dem zu ladenden Linux-Kernel Parameter mitzugeben. Der User kann also hier noch direkten Einfluß auf den Bootvorgang nehmen, indem bestimmte Hardwareparameter fest eingegeben werden oder nicht existierende Hardware, die der Kernel unterstützen würde ausgeschlossen werden. Auch Angaben über das zu verwendende Wurzeldateisystem sind möglich… All diese Angaben werden direkt hinter dem Bootprompt angegeben, bevor die Enter-Taste gedrückt wird.

In der Regel sind heutige moderne Kernel komprimiert. Das heißt, dass die zu ladende Kerneldatei zunächst entkomprimiert werden muß. Das ist streng genommen schon ein Thema des nächsten Abschitts, der Bootloader tut nichts anderes, als die gewünschte Kerneldatei in den Speicher zu laden und ihr die entsprechenden Parameter mitzugeben. Während des Ladevorgangs wird die Textzeile

  Loading Kernelname

ausgegeben.

Laden des Kernels

Sobald die Kerneldatei in den Speicher geladen ist, beginnt der zweite Teil des Bootvorganges. Der Anfang der Kerneldatei enthält ein kleines Programm, das die Dekomprimierung des Kernels übernimmt. Der Kernel ist also tatsächlich eine selbstentpackende Datei. Während der Dekomprimierung wird eine kurze Meldung über diesen Vorgang ausgegeben.

Sobald der Kernel sich selbst entpackt hat, beginnt er mit der Initialisierung seiner Umgebung. Das heißt er überprüft zunächst einmal die CPU(s) und den Arbeitsspeicher. Das würde jetzt streng genommen schon in den nächsten Abschnitt gehören, aber diese grundlegende Initialisierung wird meist noch zur zweiten Bootstufe gezählt.

Die gesamte zweite Bootstufe erlaubt eigentlich keinerlei Manipulation des Users. Weder durch die Angabe von Parametern, noch durch Veränderungen am Kernel selbst, kann auf den Ladevorgang Einfluß genommen werden.

Hardware Initialisierung und Setup

Der komplexeste Teil des Bootvorganges ist die dritte Stufe. Hier findet die Initialisierung der gefundenen Hardware statt. Dabei gibt es unterschiedliche Möglichkeiten, was hier in welcher Reihenfolge passiert. Zunächst wird aber grundsätzlich die Hardware initialisiert, deren Unterstützung fest in den Kernel eingebaut ist. Typische Ausgaben dieser Stufe wären

Serial driver version 5.05c (2001-07-08) with HUB-6 MANY_PORTS MULTIPORT
SHARE_IRQ SERIAL_PCI enabled
ttyS00 at 0x03f8 (irq = 4) is a 16550A
ttyS01 at 0x02f8 (irq = 3) is a 16550A
ttyS02 at 0x03e8 (irq = 4) is a 16550A
block: 128 slots per queue, batch=32
Uniform Multi-Platform E-IDE driver Revision: 6.31
ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
VP_IDE: IDE controller on PCI bus 00 dev 39
VP_IDE: chipset revision 6
VP_IDE: not 100% native mode: will probe irqs later
ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
VP_IDE: VIA vt82c686b (rev 40) IDE UDMA100 controller on pci00:07.1
ide0: BM-DMA at 0xa000-0xa007, BIOS settings: hda:DMA, hdb:DMA
ide1: BM-DMA at 0xa008-0xa00f, BIOS settings: hdc:DMA, hdd:DMA
hda: IC35L040AVVA07-0, ATA DISK drive
hdb: LITEON DVD-ROM LTD163D, ATAPI CD/DVD-ROM drive
hdc: Maxtor 32049H2, ATA DISK drive
hdd: IBM-DTLA-305020, ATA DISK drive

Nachdem diese Initialisierung beendet wurde ist der nächste Schritt das Mounten der Wurzelpartition. Dazu gibt es grundsätzlich zwei verschiedene Lösungsansätze:

  • Der Kernel hat die Unterstützung sowohl für die Hardware des zu mountenden Wurzeldateisystems, als auch für den daraufliegenden Dateisystemtyp fest eingebaut. In diesem Fall kann das Wurzeldateisystem sofort gemountet werden.
  • Der Kernel benötigt weitere Module, bevor er auf das Wurzeldateisystem zugreifen kann. Das können entweder Module für den Zugriff auf die Hardware (z.B. SCSI) sein, als auch Module für die Verwendung eines bestimmten Dateisystemtyps (EXT2/3, Reiserfs, …). In diesem Fall wird eine Ramdisk als Wurzeldateisystem gemountet, die natürlich die Module enthalten muß, die der Kernel benötigt, um das wirkliche Wurzelsystem zu mounten. Daneben muss die Ramdisk auch alle notwendigen Programme und Libraries enthalten, um die entsprechenden Module zu laden (insmod, modprobe, …). Sobald dieser Ladevorgang abgeschlossen ist, wird die Ramdisk entfernt (oder verschoben) und das echte Wurzeldateisystem wird gemountet.

In beiden Fällen wird das Wurzelsystem zunächst ReadOnly gemountet, damit eine Überprüfung des Dateisystems gefahrlos möglich ist.

An diesem Punkt angelangt, wird der erste und wichtigste Prozeß gestartet, den ein Unix/Linux System hat, der init-Prozeß. Dieser Prozeß ist ab hier für die weitere Initialisierung des Systems zuständig und wird erst beim Herunterfahren des Systems wieder beendet. Er trägt immer die PID 1. Die genaue Beschreibung, was init in welchem Runlevel tun soll, wird der Datei /etc/inittab entnommen. Diese Datei ist schon verfügbar, denn das /etc-Verzeichnis muß zwangsläufig auf der Wurzelpartition liegen und die ist ja schon gemountet.

Zunächst wird der init-Prozeß in den sogenannten Single-User-Mode wechseln und von dort alle möglichen Aufgaben erledigen, die notwendig sind, damit das System weiter korrekt aufgebaut wird. Dazu zählt insbesondere:

  • Überprüfung des Wurzeldateisystems
  • Remounten des Wurzeldateisystems im ReadWrite Modus
  • Überprüfung aller einzubindenden Partitionen
  • Einbinden aller weiteren Partitionen
  • Laden zusätzlicher Module und initialisieren der entsprechenden Hardware

Die entsprechenden Aufgaben werden über die Init-Scripts festgelegt.

Nachdem diese Aufgaben erledigt sind, wechselt init in den voreingestellten Mehrbenutzermodus (auch der ist in /etc/inittab festgelegt). An dieser Stelle wird der init-Prozeß meist noch ein paar Hardwarezusätze laden, wie etwa die Netzwerkkartenmodule und sie entsprechend initialisieren. Ein weiterer wichtiger Vorgang ist das Starten der GETTY-Prozesse für jedes angeschlossene (echte oder virtuelle) Terminal. Damit ist die dritte Stufe des Bootvorganges abgeschlossen und das System eigentlich arbeitsfähig.

Daemon Initialisierung und Setup

Damit jetzt auch die gewünschten Dienste zur Verfügung stehen, arbeitet der init-Prozeß abschließend noch alle weiteren Init-Scripts ab, die festlegen, welche Dienste im Hintergrund (also als Daemon-Prozesse) gestartet werden sollen. Die entsprechenden Dienste werden initialisiert und gestartet. Erst wenn auch diese Dienste alle gestartet sind wird die Loginaufforderung auf dem Terminal sichtbar und das System ist arbeitsfähig.