Copyright © 1995 by O'Reilly/International Thomson Verlag

Bitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen.

Wünschen Sie mehr Informationen zu der gedruckten Version des Buches "Linux - Wegweiser zur Installation & Konfiguration", dann klicken Sie hier.


Kapitel 4

Systemstart und -initialisierung

In diesem Abschnitt werden wir besprechen, was genau beim Booten des Systems passiert. Zur Durchführung einiger Systemkonfigurationen ist das Verständnis dieser Vorgänge und der beteiligten Dateien unerläßlich.

Boot-Meldungen des Kernels

Der erste Schritt ist das Booten des Kernels. Wie wir im vorhergehenden Abschnitt gezeigt haben, kann dies von einer Diskette oder von der Festplatte geschehen. Während der Kernel in den Arbeitsspeicher geladen wird, erscheinen auf der Systemkonsole Meldungen wie:

20480 bytes for swap cache allocated
Console: colour EGA+ 80x25, 8 virtual consoles
Serial driver version 4.00 with no serial options enabled
tty00 at 0x03f8 (irq = 4) is a 16450
tty01 at 0x02f8 (irq = 3) is a 16450
tty03 at 0x02e8 (irq = 3) is a 16550A
snd2 <SoundBlaster Pro 3.2> at 0x220 irq 5 drq 1
snd1 <Yamaha OPL-3 FM> at 0x388 irq 0 drq 0
Drive 0: CR-52x-x (2.11)
SBPCD: 1 SoundBlaster CD-ROM drive(s) at 0x0230.
Calibrating delay loop.. ok - 33.22 BogoMips
Memory: 19312k/20480k available (476k kernel code, 384k reserved, 308k data)
This processor honours the WP bit even when in supervisor mode. Good.
Floppy drive(s): fd0 is 1.44M
Swansea University Computer Society NET3.016
Checking 386/387 coupling... Ok, fpu using exception 16 error reporting.
Linux version 1.1.37 (root@loomer) #4 Fri Sep 30 00:08:33 EDT 1994
Partition check:
  hda: Maxtor 7213 AT (202MB IDE w/64KB Cache, MaxMult=32, CHS=683/16/38)
  hda: hda1 hda2
  hdb: WDC AC140M (40MB IDE w/31KB Cache, MaxMult=8, CHS=977/5/17)
  hdb: hdb1 hdb2

Es ist der Kernel selbst, der diese Meldungen ausgibt, wenn die Gerätetreiber initialisiert werden. Welche Meldungen ausgegeben werden, hängt davon ab, welche Treiber in Ihren Kernel einkompiliert sind und welche Hardware in Ihr System eingebunden ist. Im folgenden beschreiben wir, was die einzelnen Meldungen bedeuten.

Zunächst sehen wir, daß der Kernel 20 Kilobytes als »Swap-Cache« zugewiesen hat. Dieser Cache dient dem beschleunigten Auslagern und Zurücklesen von Speicherseiten zwischen Arbeitsspeicher und Festplatte (mehr dazu weiter unten in diesem Kapitel). Danach wird der Typ der Systemkonsole angezeigt; beachten Sie, daß dies nur den Textmodus betrifft, den der Kernel benutzt, nicht aber die Möglichkeiten Ihrer Grafikkarte. (Auch eine SVGA-Karte wird als EGA+ gemeldet, soweit der Textmodus der Konsole betroffen ist.)

Als nächstes wird der Treiber für die seriellen Schnittstellen initialisiert, der für jede gefundene Schnittstelle einige Informationen ausgibt. Eine Zeile wie:

tty00 at 0x03f8 (irq = 4) is a 16450

besagt, daß die erste serielle Schnittstelle ( /dev/tty00 oder COM1) unter der Adresse 0x03f8 gefunden wurde, IRQ 4 benutzt und einen UART 16450 enthält.

Danach wird der Treiber für die Soundkarte initialisiert; die Namen und Adressen der verschiedenen Soundperipheriegeräte werden angezeigt. In diesem Fall wird eine Soundblaster-Pro-Karte zusammen mit einem Soundblaster-Pro-CD-ROM-Laufwerk gefunden.

