Linux-Praxisbuch/ Der Bootvorgang

Zurück zum Linux-Praxisbuch

Dieser Artikel beschreibt den Startvorgang eines Rechners, der schließlich dazu führt, dass ein Linux-Kernel in den Hauptspeicher geladen wird und die Kontrolle über den Rechner übernimmt. Diesen Vorgang bezeichnet man meist auch als Booten (gesprochen: Buuten). Die Details des Bootvorgangs hängen von der konkreten Hardware-Architektur ab. Da Linux für zahlreiche Plattformen verfügbar ist, würde es den Rahmen dieses Artikels sprengen, alle Variationen hier zu behandeln. Der Artikel beschränkt sich daher im Wesentlichen auf den Bootvorgang für den PC.


Vom Rechnerstart zum Ladeprogramm Bearbeiten

Nach dem Start des Rechners wird zunächst das BIOS (Basic Input Output System) aktiv. Dabei handelt es sich um ein Programm im Festspeicher des Rechners. Das BIOS führt eine Reihe von Prüf- und Initialisierungs-Routinen durch, die schließlich mit dem Aufruf der Boot-Routine abgeschlossen werden.

Zu diesem Zeitpunkt ist bereits bekannt, welche Massenspeichermedien im Rechner existieren. Das BIOS selbst verwaltet eine Liste von Geräten, die für den Start des Ladevorganges eines Betriebssystems in Frage kommen. Das erste Gerät in dieser Liste, das nun auch tatsächlich angeschlossen ist und ein Medium enthält, wird von der Boot-Routine ausgewählt. Der Code aus dem ersten Sektor dieses Gerätes, dem sogenannten Master Boot Record, wird in den Hauptspeicher geladen.

Die Vorgänge bis zu diesem Zeitpunkt sind völlig unabhängig vom installierten Betriebssystem. Im Master Boot Record kann insbesondere ein beliebiges Programm abliegen, so z.B. ein Virus, ein Speicherprüfprogramm, ein Ladeprogramm oder ein (sehr kleines) Betriebssystem. Da ein Sektor nur 512 Byte umfasst, ist seine Größe allerdings limitiert. Tatsächlich sind sogar nur die ersten 446 Byte für Programmcode vorgesehen, der Rest wird u.a. für die Partitionstabelle benötigt. Die Datei, die den Linux-Kern enthält (Kernelimage genannt), ist so aufgebaut, dass die ersten 512 Byte einen regulären Master Boot Record enthalten. Somit ist es möglich den Kernel direkt auf ein Bootmedium zu schreiben um diesen zu starten. Eine Reihe von Gründen spricht aber für die Verwendung eines separaten Ladeprogrammes.

Eine detaillierte Ansicht der Vorgänge bis zum Start des Ladeprogrammes liefern die beiden folgenden Flussdiagramme. Ein präzises Verständnis aller Details ist in der Regel nicht nötig. Sollte es während des Startvorganges gar nicht erst zum Aufruf des Ladeprogrammes kommen, so sollte man im Sinn behalten, dass dies eine Reihe von Ursachen haben kann.

 

Ladeprogramme Bearbeiten

Der Programmtyp, der als Ladeprogramm zum Einsatz kommt, wird auch als Boot-Loader bezeichnet. Grundsätzlich können Ladeprogramme unabhängig vom zu ladenden Betriebssystem agieren (wobei es Herstellern von Betriebssystemen freisteht, ihr installiertes Ladeprogramm so zu gestalten, dass nur das "eigene" Betriebssystem geladen werden kann). Linux-Distributoren verwenden in der Regel flexible Ladeprogramme, die auch in der Lage sind, andere Betriebssystem-Typen zu booten (etwa Windows oder ein anderes Unix). Neben seiner Hauptaufgabe aus Systemsicht, dem Laden des Betriebssystems, kommt dem Ladeprogramm somit aus Benutzersicht auch die Aufgabe zu, eine Auswahl des Betriebssystems zu ermöglichen, falls mehrere Betriebssysteme auf dem betreffenden Rechner installiert sind.

