Linux-Bootkonfigurationen

04.10.2000 von Jorg Reiter
Mit dem nötigen Gewusst-wo und ein paar Kniffen lässt sich die Bootkonfiguration von Linux-Systemen gezielt auf den Einsatzzweck des Rechners zuschneiden. tecChannel zeigt, wie es funktioniert.

Die Installation eines einsteigergerechten Linux-Systems mit grafischer Oberfläche lässt sich mit Hilfe aktueller Distributionen problemlos in 30 Minuten erledigen. Ein endloser Weg durch die Online-Dokumentation steht jedoch dem bevor, der die Start-up-Konfiguration des Systems an seine eigenen Bedürfnisse anpassen will - ob es sich nun um das automatische Einbinden von Netz-Laufwerken oder das schlichte Customizing des grafischen Log-ins handelt.

Tatsächlich nutzt Linux jedoch klar strukturierte und gut nachvollziehbare Start-up-Mechanismen, die sich mit einigen Grundkenntnissen problemlos auch für eigene Zwecke nutzen lassen. Wir zeigen im Folgenden, wie der Start eines Linux-Systems vom Einschalten des Rechners bis zum Log-in abläuft, und an welchen Stellen der gezielte Einsatz eigener Modifikationen Sinn macht.

Bei der Arbeit mit den Start-up-Dateien empfiehlt es sich, Vorsicht walten zu lassen: Linux ist nicht gleich Linux. Je nach Distribution kann sowohl der Inhalt der Files als auch der Pfad zu ihnen leicht variieren. Die Angaben in unserem Workshop beziehen sich auf die in Deutschland verbreitetste Distribution, SuSE Linux 6.4. Falls Sie mit einer anderen Distribution arbeiten, empfiehlt sich bei Unklarheiten ein kurzer Blick ins Handbuch.

Notbremse: Boot-Disketten erstellen

Wer mit dem Betriebssystem experimentiert, benötigt auf jeden Fall eine Boot-Diskette als Rettungsanker. Manche Linux-Distributionen - etwa Red Hat oder SuSE - bringen schon im Lieferumfang eine entsprechende Floppy mit. Doch nicht nur als Rescue-Disk macht der Einsatz einer Boot-Diskette Sinn. Auch beim Austesten maßgeschneiderter Kernel erweist es sich als hilfreich, den selbst erstellten Betriebssystem-Kern erst einmal auf Diskette auszulagern: Treten beim Hochfahren Fehler auf, starten Sie Linux wieder mit dem alten Kernel von der Festplatte.

Um die Bootdiskette anzulegen, wechseln Sie nach der Kompilierung des Kernels mit make bzImage in das Verzeichnis /usr/src/linux. Dort befinden sich die Quellen des Linux-Kernel. Legen Sie jetzt eine leere Diskette - sie muss nicht formatiert sein - ins Laufwerk und geben Sie dann den Befehl make zdisk ein. Linux kopiert dann das Kernel-Image auf die Diskette.

Planen Sie intensive Tests, dann sollten Sie sich neben einer Boot-Diskette auch noch eine Utility-Disk anlegen. Auf diese kopieren Sie alle Werkzeuge, die Sie zur Reparatur des Systems benötigen. Dazu müssen Sie eine Initial Ramdisk anlegen, in der der Kernel ein Mini-Root -Dateisystem anlegen kann. Mehr zu diesem Thema finden Sie im Linux-Bootdisk-HOWTO beziehungsweise in Ihrem Linux-Handbuch.

Systemstart unter Linux

Auch unter Linux beginnt der Boot-Vorgang mit dem POST des Rechner-BIOS. Anschließend liest das System den Bootsektor einer Floppy respektive den MBR der Harddisk aus. Der dort enthaltene Code identifiziert den Lagerungsort des Kernels und befördert diesen in den Arbeitsspeicher.

Während es beim Laden des Kernels von Diskette genügt, eine Reihe sequenzieller Sektoren einzulesen, gestaltet sich die Sache beim Booten von Harddisk etwas komplizierter. Hier dient der Linux Loader LILO dazu, die richtige Partition sowie - über das installierte Filesystem - jene Sektoren anzusteuern, die den Kernel-Code enthalten.

