init, telinit - Initialisierung der Prozesssteuerung
/sbin/init [
-a ] [
-s ] [
-b ] [
-z
xxx ] [
0123456Ss ]
/sbin/init [
--version ]
/sbin/telinit [
-t SEKUNDEN ] [
0123456sSQqabcUu ]
/sbin/telinit [
-e VAR[
=WERT] ]
init ist der Elternprozess aller Prozesse. Seine Hauptaufgabe besteht
darin, Prozesse aus einem Skript in der Datei
/etc/inittab zu erzeugen
(siehe auch
inittab(5)). Diese Datei hat normalerweise Einträge,
die
init dazu veranlassen auf jeder Leitung
gettys zu erzeugen,
auf der sich ein Benutzer einloggen kann. Er steuert auch alle
unabhängigen Prozesse, die von einem bestimmten System benötigt
werden.
Ein
Runlevel ist eine Software-Konfiguration des Systems, der es nur
einer ausgewählten Gruppe von Prozessen erlaubt, ausgeführt zu
werden. Die Prozesse, die von
init für jeden dieser Runlevel
erzeugt werden, sind in der Datei
/etc/inittab definiert.
Init
kann in einem von acht Runleveln sein:
0-6 und
S (auch
s).
Init wechselt den Runlevel, wenn ein privilegierter Benutzer
das Programm
/sbin/telinit startet, das
init passende Signale
sendet, die ihm mitteilen, in welchen Runlevel es wechseln soll.
Die Runlevel
S,
0,
1 und
6 sind reserviert. Der
Runlevel S wird benutzt, um das System beim Start zu initialisieren. Wenn
Runlevel S (beim Start) oder Runlevel 1 (umschalten von einem
Mehrbenutzer-Runlevel) gestartet wird, wechselt das System in den
»Einzelbenutzermodus«, nach dem der aktuelle Runlevel S ist.
Runlevel 0 wird benutzt, um das System zu stoppen, Runlevel 6 startet das
System neu.
Nach dem Starten durch S tritt das System automatisch in die
Mehrbenutzer-Runlevel 2 bis 5 ein, falls es dort kein Problem gibt, das vom
Administrator im Einzelbenutzermodus behoben werden muss. Normalerweise
führt der Administrator nach Eintreten in den Einzelbenutzermodus
Wartungsarbeiten durch und startet dann das System neu.
Lesen Sie die Handbuchseiten von
shutdown(8) und
inittab(5), um
weitere Informationen zu erhalten.
Die Runlevel 7-9 sind ebenfalls gültig, wenngleich nicht wirklich
dokumentiert. Dies ist deshalb so, weil »traditionelle«
Unix-Varianten sie nicht benutzen.
Die Runlevel
S und
s sind identisch. Intern sind sie Aliase
für den gleichen Runlevel.
Nachdem
init im letzten Schritt des Startprozesses aufgerufen wird, sucht
es nach der Datei
/etc/inittab und sieht nach, ob es dort einen
initdefault-Eintrag gibt (siehe
inittab(5)). Der Eintrag
initdefault bestimmt den Anfangs-
Runlevel des Systems. Falls es
dort keinen derartigen Eintrag gibt (oder gar keine Datei
/etc/inittab
existiert), muss der
Runlevel in der Systemkonsole eingegeben werden.
Die Runlevel
S oder
s initialisieren das System und
benötigen keine
/etc/inittab-Datei.
Im Einzelbenutzermodus wird
/sbin/sulogin auf
/dev/console
aufgerufen.
Beim Eintritt in den Einzelbenutzermodus initialisiert
init die
stty-Einstellungen der Konsolen auf vernünftige Werte. Der
»Clocal«-Modus wird gesetzt. Hardware-Geschwindigkeit und
Datenflusssteuerung werden nicht geändert.
Beim ersten Eintritt in den Mehrbenutzermodus führt
init die
boot- und
bootwait-Einträge aus, um das Einhängen
von Dateisystemen zu erlauben, bevor Anwender sich anmelden können.
Dann werden alle Einträge, die zum Runlevel passen, verarbeitet.
Wenn ein neuer Prozess gestartet wird, prüft
init zuerst, ob die
Datei
/etc/initscript existiert. Ist dies der Fall, benutzt es dieses
Skript, um den Prozess zu starten.
Jedesmal, wenn ein Kindprozess endet, zeichnet
init diesen Umstand und
den Grund der Beendigung in
/var/run/utmp und
/var/log/wtmp auf,
sofern diese Dateien existieren.
Nachdem alle vorgesehenen Prozesse erzeugt worden sind, wartet
init
darauf, dass ein untergeordneter Prozess endet, ein Stromausfallsignal oder
darauf, dass
telinit einen Wechsel des Runlevels signalisiert. Wenn
eine der drei oben genannten Bedingungen erfüllt ist, untersucht
init nochmals die
/etc/inittab-Datei. Es können jederzeit
neue Einträge zu dieser Datei hinzugefügt werden. Jedoch wartet
init immer noch darauf, dass einer der drei oben genannten Bedingungen
eintritt. Um eine sofortige Antwort bereitzustellen, können die Befehle
telinit Q oder
q init aufwecken, um die Datei
/etc/inittab erneut zu prüfen (neu zu laden).
Falls
init sich nicht im Einzelbenutzermodus befindet, und ein
Stromausfallsignal (SIGPWR) empfängt, liest es die Datei
/etc/powerstatus. Anschließend wird ein Befehl anhand des
Inhalts der Datei gestartet:
- F(EHLSCHLAG)
- Strom fällt aus, die USV versorgt den Rechner mit
Strom. Die powerwait- und powerfail-Einträge werden
ausgeführt.
- O(K)
- Stromkreis wurde wieder geschlossen, die
powerokwait-Einträge werden ausgeführt.
- L(OW/niedrig)
- Strom fällt aus und der Ladestand der USV ist
niedrig. Die powerfailnow-Einträge werden
ausgeführt.
Wenn
/etc/powerstatus nicht existiert oder etwas anderes enthält
als die Buchstaben
F,
O oder
L, wird
init sich so
verhalten, als hätte es den Buchstaben
F gelesen.
Die Verwendung von
SIGPWR und
/etc/powerstatus werden nicht
empfohlen. Wenn etwas mit
init interagieren möchte, sollte der
Steuerkanal
/run/initctl verwendet werden - lesen Sie die Handbuchseite
von
initctl(5), um weitere Dokumentation darüber zu erhalten.
Falls
init die Aufforderung zum Wechsel des Runlevels erhält,
sendet es das Warnsignal
SIGTERM an alle nicht im neuen Runlevel
definierten Prozesse. Dann wartet es drei Sekunden bevor es diese Prozesse
gewaltsam per Signal
SIGKILL beendet. Beachten Sie, dass
init
davon ausgeht, dass diese Prozesse (und ihre Unterprozesse) in der gleichen
Prozessgruppe verbleiben, die
init ursprünglich für sie
erstellt hatte. Wenn Prozesse ihre Gruppenzugehörigkeit andern, werden
Sie diese Signale nicht empfangen. Solche Prozesse müssen separat
beendet werden.
/sbin/telinit ist mit
/sbin/init verknüpft. Es
empfängt Argumente aus einem Buchstaben oder
init-Signale, um
die zugehörige Aktion durchzuführen. Die folgenden Argumente
dienen als Anweisungen für
telinit:
-
0, 1, 2, 3, 4, 5
oder 6
-
init mitteilen, in den angegebenen Runlevel zu
schalten.
-
a, b, c
- tell init to process only those /etc/inittab
file entries having runlevel a, b or c.
-
Q oder q
-
init mitteilen, die Datei /etc/inittab erneut
zu prüfen.
-
S oder s
-
init mitteilen, in den Einzelbenutzermodus zu
wechseln.
-
U oder u
-
init mitteilen, sich selbst erneut (unter
Beibehalten des Status) auszuführen. Es kommt zu keiner erneuten
Ausführung der Datei /etc/inittab. Der Runlevel sollte einer
aus Ss0123456 sein, anderenfalls wird die Anfrage stillschweigend
ignoriert.
telinit kann dem
init-Prozess mitteilen, wie viel Zeit dieser
zwischen dem Senden der Signale
SIGTERM und
SIGKILL warten soll.
Die Vorgabe ist drei Sekunden, dies kann aber durch die Option
-t
geändert werden.
telinit -e weist
init an, die Umgebung für Prozesse zu
ändern, die es erzeugt. Das Argument von
-e ist entweder in der
Form
VAR=
WERT, was die Variable
VAR auf den Wert
WERT setzt oder in der Form
VAR (ohne Gleichheitszeichen), was
die Variable
VAR leert.
init kann nur von Benutzern mit geeigneten Rechten aufgerufen werden.
Das Programm
init prüft durch Auswerten der Prozesskennung, ob es
init oder
telinit ist. Der echte Prozess von
init ist
immer
1. Daraus folgt, dass jemand anstelle des Aufrufs
telinit
auch nur
init als Abkürzung benutzen kann.
Init setzt folgende Umgebungsvariablen für alle seine
Kindprozesse:
- PATH
- /bin:/usr/bin:/sbin:/usr/sbin
- INIT_VERSION
- Wie der Name schon sagt. Nützlich, um festzustellen,
ob ein Skript direkt von init ausgeführt wird.
- RUNLEVEL
- Der aktuelle Runlevel des Systems.
- PREVLEVEL
- Der vorherige Runlevel (nützlich nach einer
Änderung des Runlevels).
- CONSOLE
- Die Systemkonsole. Diese wird tatsächlich vom Kernel
vererbt; wenn sie jedoch nicht gesetzt ist, wird init sie als
Vorgabe auf /dev/console setzen.
Es ist möglich,
init eine Reihe von Bootschaltern vom Bootmonitor
aus (z.B. LILO oder GRUB) zu übergeben.
init akzeptiert folgende
Schalter:
- -s, S, single
- Bootet im Einzelbenutzermodus. In diesem Modus wird zuerst
die Datei /etc/inittab untersucht und die
»rc«-Startskripte werden ausgeführt, bevor die
Einzelbenutzer-Shell gestartet wird.
- 1-5
- Runlevel, in den gestartet wird.
-
-b, emergency
- Startet direkt in eine Einzelbenutzer-Shell, ohne
irgendwelche anderen Startskripte auszuführen.
-
-a, auto
- Der LILO-Bootloader fügt das Wort
»auto« zur Befehlszeile hinzu, wenn der Kernel mit der
Standard-Befehlszeile (ohne Eingriff des Anwenders) gestartet wird. Falls
dies gefunden wird, setzt init die Umgebungsvariable
»AUTOBOOT« auf »yes«. Beachten Sie, dass Sie
die nicht für irgendwelche Sicherheitsmaßnahmen verwenden
können - selbstverständlich kann der Anwender
»auto« oder -a manuell auf der Befehlszeile
angeben.
-
-z xxx
- Das Argument zu -z wird ignoriert. Sie können
es benutzen, um die Befehlszeile etwas zu verlängern, damit sie
etwas mehr Platz auf dem Stack reserviert. init kann dann die
Befehlszeile derart verändern, dass ps(1) den aktuellen
Runlevel anzeigt.
- --version
- Wenn dieses Argument alleine verwendet wird, zeigt es die
aktuelle Version von init auf der Konsole/Standardausgabe an. Dies
ist eine schnelle Methode, herauszufinden, welche init-Software und
Version verwendet wird. Nachdem die Versionsinformation angezeigt wurde,
beendet sich init sofort mit einem Rückgabewert von
Null.
init lauscht auf einem
fifo in /dev,
/run/initctl, auf
Nachrichten.
telinit benutzt diesen, um mit
init zu
kommunizieren. Die Schnittstelle ist noch nicht sehr ausführlich
dokumentiert oder fertiggestellt. Wer interessiert ist, sollte die Datei
initreq.h im Unterverzeichnis des
init-Quellcode-Tar-Archives
studieren.
Init reagiert auf mehrere Signale:
- SIGHUP
- Hat die gleichen Auswirkungen wie telinit q.
- SIGUSR1
- Beim Empfang dieses Signals schließt init
seinen Steuerungs-Fifo /run/initctl und öffnet ihn wieder.
Nützlich für Systemstartskripte, wenn /dev neu
eingehängt wird.
- SIGUSR2
- Wenn init SIGUSR2 empfängt,
schließt init sich und läßt das Steuer-FIFO
/run/initctl geschlossen. Damit können Sie sicherstellen,
dass init keine Dateien offen hält. Allerdings hindert es
init auch daran, die Runlevel zu ändern. Das bedeutet, dass
Befehle wie shutdown(8) nicht mehr funktionieren. Der FIFO kann
durch Senden des Signals SIGUSR1 an init wieder
geöffnet werden.
- SIGINT
- Normalerweise sendet der Kernel dieses Signal an
init, wenn CTRL-ALT-DEL gedrückt wurde. Es aktiviert die
Aktion ctrlaltdel.
- SIGWINCH
- Der Kernel sendet dieses Signal, falls die
KeyboardSignal-Taste gedrückt wurde. Es aktiviert die
kbdrequest-Aktion.
init ist kompatibel zu System-V-Init. Es arbeitet eng mit den Skripten in
den Verzeichnissen
/etc/init.d und
/etc/rc{runlevel}.d
zusammen.Falls Ihr System diesem Grundsatz folgt, sollte sich in diesem
Verzeichnis eine
README-Datei befinden, die erklärt wie diese
Skripte funktionieren.
/etc/inittab
/etc/initscript
/dev/console
/var/run/utmp
/var/log/wtmp
/run/initctl
init geht davon aus, dass alle Prozesse und Kindprozesse in der selben
Prozessgruppe verbleiben, die ursprünglich für sie eingerichtet
wurde. Falls einer dieser Prozesse die Gruppe wechselt, kann
init ihn
nicht mehr beenden und es kann passieren, dass Sie in einem Zustand landen, in
dem zwei Prozesse von einer Terminalzeile Befehle einlesen wollen.
Auf einem Debian-System veranlasst das Eintreten in Runlevel 1, dass alle
Prozesse mit Ausnahme von Kernel-Threads und dem Skript, das das Beenden
erledigt und andere Prozesse in deren Sitzung, beendet werden. Als Konsequenz
davon ist es nicht sicher, von von Runlevel 1 zu einem Mehrbenutzer-Runlevel
zurückzukehren: Daemons, die in Runlevel S gestartet wurden und
für normale Operationen benötigt werden, laufen nicht
länger. Das System sollte neu gestartet werden.
Wenn
init herausfindet, dass es kontinuierlich einen Eintrag öfter
als zehn mal in zwei Minuten neu erzeugt, wird es annehmen, dass ein Fehler in
der Befehlszeile vorliegt, eine Fehlermeldung auf der Befehlszeile erzeugen
und sich weigern, den Eintrag auszuführen, bis fünf Minuten
vergangen sind oder es ein Signal empfängt. Dieses verhindert, dass
Systemressourcen verschwendet werden, wenn jemandem ein Tippfehler in
/etc/inittab unterläuft oder das zum Eintrag gehörende
Programm gelöscht wird.
Miquel van
Smoorenburg , ursprüngliche Handbuchseite von
Michael
Haardt
getty(1),
login(1),
sh(1),
runlevel(8),
shutdown(8),
kill(1),
initctl(5),
inittab(5),
initscript(5),
utmp(5)