Verschiedene Ladeprogramme Bearbeiten

In der Linux-Gemeinde sind die beiden Ladeprogramme LILO und GRUB am weitesten verbreitet. Eine Alternative, die man derzeit noch weniger häufig antrifft, besteht in XOSL. Wie auch in anderen Bereichen der Linux-Welt ist eine solche Konkurrenz zwischen unterschiedlichen Lösungen aus technischer Sicht vorteilhaft, erfordert aber vom Benutzer bzw. Verwalter mehr Kenntnisse, wenn er auf unterschiedlichen Linux-Installationen arbeitet.

Das Grundproblem Bearbeiten

Das Grundproblem, das alle unterschiedlichen Ladeprogramme lösen müssen, besteht darin, dass das Betriebssystem (also etwa der Linux-Kernel, der geladen werden soll) als Datei auf einer Festplattenpartition vorliegt, dass aber ein Ladeprogramm aufgrund seines frühen Startzeitpunktes zunächst noch kein Verständnis von Dateien und Dateisystemen hat. Das Konzept einer Datei taucht erst aus Betriebssystem-Sicht auf, während ein Ladeprogramm ohne Zusatzinformation nur physikalische Blöcke auf dem jeweiligen Medium kennt. Da das Betriebssystem ja aber gerade erst geladen werden soll, kann es bei der Suche nach den richtigen Blöcken nicht behilflich sein. Eine Möglichkeit zur Lösung dieses Problems besteht in der Verwendung sogenannter Map-Dateien oder kurz Maps. Eine Map enthält die "Adressen" der zu ladenden physikalischen Blöcke des Mediums in der korrekten Reihenfolge. Dabei handelt es sich genau um die Blöcke, die zusammengesetzt, die Kernel-Datei ausmachen. So ist das Ladeprogramm in der Lage, die Datei in den Speicher zu laden, ohne überhaupt ein Konzept von Dateien zu haben.

LILO und GRUB Bearbeiten

Die beschriebene Lösung wird von LILO umgesetzt. GRUB hingegen arbeitet mit Dateisystemtreibern und kann daher über Pfadnamen direkt auf die Kerneldatei zugreifen. Ein Vorteil von Grub ist die interaktive Shell, aus der man Betriebssysteme starten kann, die nicht oder mit fehlerhaften Aufrufen in der Konfigurationsdatei stehen. Außerdem brauchen die Startdateien von Grub nicht beim Ändern der Konfiguration geändert werden. Bei Lilo hingegen muss man dem Bootloader jede Änderung an der Konfiguration mitteilen, was erstens länger dauert und umständlicher ist und zweitens bei Nicht-Linux-System problematisch werden kann. Die weiteren Ausführungen gelten unabhängig vom verwendeten Ladeprogramm. Wir gehen davon aus, dass ein Linux-Kernel geladen werden soll.

GRUB Infos Bearbeiten

Bei   GRUB ist zu beachten, dass dieser seit einigen Jahren in einer neuen Version 2 vorliegt und mit den Versionen 0.9x nicht kompatibel ist. Siehe

Bootparameter übergeben Bearbeiten

Der Linux-Kernel kann mit einer Vielzahl unterschiedlicher Parameter geladen werden, die zumeist das Vorhandensein oder Nichtvorhandensein bestimmter Leistungseigenschaften beeinflussen. Dies ist insbesondere im Fehlerfall von Interesse: Kommt es etwa zu Problemen beim Betrieb einer Festplatte im DMA-Modus, so kann dem Kernel ein Parameter übergeben werden, der verhindert, dass die Festplatte im DMA-Modus angesteuert wird. Bestünde diese Möglichkeit nicht, so wäre es u.U. gar nicht mehr möglich, das betreffende System hochzufahren. Die Übergabe solcher Parameter wird von den meisten Ladeprogrammen auf zweierlei Weise ermöglicht. Zum einen können Standardparameter, die man bei jedem Systemstart übergeben möchte, in einer Konfigurationsdatei festgehalten werden. Zum Anderen kann man beim Systemstart die Parameter über eine Eingabezeile variieren.