Da der Linux-Kernel komprimiert auf der Platte lagert, muss er erst einmal entpackt werden. Diese Aufgabe übernimmt ein kleines Programm am Beginn des Kernel-Image. Anschließend prüft der Betriebssystemkern, ob bestimmte Hardware-Komponenten vorhanden sind, und passt die Treiberkonfiguration entsprechend an. Dabei gibt er zahlreiche Verlaufsmeldungen aus. Das Einbinden ("mounten") des Root-Filesystems schließt diese Boot-Phase ab.

Nun übernimmt das Programm init die Steuerung des weiteren Ablaufs. Es sorgt für den Start diverser Systemdienste - unter Linux werden sie als Daemons bezeichnet. Zu guter Letzt startet init das Programm getty, das eine Anmeldung der Benutzer über virtuelle Konsolen oder serielle Terminals erlaubt. Damit endet der Boot-Vorgang, das Linux-System steht jetzt zur Verwendung durch die User bereit.

An zwei Stellen dieses Ablaufs bietet sich dem Anwender Gelegenheit, nach seinen Vorstellungen in den Boot-Vorgang einzugreifen: Beim Laden des Kernels über LILO sowie bei der Diensteverwaltung durch init.

LILO-Basics, Teil 1

Für gefahrlose Experimente mit Linux erweist sich - neben einer funktionierenden Rettungsdiskette - vor allem das Grundverständis des Linux-Bootmanagers LILO als wichtige Voraussetzung. Da die meisten Funktionen eines Linux-Systems von der Konfiguration des Kernels abhängen, ergibt sich beim Tuning regelmäßig die Notwendigkeit, diverse Kernel-Varianten wahlweise zu laden. Am bequemsten erfolgt dies via LILO.

Legen Sie für einen neuen Betriebssystem-Kern zuerst ein eigenes Verzeichnis unter /boot an - zum Beispiel /boot/kernel-version/. Um den Kernel auch dorthin zu bugsieren (einfaches Kopieren genügt nicht), müssen Sie den Pfad in Makefile im Verzeichnis /usr/src/linux/ angeben. Suchen Sie dort den Eintrag INSTALL_PATH und modifizieren Sie ihn entsprechend:

INSTALL_PATH=/boot/<kernel-version>/

Anschließend konfigurieren und übersetzen Sie den neuen Kernel. Nun tragen Sie ihn in die Datei /etc/lilo.conf ein. Diese informiert LILO, wie der Kernel heißt (meist vmlinuz), wo er sich auf der Platte befindet und welchen Namen er im Bootmenü erhalten soll. Haben Sie Linux von einer Distribution installiert, befindet sich bereits mindestens ein Kernel-Eintrag in lilo.conf:

image = /boot/vmlinuz
root = /dev/hda1
label = linux

Kopieren Sie einfach diesen Abschnitt und passen Sie ihn anschließend für den neuen Kernel an:

image = /boot/2.3.16-000922/vmlinuz
label = linux-2.3.16-000922

Den root-Eintrag übernehmen Sie ohne Änderungen. Er informiert LILO, welche Partition das Root -Dateisystem enthält.

LILO-Basics, Teil 2

Nachdem Sie die modifizierte lilo.conf gespeichert haben, geben Sie jetzt nur noch den Befehl make bzlilo ein - alles Weitere funktioniert automatisch: Der neue Kernel wird aus seinem momentanen Aufenthaltsort /usr/src/linux/arch/i386/boot/ nach /boot/kernel-version/ transferiert. Das gleichzeitig aktualisierte LILO -Bootmenü reagiert beim nächsten Systemstart auf Ihren neuen Eintrag (label=...).

Falls Sie sich nicht mehr ganz sicher sind, welchen Namen Sie Ihrer Kreation gegeben haben, drücken Sie einfach die Tabulator-Taste, sobald der LILO-Prompt erscheint. Der Bootmanager präsentiert daraufhin alle Konfigurationen, die in seinem Menü eingetragen sind.

LILO setzt der Experimentierfreude kaum Grenzen: lilo.conf kann unbegrenzt Einträge aufnehmen. Dem Austesten beliebig vieler Konfigurationsvarianten steht also nichts im Weg. Achten Sie allerdings stets darauf, die Struktur der Datei eindeutig zu halten. Nicht benutzte Abschnitte sollten sie umgehend löschen oder zumindest mit dem #-Zeichen auskommentieren.

LILO verfügt noch über einige weitere Fähigkeiten. So lässt sich über die Option password beispielsweise die Eingabe eines Boot-Kennworts erzwingen. Das Schlüsselwort message erlaubt die Angabe einer Datei, die den User beim Booten mit einem informativen Text begrüßt. Weitere Informationen zu den LILO-Optionen finden Sie in der deutschen Man-Page von lilo.conf sowie im sehr guten LILO User Guide unter /usr/doc/lilo/.