Die nächste Meldung zeigt die Berechnung der »BogoMips« für Ihren Prozessor. Es handelt sich um eine absolut falsche Berechnung (bogus: Schwindel -- daher der Name), die zur optimalen Gestaltung der Warteschleifen in einigen Gerätetreibern benutzt wird. Der Kernel gibt außerdem Informationen zum Arbeitsspeicher aus:

Memory: 19312k/20480k available (476k kernel code, 384k reserved, 308k data)

In diesem Beispiel stehen dem System 19.312 Kilobytes an RAM zur Verfügung. Demnach belegt der Kernel selbst 1168 Kilobytes.

Anschließend wird der Treiber für das Diskettenlaufwerk initialisiert. Das System in unserem Beispiel hat keine Netzwerkkarte installiert; bei vorhandener Ethernet-Karte werden weitere Informationen angezeigt.

Zum Abschluß wird der Treiber für IDE-Festplatten initialisiert, und für jedes IDE-Laufwerk werden der Typ und eine Liste der vorhandenen Partitionen angezeigt.

Abhängig von Ihrer Hardware werden eventuell noch weitere Meldungen ausgegeben. So werden zu diesem Zeitpunkt auch parallele Schnittstellen und SCSI-Treiber initialisiert, falls vorhanden.

Diese Meldungen werden beim Booten auf der Konsole ausgegeben und in der Regel auch in den System-Logdateien mitgeschrieben.

init und inittab

Nach der Initialisierung der Gerätetreiber führt der Kernel das Programm init aus, das in einem der Verzeichnisse /etc , /bin oder /sbin steht (auf den meisten Systemen in /sbin/init ).

init ist ein Programm mit mehreren Aufgaben, das neue Prozesse erzeugt und bestimmte Programme nach deren Terminierung wieder startet. So läuft z.B. auf jeder virtuellen Konsole ein getty -Prozeß, der von init gestartet wird. Wenn Sie an einer der virtuellen Konsolen eine Login-Sitzung beenden, terminiert der getty -Prozeß und init startet einen neuen, damit Sie wieder einloggen können.

init ruft außerdem beim Booten des Systems eine Reihe von Programmen und Skripts auf. Die Datei /etc/inittab kontrolliert sämtliche Aktionen von init . Jede Zeile dieser Datei hat das Format:

code:runlevel:aktion:befehl

Code ist ein eindeutiger Name aus einem oder zwei Buchstaben, der jeden Eintrag in dieser Datei identifiziert. Einige dieser Einträge müssen einen bestimmten Code haben, damit sie korrekt funktionieren; mehr dazu erfahren Sie weiter unten.

Runlevel ist eine Liste der »Runlevels«, auf denen der betreffende Eintrag ausgeführt werden soll. Ein Runlevel ist einfach eine Ziffer oder ein Buchstabe zur Bezeichnung des aktuellen Systemzustands bei der Ausführung von init . Ein Beispiel: Wenn der Runlevel des Systems auf 3 geändert wird, werden diejenigen Einträge in /etc/inittab ausgeführt, die im Feld Runlevel eine 3 stehen haben. Die Runlevels bieten eine einfache Methode, die Einträge in /etc/inittab gruppenweise zusammenzufassen. Sie könnten z.B. festlegen, daß Runlevel 1 nur das notwendige Minimum an Skripts ausführt, Runlevel 2 alles aus Runlevel 1 und zusätzlich die Netzwerkkonfiguration durchführt, während Runlevel 3 alles aus Runlevel 1 und 2 sowie den Wählzugang zum System konfiguriert usw.

In der Regel brauchen Sie sich mit den Runlevels nicht weiter zu befassen. Das System begibt sich beim Booten auf den (in /etc/inittab ) voreingestellten Runlevel. Bei den meisten Systemen ist das Runlevel 5. Solange Sie keinen besonderen Grund haben, das System nicht mit allen hier beschriebenen Konfigurationsskripts hochzufahren, können Sie einfach den voreingestellten Runlevel benutzen.

Das Feld Befehl enthält den Befehl, den init für diesen Eintrag ausführen wird. Das Feld Aktion weist init an, wie ein Eintrag ausgeführt werden soll, z.B. ob ein Befehl nur einmal ausgeführt oder ob er nach der Terminierung jedesmal erneut aufgerufen werden soll.