Kerneldatei in den Speicher laden Bearbeiten

Nachdem der zu ladende Kernel ausgewählt und evtl. weitere Bootparameter eingegeben wurden, lädt das Ladeprogramm den Kernel in den Hauptspeicher. Hier sind bei Linux grundsätzlich zwei Varianten zu unterscheiden. Zum einen kann der Kernel unkomprimiert vorliegen. Der Einstiegspunkt für die Ausführung ist dann mit dem Beginn des Kernelcodes identisch. Zum anderen kann der Kernel komprimiert sein. In diesem Fall wurde dem Kernel beim Übersetzen ein kleines Programmstück vorangestellt, das für das Entpacken des Kernels und das Finden des richtigen Einstiegspunktes zuständig ist. Eine unkomprimierte Kerneldatei erkennt man nach dem Übersetzen an ihrem Namen vmlinux. Eine komprimierte Kerneldatei heißt vmlinuz, zImage oder bzImage. Diese Dateien können später freilich umbenannt werden. Gehen wir also nun davon aus, dass der Kernel geladen und der korrekte Einstiegspunkt gefunden wurde.

Der Kernel startet durch Bearbeiten

init Bearbeiten

Das init Programm ist auch wie andere gewöhnliche Systemverwaltungsprogramme in /sbin zu finden. Es ist dafür zuständig, bestimmte Initskripte zu starten oder zu beenden, die in /etc/init.d zu finden sind. Welche Skripte beim Bootvorgang wann aufgerufen werden, wird durch sogenannte Runlevel festgelegt. Die einzelnen Runlevels werden durch die Verzeichnisse /etc/init.d/rc.0.d bis rc.6.d sowie rc.S.d und durch /etc/inittab festgelegt. Die inittab ist die Konfigurationsdatei, in welcher festgelegt wird, wann beim Bootvorgang in welches Runlevel und die damit verbundenen Initskripte ausgeführt werden.

runlevel Bearbeiten

menu.lst Bearbeiten

Wenn man einen Grub Lader installiert hat, kann man das Grub Bootmenu in der Datei menu.lst verändern.

Die Datei menu.lst steht meist im Verzeichnis /boot oder /boot/grub

Um die Datei zu bearbeiten braucht man Rootrechte.

Wie geht das praktisch ? Bearbeiten

Man geht in die Konsole und gibt su sowie das Rootpasswort ein. (Knoppix hat kein Rootpasswort, also nur su eingeben)

su

Man wechselt in das Verzeichnis /boot/grub

cd /boot/grub

Man lädt sich die Datei menu.lst in einen Editor

pico menu.lst

Man geht in die letzten Zeilen, in denen sich die Menueinträge befinden.

Alle Zeilen die mit # beginnen sind nur Kommentare und ändern nichts am Programmablauf.

Man kann eine Zeile mit Strg + K ausschneiden und mit Strg + U wieder einfügen.

Hat man alles verändert, wie man es wünscht, speichert man die Datei wieder ab.

Strg + o

Und verläßt Pico

Strg + x.

Dann startet man das System neu und betrachtet sich das neue Menu des Grubloaders.

Setkey Bearbeiten

In der menu.lst kann man mit setkey die Tastaturbelegung ändern.

Folgende Einstellung für setkey verändert die Tastaturbelegung auf die deutsche Tastatur:

setkey y z
setkey z y
setkey Y Z
setkey Z Y
setkey equal parenright
setkey parenright parenleft
setkey parenleft asterisk
setkey doublequote at
setkey plus bracketright
setkey minus slashs
setkey slash ampersand
setkey ampersand percent
setkey percent caret
setkey underscore question
setkey question underscore
setkey semicolon less
setkey less numbersign
setkey numbersign backslash
setkey colon greater
setkey greater bar
setkey asterisk braceright