Schaltzentrale init

Kernel- und Boot-Manager-Konfiguration dienen als Basis für das Systemtuning. Für den nächsten Schritt ist das Programms init zuständig.

Nachdem der Kernel das Root -Dateisystem gemountet hat, startet er das Programm init. Diese Schaltzentrale zeichnet für das Starten und Stoppen von Diensten verantwortlich. So fährt es beispielsweise den Druckerspooler hoch, führt mit fsck eine Überprüfung der Dateisysteme aus und bindet über mount Dateisysteme von anderen Partitionen lokal ein.

Welche Tätigkeiten es genau vornehmen soll, liest init aus der Datei /etc/inittab aus. Dabei folgt es dem System-V-Bootschema, das seinen etwas kryptischen Namen der Herkunft aus dem ersten komplett kommerziellen Unix-Variante (AT&T Unix System V) verdankt. Das Schema sieht acht so genannte Runlevels vor, von denen jeder einer speziellen Systemkonfiguration entspricht . Die Runlevels S, 0, 1 und 6 sind fest definiert und reserviert, die Runlevels 2 bis 5 lassen sich frei konfigurieren.

Konfiguration über Runlevels

Die System-V-Runlevels lassen sich in gewissem Sinn mit den Optionen vergleichen, die das Windows-9x-Bootmenü offeriert. Jedes steht für eine bestimmte Systemkonfiguration.

System-V-Runlevels

Runlevel

Funktion

Das System-V-Bootschema sieht insgesamt acht verschiedene Runlevels vor. Hier die Belegung unter SuSE Linux.

0

Systemhalt

S

Single-User

1

Multi-User ohne Netzwerk

2

Multi-User mit Netzwerk

3

Multi-User mit Netzwerk und grafischem Log-in

4

Frei

5

Frei

6

Reboot

Die einzelnen Runlevels lassen sich manuell von der Kommandozeile aus starten. Um das System etwa neu zu booten, wechseln Sie mit init 6 in den entsprechenden Level.

Diese Fähigkeit zum manuellen Wechsel des Runlevels erlaubt weit gehende Modifikationen der Systemkonfiguration, ohne den Rechner dazu neu booten zu müssen. Wollen Sie etwa die Netzwerkeinstellungen modifizieren, bringen Sie Linux mit init 1 zuerst in den Modus Multi-User ohne Netzwerk (Runlevel 1). Nun nehmen Sie die notwendigen Änderungen vor und wechseln anschließend mit init 2 wieder in den Netzwerk-Modus.

Alle Netzwerkprogramme starten jetzt neu und lesen dabei die modifizierten Konfigurationsdateien ein. Das Beste daran: Alle nicht auf das Netzwerk angewiesenen Applikationen - etwa Editoren oder Dateimanager - laufen währenddessen unbeeinflusst weiter.

Log-in und Shut-down

Wie die Runlevel-Tabelle auf der vorigen Seite zeigt, erfolgt das grafische Log-in über kdm (KDE Display Manager) erst in Runlevel 3. Bootet Ihr Rechner bei installiertem kdm nur in den Textmodus (Runlevel 2), kommt Linux offensichtlich nicht automatisch weiter. Dieses Verhalten lässt sich ganz einfach über die Konfigurationsdatei inittab im Verzeichnis /etc ändern. Suchen Sie dazu folgende Zeile:

id:2:initdefault:

Ändern Sie hier die Zahl 2 (für Runlevel 2) in eine 3 (für Runlevel 3) um. Beim nächsten Start bootet das System bis in den Grafikmodus und fährt direkt den installierten Display Manager hoch. Das selbe Verhalten lässt sich aber auch manuell - etwa gleich nach der Installation - durch Eingabe des Befehls init 3 erzielen. Auch in der umgekehrten Richtung kann eine entsprechende Anpassung durchaus Sinn machen: So geben einige Konfigurationen per Default ein grafisches Log-on vor, was jedoch bei Server-Installationen wenig Sinn macht.

Über inittab lässt sich auch das Verhalten des Systems bei Betätigung der Tastenkombination [Strg]+[Alt]+[Entf] vorgeben. Die meisten Distributionen sehen dafür den Reboot des Rechners vor - also den Wechsel in Runlevel 6. Wollen Sie stattdessen den "Affengriff" zum schnellen Herunterfahren des Systems nutzen, erfordert dies einen Wechsel in Runlevel 0. Suchen Sie dazu in inittab die Zeile:

