Die folgende Erläuterung ist geliehen von tksysv (einer Inspirationsquelle für
KSysV)
Die System V init entwickelt sich rasch zum Standard für die Kontrolle von
Programmstarts beim Hochfahren des Systems in der Linux Welt. Und zwar deshalb,
weil sie leichter zu benutzen, mächtiger und zugleich flexibler ist als die
traditionelle BSD-init.
Ich werde hier nicht weiter auf geschichtliche Aspekte eingehen
(v.a. weil ich darüber selbst nichts weiß :-).
Die init-Binärdatei liegt unter /sbin und nicht unter
/etc. Dies ist deshalb wichtig, weil vielleicht jemand versuchen
könnte, eine Maschine auf System V init umzustellen, ohne eine Neuinstallation
und Neuformatierung vorzunehmen. Der Linux Kernel sieht zuerst unter
/etc nach einer init-Datei. Deshalb müssen Sie sichergehen,
dass die alte init von dort entfernt wurde, falls es dort eine gab.
Die SysV init unterscheidet sich auch dadurch von der BSD init, dass sich die
Konfigurationsdateien in einem Unterordner von /etc befinden statt
direkt in /etc. Dieser Ordner heißt rc.d. Dort finden
Sie rc.sysinit und folgende weitere Ordner:
-
init.d/
-
rc0.d/
-
rc1.d/
-
rc2.d/
-
rc3.d/
-
rc4.d/
-
rc5.d/
-
rc6.d/
init.d enthält eine ganze Menge Skripte. Grundsätzlich benötigen
Sie ein Skript für jeden Systemdienst, den Sie beim Hochfahren des Systems bzw.
beim Wechsel auf ein anderes Runlevel starten möchten. Systemdienste beinhalten
solche Dinge wie Netzwerk, NFS, sendmail, httpd etc.
Systemdienste beinhalten dagegen nicht solche Sachen wie
setserial, das nur einmal gestartet wird. Solche Aufrufe
gehören nach rc.local.
rc.local sollte seinerseits unter /etc/rc.d liegen,
wenn Sie es benötigen. Die meisten Systeme besitzen diese Datei, auch wenn es
eigentlich nicht viel Verwendung dafür gibt. Sie können ebenfalls ein
rc.serial in /etc/rc.d anlegen, wenn Sie beim
Hochfahren etwas ausführen lassen wollen, was mit dem seriellen Anschluss zu tun
hat.
Der Ablauf ist folgender:
-
der Kernel sucht an verschiedenen Stellen nach dem Programm init und startet die
erste, die er findet;
-
init startet /etc/rc.d/rc.sysinit.
-
rc.sysinit tut eine Menge notwendiger Dinge und startet
dann rc.serial (wenn es existiert);
-
init startet rc.local
-
init startet alle Skripte für das voreingestellte Runlevel.
Das standardmäßige Runlevel ist in /etc/inittab eingetragen. Sie
sollten im Anfangsbereich eine Zeile wie die folgende sehen:
An diesem Punkt können Sie einen Blick in die zweite Spalte werfen und
wahrscheinlich feststellen, dass das voreingestellte Runlevel 3 ist. Wenn Sie
das ändern möchten, dann können Sie /etc/inittab von Hand
bearbeiten und die 3 ändern. Seien Sie sehr vorsichtig, wenn
Sie an der inittab Änderungen durchführen. Falls Sie doch etwas
durcheinandergebracht haben, dann kommen Sie zur Reparatur wieder heran, indem
Sie das System neu starten und folgendes ausführen:
Dies sollte Ihnen ermöglichen, in den Einzelnutzer-Modus zu kommen und die
Reparatur vorzunehmen.
Aber wie startet es nun all die richtigen Skripte? Wenn Sie
ls -l eingeben in rc3.d, dann sehen Sie
wahrscheinlich etwas wie das Folgende:
lrwxrwxrwx 1 root root 13 13:11 S10network -> ../init.d/network lrwxrwxrwx 1 root root 16 13:11 S30syslog -> ../init.d/syslog lrwxrwxrwx 1 root root 14 13:32 S40cron -> ../init.d/cron lrwxrwxrwx 1 root root 14 13:11 S50inet -> ../init.d/inet lrwxrwxrwx 1 root root 13 13:11 S60nfs -> ../init.d/nfs lrwxrwxrwx 1 root root 15 13:11 S70nfsfs -> ../init.d/nfsfs lrwxrwxrwx 1 root root 18 13:11 S75keytable -> ../init.d/keytable lrwxrwxrwx 1 root root 23 13:11 S80sendmail -> ../init.d/sendmail.init lrwxrwxrwx 1 root root 18 13:11 S90lpd -> ../init.d/lpd.init lrwxrwxrwx 1 root root 11 13:11 S99local -> ../rc.local
|
Sie werden bemerken, das sich in diesem Ordner keine richtigen
Dateien befinden. Stattdessen ist jeder Eintrag hier eine Verknüpfung
zu einem der Skripte im Verzeichnis init.d.
Die Verknüpfungen haben auch ein S und eine Nummer am Anfang.
Das S besagt, dass dieses bestimmte Skript gestartet werden soll,
so wie umgekehrt ein K den Stopp bedeuten würde. Die Nummer dient einfach
der Anordnung.Tatsächlich startet init alle Systemdienste in der Reihenfolge,
in der sie erscheinen. Sie können die Nummern also doppelt vergeben, aber es
wird Sie nur selbst durcheinander bringen. Sie benötigen bloß irgendeine
zweistellige Zahl, zusammen mit einem großgeschriebenen S oder K um einen
Systemdienst zu starten oder anzuhalten.
Wie startet und stoppt init eigentlich Systemdienste? Ganz
einfach: Jedes der Skripte ist so geschrieben, dass es ein Argument wie start
und stop akzeptiert. Sie können diese Skripte tatsächlich von Hand auf der
Kommandozeile folgendermaßen starten:
root@linux /root#
/etc/rc.d/init.d/httpd.init stop
|
Dies würde den httpd-Server anhalten. Init liest einfach den
Namen, und wenn der ein K beinhaltet, dann wird das Skript mit dem
Argument stop aufgerufen. Wenn er ein S beinhaltet, dann wird
das Skript mit dem Argument start aufgerufen.
Manche Leute wünschen sich eine einfache Art,
Maschinen für viele Zwecke einzurichten. Ich könnte z.B.
ein "Server"-Runlevel haben, das nur httpd, sendmail, networking etc.
laufen lässt. Darüber hinaus könnte ich auch noch ein "Benutzer"-Runlevel
haben, das z. B. xdm startet.
|
|