In diesem Abschnitt werden einige Programme vorgestellt, die zur Weiterleitung von Kernel-Bootparametern zum Kernel selbst verwendet werden können. Es wird ebenfalls erklärt, wie die Parameter verarbeitet werden, welchen Beschränkungen sie unterliegen und wie sie zu jedem passenden Gerät, für das sie bestimmt sind, weitergeleitet werden.
Man sollte unbedingt beachten, daß innerhalb eines Bootparameters keine Leerstellen verwendet werden sollten, nur zwischen getrennten Parametern. Mehrere Werte für einen Parameter müssen durch ein Komma getrennt werden und zwar wiederum ohne Leerstellen. Richtig wäre z.B. dieses Beispiel:
ether=9,0x300,0xd0000,0xd4000,eth0 root=/dev/hda1
Nachfolgendes Beispiel ist hingegen falsch:
ether = 9, 0x300, 0xd0000, 0xd4000, eth0 root = /dev/hda1
Sobald der Kernel erst einmal läuft, kann man jederzeit mit dem Befehl
cat /proc/cmdline
nachschauen, welche Parameter an den Kernel übergeben wurden.
LILO (LInux LOader) von Werner Almesberger ist das am häufigsten verwendete Programm zur Übergabe der Parameter. Das Programm hat die Fähigkeit, verschiedene Kernel bzw. Betriebssysteme zu booten. Die meisten Distributionen verwenden standardmäßig LILO, um Linux und z.B. auch Windows zu starten. LILO kann DOS, Windows, OS/2, Linux, FreeBSD, etc. ohne Schwierigkeiten booten und ist zudem äußerst flexibel.
Nach dem Einschalten des Computers wird bei den meisten
Installationen LILO gestartet. Drückt der Anwender nach der
Meldung LILO
die TAB-Taste, so gelangt er zum Prompt von
LILO. Ansonsten wird nach eine festgelegten Zeit automatisch das
Standardsystem gestartet. In der Regel wird hier durch die
Eingabe eines label
-Eintrages aus /etc/lilo.conf
das zu startende Betriebssystem bzw. Linux Kernel ausgewählt.
Typisch sind Labels wie linux
, backup
und msdos
.
Falls ein Bootparameter an den Kernel übergeben werden soll,
kann man dies an dieser Stelle tun. Der Parameter wird einfach,
durch ein Leerzeichen getrennt, an das Label angehängt.
Folgendes Beispiel soll dies verdeutlichen:
LILO: linux root=/dev/hda1
In der Regel möchte man natürlich nicht bei jedem Booten die
Parameter per Hand eingeben müssen. Hier hilft die Option
append=
, die der Konfigurationsdatei von LILO hinzugefügt
werden kann und deren Parameter dann automatisch an den Kernel
übergeben werden. Man muß einfach nur etwas wie
append = "foo=bar"
in die Datei /etc/lilo.conf
einfügen. Dieses kann
entweder am Anfang der Datei eingefügt werden, so daß die Parameter
für alle Abschnitte der Datei gültig sind, oder in den Abschnitt
eines bestimmten Kernels, so daß nur diesem die Parameter übergeben
werden. Eine ausführliche Beschreibung ist in der ausgezeichneten
Dokumentation von LILO zu finden.
Ein anderer weitverbreiteter Linux-Loader ist loadlin. Dies ist ein DOS-Programm, das die Fähigkeit besitzt, einen Linux-Kernel vom DOS-Prompt aus zu starten, wobei Bootparameter übergeben werden können.
Sehr nützlich ist die Möglichkeit, Linux von DOS aus zu starten,
wenn man bestimmte Hardware besitzt, die von Linux erst dann
unterstützt wird, wenn sie von dem der Hardware beiliegenden
DOS-Treiber in einen bestimmten Zustand versetzt worden ist.
Ein gutes Beispiel sind die Soundblaster-kompatiblen
Soundkarten, welche den DOS-Treiber benötigen, um ein paar
geheimnisvolle Register ziehen zu können, um die Karte in
einen SB-kompatiblen Modus zu bringen. Das Booten von DOS mit
dem zur Verfügung stehenden Treiber und das anschließende
Laden von Linux mit LOADLIN.EXE
vom DOS-Prompt aus verhindert das
Zurückschalten der Karte in den vorherigen Zustand, was beim
erneuten Booten der Fall wäre. So jedoch bleibt die Karte in
einem SB-kompatiblen Modus und ist somit unter Linux verwendbar.
Auch Plug&Play Hardware kann auf diese Art und Weise
initialisiert werden.
Es gibt auch noch andere Programme, die zum Booten von Linux
verwendet werden können. Auf dem lokalen Linux-FTP-Server
erhält man unter system/Linux-boot/
die komplette
Liste aller verfügbaren Programme.
Es gibt einige Kernel-Bootparameter, deren Standardwerte
an bestimmten Stellen im Kernel-Image selbst gespeichert
sind. Es gibt ein Hilfsprogramm namens rdev
, das
auf den meisten Systemen installiert ist und das weiß, wo
sich diese Werte befinden und wie sie geändert werden
können. Dieses Hilfsprogramm kann auch Dinge ändern,
die kein Kernel-Bootparameter-Äquivalent besitzen, wie
z.B. der standardmäßig verwendete Grafik-Modus.
Das Hilfsprogramm rdev
ist gewöhnlich auch unter
den Namen swapdev
, ramsize
, vidmode
und
rootflags
aufrufbar. Diese Namen zeigen die fünf
Änderungsmöglichkeiten durch rdev
an: das Root-Device,
das Swap-Device, die RAM-Disk-Parameter, der Standard-Grafik-Modus
sowie die readonly/readwrite-Einstellung vom Root-Device.
Weitere Informationen über rdev
erhält man
nach Eingabe von rdev -h
oder durch die Lektüre der
bereitgestellten Manpage (man rdev
).
Die meisten Bootparameter sind folgendermaßen strukturiert:
name[=wert_1][,wert_2]...[,wert_11]
name
ist hierbei ein einzigartiges Schlüsselwort,
das Aufschluß darüber gibt, für welchen Teil des
Kernels die entsprechenden Werte bestimmt sind.
Mehrere Bootparameter werden als Liste nach obigem Format
an den Kernel übergeben, wobei die einzelnen Parameter durch
Leerzeichen getrennt werden. Man beachte das tatsächliche
Limit von 11 Parametern. Der bestehende Code kann nur 11 durch Kommas
getrennte Parameter pro Schlüsselwort verarbeiten. In
ungewöhnlich komplizierten Fällen kann man
jedoch dasselbe Schlüsselwort mit 11 zusätzlichen
Parametern erneut benutzen, vorausgesetzt, die Setup-Funktion
unterstützt dies. Man beachte auch, daß der Kernel die
Liste in maximal zehn Ganzzahlen-Parameter und eine anschließende
Zeichenfolge unterteilt. Das heißt, man kann nicht wirklich 11
Ganzzahlen bereitstellen; dies ist höchstens durch Konvertierung
des 11ten Parameters von einer Zeichenkette in eine Ganzzahl im
Treiber selbst möglich.
Die Sortierung findet hauptsächlich in
linux/init/main.c
statt. Zuerst überprüft der
Kernel, ob der Parameter zu einem der speziellen Parameter
wie root=
, ro
, rw
oder debug
gehört. Die Bedeutung dieser
speziellen Parameter wird im weiteren Verlauf dieser Dokumentation
beschrieben.
Der Kernel durchsucht dann eine Liste von Setup-Funktionen, die im
bootsetups
-Array gespeichert ist, um zu sehen, ob
ein Treiber oder ein Teil des Kernels für die entsprechende
Zeichenkette, wie z.B. foo
, eine Setup-Funktion
setup_foo()
registriert hat. Würde
man dem Kernel die Zeile foo=3,4,5,6,bar
übergeben,
dann würde dieser den bootsetups
-Array durchgehen, um
herauszufinden, ob foo
registriert ist. Falls dies der
Fall wäre, würde der Kernel
die Setup-Funktion, die mit foo
verbunden ist,
aufrufen und dieser die Ganzzahlen-Parameter 3,
4, 5 und 6 übergeben, wie sie auf der Kernel-Kommandozeile
angegeben wurden. Außerdem würde er ebenfalls die
Zeichenkette bar
übergeben.
Alles, was aussieht wie foo=bar
und nicht als
Setup-Funktion akzeptiert wird, wie oben beschrieben, wird
dann als zu setzende Umgebungsvariable interpretiert. Ein
Beispiel wäre die Verwendung von TERM=vt100
oder BOOT_IMAGE=vmlinuz.bak
als Bootparameter.
Diese Umgebungsvariablen werden typischerweise in
Initialisierungsskripts abgefragt, um ein große Anzahl
von verschiedenen Dingen ein- oder auszuschalten.
Alle verbleibenden Parameter, die der Kernel nicht selbst verwendet
und nicht als Umgebungsvariablen interpretiert, werden
zum ersten Prozeß weitergeleitet. Dieser ist normalerweise
das init
-Programm. Meistens wird dem init
-Programm
per Bootparameter mitgeteilt, mit welchem Runlevel Linux gebootet
werden soll. So kann init
angewiesen werden, den
Rechner im Ein-Benutzer-Modus zu
booten und die üblichen Dämonen nicht zu starten. Um
herauszufinden, welche Parameter von der auf Ihrem System
installierten Version von init
akzeptiert werden, lesen
Sie bitte die entsprechende Manual Page.