ca::ctrlaltdel:/sbin/shutdown -r -t 4 now

und tauschen Sie die Option r für Reboot gegen ein h für Halt aus. Wenn Sie nun die Tastenkombination im Textmodus benutzen, fährt der Rechner sauber herunter. Benutzen Sie X-Windows , müssen Sie vorher die grafische Oberfläche beenden.

inittab und boot

Besonders behutsam sollten Sie bei Veränderungen an inittab mit den Einstellungen in den ersten Zeilen des Skripts umgehen. So gibt die Zeile:

si:I:bootwait:/sbin/init.d/boot

etwa den Pfad zum Skript boot an. In diesem finden sich die Programme, die init unmittelbar nach dem Laden des Kernels ausführen muss. Dazu zählen unter anderem swapon (aktiviert die Swap-Partition), fsck (Prüfung des Dateisystems), mount (Einbinden von Laufwerken in Dateisystem) oder hostname (setzt den Rechner-Namen).

Auf geht's:

Bei Änderungen an den hier aufgeführten Programmen und Optionen sollten Sie äußerste Vorsicht walten lassen. Allzu leicht verweigert das System anderenfalls den Dienst. Falls Sie sich trotzdem einmal aus dem System aussperren, starten Sie den Kernel mit folgender Zeile:

kernelname init=/bin/sh

So booten Sie direkt in eine Shell und können Ihre Änderungen rückgängig machen. Aus Sicherheitsgründen sollten Sie die Nutzung dieser Funktion allerdings über LILO einschränken. Vergeben Sie dazu in lilo.conf ein Passwort (password=geheim) und ergänzen Sie zusätzlich eine Zeile mit dem Parameter restricted. Dies erzwingt bei der Übergabe von Bootparameters wie init=/bin/sh die Eingabe eines Passworts.

Runlevel-Änderung über ksysv

Wenn init den Runlevel wechselt, startet es das Skript /sbin/init.d/rc, das wiederum - passend zum Runlevel - weitere Skripte anstößt. Jedes davon startet oder stoppt einen Systemdienst. Zu dieser Regel existieren lediglich zwei Ausnahmen: In Runlevel 6 kommt nur das Skript reboot zum Einsatz, in Runlevel 0 lediglich halt. Auch wenn Ihr System nicht als Server operiert, benötigen Sie einige der Daemons : etwa den Tastatur-Dienst kbd, den Line Printer Daemon lpd und den Protokolldienst syslogd.

Welche Skripten momentan auf Ihrem System aktiviert sind, zeigt Ihnen beispielsweise das Programm ksysv aus dem KDE (K-Menü/System/SysV Init Editor). Mit dem SysV Init Editor stellen Sie ein, welche Dienste init in welchem Runlevel starten soll. Ziehen Sie dazu das Skript aus dem linken Fenster (Available Services) mit der Maus in den gewünschten Runlevel. Ein kleiner Tipp zur Orientierung: In Runlevel 1 finden sich alle Skripte, die zum Minimal-Betrieb des Systems notwendig sind.

Die Zahl vor jedem Skript zeigt dessen Start/Stopp-Position an. Je höher die Zahl, desto später startet respektive stoppt init das Skript auf dem Weg zum gewünschten Modus. Manche Skripts setzen den vorherigen Start eines anderen voraus: So benötigen Server-Daemons meist das Skript network, um überhaupt via LAN kommunizieren zu können.

Mit Runlevels experimentieren

Für eigene Versuche mit selbst gestrickten Konfigurationen benutzen Sie am Besten einen freien Runlevel, zum Beispiel die Nummer 4. Als Basisgerüst kopieren Sie alle Skripts von Runlevel 1. Außerdem sollte stets kbd auftauchen, das den Keyboard-Dienst startet.

Für Stand-alone-Workstations benötigen Sie auf jeden Fall zwei weitere Skripte. sendmail kümmert sich um den gleichnamigen Mail-Server. Er sorgt dafür, dass die System-Daemons Sie bei Fehlern über das interne Netzwerk (loopback) per Mail alarmieren können. Der Job-Manager cron erledigt die regelmäßige Ausführung von Routine-Aufgaben, etwa das Löschen der Daten in temporären Verzeichnissen.

