![]() |
|
Linux - Wegweiser zur Installation & Konfiguration, 3. AuflageOnline-VersionBitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen. Wünschen Sie mehr Informationen zu der gedruckten Version des Buches Linux - Wegweiser zur Installation & Konfiguration oder wollen Sie es bestellen, dann klicken Sie bitte hier.
|
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.
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, die aber normalerweise auch in den Protokolldateien des Systems gespeichert werden. Als Superuser können Sie immer in der Datei /var/log/messages nachsehen (diese Datei enthält auch Meldungen, die der Kernel während der Laufzeit des Systems ausgibt). Der Befehl dmesg gibt die Meldungen aus dem Ring-Buffer des Kernels aus; direkt nach dem Booten sind das natürlich die Boot-Meldungen, die etwa so aussehen können (auf Ihrem System kann es auch andere Meldungen geben, auch in einer anderen Reihenfolge):
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 kompiliert sind und welche Hardware in Ihr System eingebunden ist. Im folgenden beschreiben wir, was die einzelnen Meldungen bedeuten.
Zuerst meldet der Kernel, welchen Konsolenzeichensatz er gewählt und welchen Konsolentyp er erkannt hat. Das betrifft übrigens nur den vom Kernel verwendeten Textmodus und nicht die Fähigkeiten Ihrer Grafikkarte. (Was den Konsolentreiber angeht, wird eine SVGA-Karte als VGA+
gemeldet.)
Als nächstes sammelt der Kernel Informationen über den PCI-Bus und meldet, welche PCI-Karten er im System gefunden hat.
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:
In diesem Beispiel stehen dem System 14 984 Kilobytes an RAM zur Verfügung. Demnach belegt der Kernel selbst 1 500 Kilobytes.
Anschließend wird das Netzwerk-Subsystem im Kernel initialisiert und der Prozessortyp abgefragt. Sie sehen an der Meldung:
daß der Kernel schlau genug ist, den berühmten Pentium-Fehler zu entdecken und zu umgehen. Die Zeile
teilt Ihnen die Versionsnummer des Kernels mit und wer diesen auf welchem Rechner kompiliert hat. (In diesem Fall war das der Benutzer root auf dem Rechner mit dem Namen rabbit mit dem Compiler egcs 1.0.3.) Daraufhin wird der serielle Treiber initialisiert, was für jede erkannte serielle Schnittstelle eine Meldung ausgibt. Die Zeile
besagt, daß die erste serielle Schnittstelle (/dev/tty00 oder COM1) an der Adresse 0x3f8 und dem IRQ 4 entdeckt wurde und dafür die Funktionen für den UART 16550A verwendet werden. Als nächstes kommt die Konfiguration und Überprüfung des SCSI-Controllers. Der Kernel gibt Informationen über alle gefundenen SCSI-Geräte aus. Die Zeile
sagt Ihnen, wieviel Swap-Space der Kernel gefunden hat. Zu den weiteren Aktionen bei einem typischen Boot-Vorgang gehören das Finden und Konfigurieren einer parallelen Schnittstelle (lp1
), das Finden und Konfigurieren einer Netzwerkkarte und schließlich das Einrichten des ISDN-Subsystems. Als letztes wird das Auffinden eines Diskettenlaufwerks gemeldet. Je nach Hardware werden noch andere Meldungen ausgegeben.
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 zum Beispiel 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 Skripten auf. Die Datei /etc/inittab kontrolliert sämtliche Aktionen von init. Jede Zeile dieser Datei hat das Format:
code ist eine eindeutige Zeichenfolge aus ein oder zwei Zeichen, die jeden Eintrag in dieser Datei ideiziert. 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 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 zum Beispiel festlegen, daß Runlevel 1 nur das notwendige Minimum an Skripten 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, darauf kommen wir noch) voreingestellten Runlevel. Bei den meisten Systemen ist das Runlevel 2 oder 3. Nachdem wir das normale Booten besprochen haben, zeigen wir Ihnen, wie Sie in einen anderen Runlevel kommen, den Sie manchmal benötigen - Runlevel 1 oder den Single-User-Modus.
Lassen Sie uns einen Blick auf die Beispieldatei /etc/inittab werfen:
Die einzelnen Felder sind durch Doppelpunkte voneinander getrennt. Das letzte Feld ist am leichtesten zu erkennen: Es handelt sich um den Befehl, den init beim entsprechenden Runlevel ausführt. Das erste Feld ist ein beliebiger Bezeichner (was Sie hier verwenden, ist egal, solange der Bezeichner eindeutig ist), das zweite gibt an, in welchen Runleveln der Befehl ausgeführt wird. Das dritte Feld teilt init mit, was genau mit diesem Befehl gemacht werden soll; beispielsweise ob dieser einmalig ausgeführt oder immer wieder neu gestartet werden soll, wenn der Befehl beendet wird.
Der tatsächliche Inhalt von /etc/inittab hängt von Ihrem System und der Linux-Distribution ab, die Sie installiert haben.
In unserer Beispieldatei wird als erstes die Voreinstellung für den Runlevel auf 3 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 (zum Beispiel, wenn Sie Ihre Konfiguration debuggen). Beispielsweise beendet der folgende Befehl alle laufenden Prozesse und wechselt in den Runlevel 5 - warnen Sie alle Benutzer auf dem System, bevor Sie das tun:
LILO kann auch im Single-User-Modus booten (Runlevel 1) - lesen Sie dazu den Abschnitt »Die Boot-Optionen festlegen« weiter vorn in diesem Kapitel.
Der nächste Eintrag weist init an, beim Systemstart das Skript /etc/rc.d/rc.sysinit auszuführen. (Das Feld Aktion enthält |
Wie Sie sehen, wird danach das Skript /etc/rc.d/rc ausgeführt, wenn einer der Runlevel 0 bis 6 erreicht wird, wobei der jeweilige Runlevel als Argument übergeben wird. rc ist ein allgemeines Startup-Skript, das die anderen Skripten, die zum jeweiligen Runlevel gehören, ausführt. 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 diesem Abschnitt beschreiben wir die Struktur der rc-Dateien, damit Sie wissen, wo alles anfängt, und in den seltenen Fällen, in denen das System nicht so will wie Sie, Server von Hand starten und anhalten können. Wir verwenden Red Hat als Beispiel, aber wenn Sie einmal das Prinzip verstanden haben, dann sollten Sie sich auf jedem System zurechtfinden können.
Auf Red Hat-Systemen ist die grundlegende rc-Datei /etc/rc.d/rc. Der Pfad ist auf anderen Systemen etwas anders (beispielsweise /etc/init.d/rc auf Debian-Systemen), aber die Inhalte sind sehr ähnlich. Im vorigen Abschnitt konnten Sie sehen, wie /etc/inittab das Skript in verschiedenen Situationen mit einer Zahl zwischen 0 und 6 als Argument aufruft. Diese Zahlen entsprechen den Runleveln, und jede führt dazu, daß die rc-Dateien einen anderen Satz von Skripten aufrufen. Als nächstes müssen wir also die zu einem Runlevel passenden Skripten finden.
Auf Red Hat-Systemen sind die Skripten für die einzelnen Runlevel im Verzeichnis /etc/rc.d/rcN abgelegt, wobei N für den zu startenden Runlevel steht. Für den Runlevel 3 werden also die Skripten in /etc/rc.d/rc3 verwendet. Auch hier kann es bei anderen Distributionen wieder anders aussehen, bei Debian heißt das Verzeichnis beispielsweise /etc/rcN.d.
Wenn Sie in eines dieser Verzeichnisse hineinschauen, werden Sie eine Reihe von Dateinamen der Form Snnxxxx und Knnxxxx sehen, wobei nn eine Zahl zwischen 00 und 99 und xxxx der Name eines Systemdienstes ist. Skripten, deren Namen mit S anfangen, werden beim Starten der Systemdienste und solche, die mit K anfangen, beim Anhalten (kill) verwendet.
Die Nummern nn dienen dazu, eine Ausführungsreihenfolge der Skripten festzulegen - Skripten mit niedrigeren Nummern werden vor solchen mit höheren Nummern ausgeführt. Der Name xxx dient lediglich dazu, zu ideizieren, zu welchem Systemdienst das Skript gehört. Diese Benennungskonvention sieht vielleicht etwas merkwürdig aus, aber sie erleichtert das Hinzufügen oder Entfernen von Skripten zu/aus diesen Dateien, wobei die korrekte Ausführungsreihenfolge erhalten bleibt. Zum Anpassen von Startskripten können Sie der Einfachheit halber auch einen graphischen Runlevel-Editor, wie etwa ksysv aus dem KDE-Projekt (siehe Kapitel 11, Die X Arbeitsoberfläche anpassen), verwenden. |
Beispielsweise könnte das Skript zur Initialisierung des Netzwerks S10network heißen, während das Skript zum Anhalten des Logging-Dämons vielleicht K70syslog heißt. Wenn diese Dateien in den richtigen /etc/rc.d/rcN.d-Verzeichnissen abgelegt werden, führt /etc/rc.d/rc sie in numerischer Reihenfolge beim Starten oder Herunterfahren des Systems aus. Wenn der Default-Runlevel Ihres Systems 3 ist, können Sie in /etc/rc.d/rc3.d nachsehen, welche Skripten beim Hochfahren des Systems normalerweise ausgeführt werden.
Weil die gleichen Services in verschiedenen Runleveln gestartet oder angehalten werden, verwenden viele Distributionen symbolische Links, anstatt das gleiche Skript an mehreren Stellen zu wiederholen. Jede S- oder K-Datei ist damit ein symbolischer Link, der in ein zentrales Verzeichnis verweist, das Start- und Stop-Skripten enthält. Unter Red Hat ist das das Verzeichnis /etc/rc.d/init.d, unter SuSE /bin/init.d und unter Debian /etc/init.d. Auf Debian-Distributionen enthält dieses Verzeichnis ein Skript namens skeleton, das Sie anpassen können, um zusätzliche Dämonen, die Sie vielleicht selbst geschrieben haben, zu starten oder anzuhalten.
Es ist nützlich zu wissen, wo sich ein Start- oder Stop-Skript befindet, wenn Sie nicht gleich das ganze System neu starten und in einen anderen Runlevel versetzen wollen, aber einen bestimmten Dienst starten oder anhalten müssen. Suchen Sie im init.d-Verzeichnis nach einem Skript mit dem passenden Namen, und führen Sie es aus, wobei Sie als Parameter entweder start
oder stop
übergeben. Wenn Sie auf einem SuSE-System beispielsweise den Webserver Apache starten wollen, Ihr System sich aber in einem Runlevel befindet, in dem Apache normalerweise nicht läuft, dann geben Sie folgendes ein:
Ein weiteres interessantes Systemkonfigurationsskript ist /etc/rc.d/rc.local, das ausgeführt wird, nachdem die anderen Systeminitialisierungsskripten gelaufen sind. (Wie kann das erreicht werden? Normalerweise wird ein symbolischer Link auf rc.local in jedem der /etc/rc.d/rcN.d-Verzeichnisse mit dem Namen S99local angelegt. Da 99 der höchstmögliche numerische Wert ist, den ein S-Skript haben kann, wird es als letztes ausgeführt. Voilà!) Sie können rc.local editieren, um jeden merkwürdigen oder ungewöhnlichen Systembefehl zur Startzeit ausführen zu lassen. Auch wenn Sie sich nicht sicher sind, wann ein solcher Befehl ausgeführt werden sollte, ist rc.local die richtige Stelle. Auf Debian-Systemen gibt es diese Datei nicht, aber niemand kann Sie daran hindern, selbst eine solche anzulegen und sie von rc aus aufzurufen, wenn Sie das so gewohnt sind.
Der nächste Eintrag mit dem Code ca wird ausgeführt, wenn an der Konsole die Tastenkombination STRG-ALT-ENTF (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 Aktionsfeld 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« weiter hinten in diesem Kapitel.) Auf diese Weise bewahren wir das System vor einem unerwarteten Neustart infolge der Tastenkombination STRG-ALT-ENTF.
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. Diese Programme ermöglichen das Anmelden an einem Terminal, ohne sie wäre das Terminal quasi tot und würde nicht auf Tastatur- oder Mauseingaben des Benutzers reagieren. Die verschiedenen getty-Befehle öffnen ein Terminal-Gerät (wie eine virtuelle Konsole oder eine serielle Leitung), legen verschiedene Parameter für den Terminal-Treiber fest und rufen dann /bin/login auf, um auf dem Terminal eine Login-Sitzung zu starten. Deshalb muß auf einer virtuellen Konsole, auf der Sie Logins zulassen wollen, 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 Manpages finden Sie Details zu getty und agetty auf Ihrem System.
agetty akzeptiert zwei Parameter: eine Baud-Rate 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 Baud-Rate 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, zum Beispiel zur Handhabung von Dateisystemen. Wir führen Sie in den nächsten Kapiteln durch diese Aufgaben, so daß am Ende alles klar sein sollte.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Weitere Informationen zum Linux - Wegweiser zur Installation & Konfiguration
Weitere Online-Bücher & Probekapitel finden Sie in unserem Online Book Center
© 2000, O'Reilly Verlag