Lassen Sie uns einen Blick auf die beispielhafte /etc/inittab in werfen.

Beispiel 4-1. Beispielhafte /etc/inittab-Datei

# Set the default runlevel to five
# Voreinstellung für Runlevel ist 5
id:5:initdefault:
# Execute /etc/rc.d/rc.S when the system boots
# Beim Booten des Systems /etc/rc.d/rc.S aufrufen
si:S:sysinit:/etc/rc.d/rc.S
# Run this script when entering runlevel S (single-user mode)
# Bei Runlevel S (Single-User-Modus) dieses Skript ausführen
su:S:wait:/etc/rc.d/rc.K
# Run this script for all other runlevels (multi-user mode)
# Bei allen anderen Runlevels (Multi-User-Modus) dieses Skript ausführen
rc:12345:wait:/etc/rc.d/rc.M
# Executed when we press ctrl-alt-delete
# Wird beim 'Affengriff' CTRL-ALT-DELETE ausgeführt
ca::ctrlaltdel:/sbin/shutdown -t3 -rf now
# Start agetty for virtual consoles 1 through 6
# agetty starten auf virtuellen Konsolen 1 bis 6
c1:12345:respawn:/sbin/agetty 38400 tty1
c2:12345:respawn:/sbin/agetty 38400 tty2
c3:45:respawn:/sbin/agetty 38400 tty3
c4:45:respawn:/sbin/agetty 38400 tty4
c5:45:respawn:/sbin/agetty 38400 tty5
c6:45:respawn:/sbin/agetty 38400 tty6

Der tatsächliche Inhalt von /etc/inittab hängt von Ihrem System und der Linux-Distribution ab, die Sie installiert haben.

Als erstes wird die Voreinstellung für den Runlevel auf 5 gesetzt. Das Feld Aktion für diesen Eintrag enthält initdefault, was zur Folge hat, daß der angegebene Runlevel zur Voreinstellung wird. Dies ist der Runlevel, der üblicherweise beim Booten des Systems benutzt wird. Sie können diese Voreinstellung überschreiben, indem Sie init mit dem gewünschten Runlevel von Hand aufrufen (z.B. wenn Sie Ihre Konfiguration debuggen). LILO kann auch im Einzelbenutzermodus booten (Runlevel S) -- lesen Sie dazu den Abschnitt » Die Boot-Optionen festlegen « .

Der nächste Eintrag weist init an, beim Systemstart das Skript /etc/rc.d/rc.S auszuführen. (Das Feld Aktion enthält sysinit, was besagt, daß dieser Eintrag ausgeführt werden soll, wenn init beim Systemstart aufgerufen wird.) Diese Datei ist einfach ein Shell-Skript, das Befehle zur grundlegenden Systemkonfiguration enthält. Dazu gehören z.B. das Anlegen der Swap-Partition, die Überprüfung und das Aufsetzen der Dateisysteme sowie die Synchronisierung der Systemuhr mit der CMOS-Uhr. Sie können sich diese Datei auf Ihrem System ansehen; wir werden weiter unten in diesem Kapitel noch auf die Befehle darin eingehen. Lesen Sie auch die Abschnitte » Mit Dateisystemen arbeiten « und » Swap-Space benutzen « .

Wie Sie sehen, wird danach das Skript rc.K ausgeführt, wenn der Runlevel S (Single-User-Modus) erreicht wird. rc.K enthält normalerweise Befehle zum Absetzen der Dateisysteme und zum Beenden des Swapping, so daß der Systemverwalter ggf. Wartungsarbeiten durchführen kann. Das Feld Aktion enthält bei diesem Eintrag wait, womit erreicht wird, daß init den betreffenden Befehl ausführt und erst nach der Beendigung dieses Befehls irgendeine andere Aktion startet.