Auf Netzwerk-Clients oder Servern darf zudem das Skript network nicht fehlen, das die LAN-Anbindung übernimmt. Seine Betriebsparameter bezieht es aus den Angaben in der Datei /etc/rc.config. Als File- und Print-Server für Windows-Maschinen schließlich dient Samba, das zugehörige Skript heißt smb.

Hinsichtlich der Start- und Stopp-Nummern für die Daemons orientieren Sie sich am Besten an den von SuSE konfigurierten Runlevels. Anschließend speichern Sie die Einstellungen und entfernen in inittab noch das Kommentarzeichen aus der Zeile, die für Runlevel 4 verantwortlich ist:

l4:4:wait:/sbin/init.d/rc 4

Weitere Dienste einbinden

Nicht nur die Netzwerk-Daemons , auch beliebige andere Dienste - als prominentester wohl httpd alias Apache - lassen sich über die Konfiguration eines entsprechenden Runlevels automatisch in das Linux-Start-up einbinden. Nicht immer jedoch kann man dabei Daemon- und Skript-Namen auf den ersten Blick eindeutig zuordnen.

Wie finden Sie aber heraus, welches Skript zu welcher Anwendung gehört? Dabei hilft die Online-Dokumentation man. Deren Manual Pages führen auf, welche Aufgaben ein Dienst übernimmt und wie man ihn konfiguriert. Um eine Man-Page anzuzeigen, geben Sie den Befehl man, gefolgt von einem Dienstnamen ein (zum Beispiel: man sshd). Oft stimmen Skript- und Dienst-Namen allerdings nicht exakt überein. Meist fehlt aber nur der Buchstabe d (für "Daemon") am Ende. So ruft etwa das Skript smb den Daemon smbd auf, der den Samba-Server startet und stoppt.

Werden Sie weder mit noch ohne d am Ende fündig, übergeben Sie den Dienstnamen an apropos: Der Befehl apropos smb etwa gibt daraufhin eine Liste aller Man-Pages aus, in denen sich der Begriff "smb" findet.

Skripts unter der Lupe

Selbst ein Skript für einen Dienst herzustellen, setzt beträchtliche Grundkenntnisse über Shell-Programmierung und reichlich Geduld voraus. Allerdings ist es auch nur in den seltensten Fällen notwendig: Linux-Distributionen bringen für jede auf den CDs vorhandene Software auch ein Init-Skript mit.

Die Skripte finden sich im Verzeichnis /sbin/init.d/, das auch die RunleveI-Konfigurationen vorhält. Für jeden Runlevel existiert ein eigenes Verzeichnis (rc0.d bis rc6.d). Die dort enthaltenen symbolischen Links verweisen auf das tatsächliche Skript in /sbin/init.d/. Löschen Sie mit dem SysV Init Editor zum Beispiel einen Dienst im Runlevel 2, entfernt das Programm einfach den entsprechenden symbolischen Link im Verzeichnis rc2.d. Fügen Sie umgekehrt einen Dienst hinzu, setzt ksysv einen neuen Link.

Ein typisches Beispiel liefert das Skript syslog: Hier finden sich sechs Optionen, um den Protokolldienst Syslog manuell zu bedienen: start, stop, restart, reload, status und probe. Diese Optionen offeriert jedes System-Skript. Sie dienen der Konfiguration des jeweiligen Programms, ohne jedes Mal den Rechner neu booten zu müssen.

Fazit

Mit den Beschreibungen aus unserem Workshop sowie etwas Mut zum Experiment sollte es Ihnen keine Schwierigkeiten bereiten, für Ihr Linux-System eine maßgeschneiderte Boot-Konfiguration zu erstellen.

Falls Ihnen unser kleiner Einstieg Lust auf mehr Informationen rund um Linux-Bootkonfigurationen gemacht hat, sollten Sie einmal beim Linux Documentation Project vorbeischauen. Hier empfiehlt sich speziell die Lektüre folgender HOWTOs:

Vergessen Sie auf keinen Fall bei der Arbeit mit den Start-up-Dateien, die nötige Vorsicht walten zu lassen. Halten Sie für den Fall der Fälle immer eine funktionsfähige Boot-Diskette in der Hinterhand. Beachten Sie zudem, dass Linux nicht immer gleich Linux ist: Je nach Distribution können sowohl Name als auch Inhalt der beschriebenen Files sowie der Pfad zu ihnen leicht variieren. jlu)