In ähnlicher Weise wird das Skript rc.M für die Runlevels 1 bis 5 durchgeführt -- das sind die »Multi-User-Modi«. Wie Sie diese Runlevels voneinander unterscheiden wollen, liegt in Ihrer Hand; auf vielen Systemen gibt es keinen Unterschied zwischen ihnen. rc.M enthält die meisten der verbleibenden Befehle zur Konfiguration des Systems: Dazu gehören der Aufruf des Bildschirmschoners, die Einstellung des Rechnernamens, die Initialisierung des Netzwerks sowie der Start einiger Dämonen wie syslogd (der Log-Dämon für das System) und lpd (der Drucker-Dämon). Auch diese Datei können Sie sich ansehen und feststellen, welche Befehle auf Ihrem System aufgerufen werden.

Auf vielen Systemen ruft rc.M weitere Skripts aus /etc/rc.d auf. Das wichtigste darunter ist rc.local , das eine »lokale« Konfiguration durchführt -- alle Befehle, die Sie an die Startroutine anhängen möchten, um sich die Arbeit zu erleichtern. Natürlich könnten Sie ebenso gut ein Skript wie rc.M direkt anpassen, aber durch die Benutzung eines anderen Skriptes -- rc.local -- für solche persönlichen Anpassungen des Systems trennen Sie Ihre Änderungen von der Konfiguration, wie sie in der Original-Distribution enthalten ist. Dies ist wohl eine Frage des persönlichen Geschmacks -- technisch gesehen spielt das keine Rolle.

Der nächste Eintrag mit dem Code ca wird ausgeführt, wenn an der Konsole die Tastenkombination CTRL-ALT-DEL (auch bekannt als »Affengriff«) gedrückt wird. Diese Tastenkombination erzeugt einen Interrupt, der normalerweise das System neu starten würde. Unter Linux wird dieser Interrupt abgefangen und an init weitergeleitet, das dann den Eintrag mit dem Aktion -Feld ctrlaltdel ausführt. Der Befehl, der hier ausgeführt wird, nämlich /sbin/shutdown -t3 -rf now , wird das System »sicher« herunterfahren und neu starten. (Lesen Sie auch » Das System herunterfahren « im nächsten Abschnitt.) Auf diese Weise bewahren wir das System vor einem unerwarteten Neustart infolge der Tastenkombination CTRL-ALT-DEL.

Am Ende enthält die Datei inittab eine Reihe von Einträgen, die /sbin/agetty für die ersten sechs virtuellen Konsolen ausführen. agetty ist eine von mehreren getty -Versionen, die es für Linux gibt. getty ist ein Programm, das ein Terminal (etwa eine virtuelle Konsole oder serielle Schnittstelle) öffnet, verschiedene Parameter für den Terminaltreiber setzt und dann /bin/login aufruft, um auf dem Terminal eine Login-Sitzung zu starten. Deshalb muß auf einer virtuellen Konsole, auf der Sie Logins zulassen wollen, ein getty oder agetty laufen. agetty ist die Version, die auf einer ganzen Reihe von Linux-Systemen benutzt wird, während andere mit getty arbeiten, das eine etwas andere Syntax hat. In den Man-Pages finden Sie Details zu getty und agetty auf Ihrem System.

agetty akzeptiert zwei Parameter: eine Baudrate und einen Gerätenamen. Die Schnittstellen für die virtuellen Konsolen unter Linux heißen /dev/tty1 , /dev/tty2 usw. agetty sucht die Gerätenamen unterhalb von /dev . Die Baudrate sollte für virtuelle Konsolen immer auf 38.400 gesetzt werden.

Beachten Sie, daß im Feld Aktion der agetty -Einträge ein respawn (etwa: Neustart) steht. Dies veranlaßt init , den Befehl in diesem Eintrag immer wieder neu aufzurufen, wenn der agetty -Prozeß terminiert -- was bei jedem Ausloggen eines Benutzers der Fall ist.

Inzwischen sollte init eine bekannte Größe darstellen, aber die diversen Dateien und Befehle in /etc/rc.d , die die eigentliche Arbeit erledigen, bleiben rätselhaft. Wir können auf diese Dateien nicht näher eingehen, ohne mehr Hintergrundwissen zu anderen Aufgaben der Systemverwaltung zu liefern, z.B. zur Handhabung von Dateisystemen. Lesen Sie weiter, und am Ende dieses Kapitels werden hoffentlich alle Fragen beantwortet sein.


Inhaltsverzeichnis Vorherige Abschnitt Nächste Abschnitt