Provided by:
manpages-de_0.4-9_all 
BEZEICHNUNG
init, telinit - Initialisierung der Kontrolle über Prozesse und
Runlevel
SYNTAX
/sbin/init [-t sec] [0123456SsQq]
/sbin/telinit [-t sec] [0123456SsQq]
BESCHREIBUNG
init
Init ist der Vater aller Prozesse. Seine Hauptaufgabe besteht darin,
Prozesse nach einem Skript in der Datei /etc/inittab zu erzeugen (siehe
auch inittab(5)). Diese Datei hat normalerweise bestimmte Einträge,
die init dazu veranlassen auf jeder Leitung gettys zu erzeugen, auf der
sich ein Benutzer einloggen kann. Er kontrolliert auch alle autonomen
Prozesse, die von einem bestimmten System benötigt werden.
RUNLEVEL
Ein Runlevel ist ein Softwarezustand des Systems, der es nur einer
bestimmten 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 sich in einem von acht
Runlevel befinden, 0-6 und S oder s. Init wechselt den Runlevel, wenn
ein priviligierter Benutzer das Programm /sbin/telinit startet, das
init bestimmte Signale sendet, die ihm sagen, in welchen Runleveles
wechseln soll.
Die Runlevel 0, 1 und 6 sind reserviert. Der Runlevel 0 wird dazu
verwendet, das System anzuhalten, der Runlevel 6 iwr dafür benutzt, das
System neuzusatarten, und der Runlevel 1 wird dafür verwendet, das
System in den Single-User-Modus herunterzufahren. Der Runlevel S wird
normalerweise nicht direkt angesprungen, sondern dient nur als
Zwischenstufe für die Skripte, die ausgeführt werden, wenn in den
Runlevel 1 übergegangen wird. Weitere Informationen darüber finden Sie
in den Handbuchseiten zu shutdown(8) und inittab(5).
Die Runlevel 7-9 sind ebenfalls gültig, jedoch nicht wirklich
dokumentiert. Das liegt daran, daß die "traditionellen"
UNIX-Varianten diese nicht benutzen. Manche werden sich vielleicht
auch wundern, daß es zwischen den Runlevel S und s keinen ersichtlichen
Unterschied gibt. Tatsächlich sind beide Optionen lediglich ein Alias
für ein und den selben Runlevel.
SYSTEMSTART
Wenn init im letzten Schritt des Bootprozesses aufgerufen wird, sucht
er nach der Datei /etc/inittab und sieht nach, ob es dort einen
initdefault-Eintrag gibt (siehe inittab(5)). initdefault bestimmt den
Anfangs-runlevel des Systems. Falls es dort keine derartige Eintragung
gibt, oder gar keine inittab-Datei existiert, so muß an der
Systemkonsole der runlevel eingegeben werden.
Die runlevel S oder s bringen das System in den Single-user Modus, und
benötigen keine /etc/inittab-Datei. Im Single-user-Modus wird auf
/dev/console /sbin/sulogin aufgerufen.
Wenn das System in den Single-user Modus übergeht, liest init die
ioctl(2)-Zustände der Konsole in /etc/ioctl.save. Existiert diese
Datei nicht, dann initialisiert init die Leitung mit 9600 BAUD und mit
CLOCAL-Einstellungen. Wenn init den Single-User-Modus verläßt,
schreibt es die ioctl-Einstellungen in diese Datei, so daß diese
Einträge bei der nächsten Single-User-Sitzung wiederverwendet werden
können.
Wenn init das erste mal in einen Multi-User-Modus eintritt, führt er
die boot- und bootwait-Einträge der Datei /etc/inittab aus, die es
erlauben, daß die Dateisysteme gemountet werden können, bevor sich ein
Benutzer einloggen kann. Danach werden alle die runlevel betreffenden
Einträge ausgeführt.
Immer wenn init einen neuen Prozeß startet, schaut das Programm erst
nach, ob die Datei /etc/initscript existiert. Wenn es sie gibt,
benutzt init das Skript dieser Datei um den Prozeß zu starten.
Jedesmal, wenn ein Kindprozeß terminiert, hält init diese Tatsache und
den Grund, weshalb der Kindprozeß gestorben ist, in den Dateien
/var/run/utmp und /var/log/wtmp fest, falls diese Dateien existieren.
RUNLEVEL-ÄNDERUNGEN
Sobald alle vorgesehenen Prozesse erzeugt worden sind, wartet init
darauf, daß ein Kindprozeß stirbt, auf ein Stromausfallsignal oder auf
eine Anweisung von /sbin/telinit, in welchen runlevel er wechseln soll.
Wenn eine der drei oben genannten Bedingungen erfüllt ist, untersucht
init nochmals die /etc/inittab-Datei, da dieser Datei jederzeit neue
Einträge hinzugefügt werden können. Man kann den schlafenden
init-Prozeß auch mit den Kommandos Q oder q aufwecken, was ihn dazu
veranlaßt, nochmals die /etc/inittab-Datei zu examinieren.
Wenn init sich nicht im Single-User Modus 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(AIL) Strom fällt aus, die USV versorgt den Rechner mit Strom. Die
powerwait- und powerfail-Einträge werden ausgeführt.
O(K) Strom wurde wiederhergestellt, es werden die
powerokwait-Einträge ausgeführt.
L(OW) Strom wird knapp und die USV geht auf dem Zahnfleisch. 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 Kontrollkanal
/dev/initctl verwendet werden - siehe Quellcode des sysvinit-Pakets für
mehr Dokumentation darüber.
Wenn init angewiesen wird den runlevel zu wechseln, wird das Warnsignal
SIGTERM an alle Prozesse geschickt, die nicht in der Datei /etc/inittab
für den neuen runlevel vorgesehen sind. Init wartet dann 5 Sekunden
bevor er diese Prozesse mit dem kill-Signal SIGKILL gewaltsam
terminiert. Achtung: init nimmt an, daß alle diese Prozesse (und deren
Nachfahren) in derselben Prozeßgruppe verblieben sind, die init
ursprünglich für sie erzeugt hat (siehe setpgrp(2)). Wenn irgendeiner
dieser Prozesse seine Prozeßguppenzugehörigkeit geändert hat, wird er
diese Signale nicht erhalten! Solche Prozesse müssen einzeln
terminiert werden!
TELINIT
Das Programm /sbin/telinit ist auf /sbin/init gelinkt. Er wird mit
Argumenten, die aus nur einem Buchstaben bestehen gesteuert, und sendet
init Anweisungen (Signale), welche Aktionen dieses auszuführen hat.
Die folgenden Argumente dienen als Anweisungen für telinit:
0,1,2,3,4,5 oder 6
befehlen init in den angegebenen runlevel zu wechseln.
a , b , c
befehlen /sbin/init nur die Einträge der Datei /etc/inittab
auszuführen, die den Runlevel a, b oder c haben.
Q oder q
befehlen /sbin/telinit nocheinmal die Datei /etc/inittab
einzulesen.
S oder s
befehlen /sbin/telinit in den Single-User-Modus zu schalten.
/sbin/telinit kann den init-Prozeß auch anweisen, wieviel Zeit dieser
zwischen dem Senden des TERM und des KILL Signals warten soll; die
Standardeinstellung ist 5 Sekunden, kann jedoch durch die Option -t sec
verändert werden.
/sbin/telinit kann nur von Benutzern mit einer entsprechenden
Berechtigung aufgerufen werden.
Das init-Programm überprüft, ob es als init oder telinit gestartet
wurde, indem es auf seine Prozeß-ID schaut; die reelle Prozeß-ID von
init ist immer 1. Von daher darf man einfach auch init anstelle von
telinit verwenden oder eines Aliases.
UMGEBUNG
Init setzt folgende Umgebungsvariablen für alle seine Kindprozesse:
PATH Wird standarmäßig auf
/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin gesetzt.
INIT_VERSION
Wie der Name schon sagt. Nützlich, wenn ein Skript direkt von
init ausgeführt werden soll.
RUNLEVEL
Der augenblickliche Runlevel des Systems.
PREVLEVEL
Der vorherige Runlevel (nützlich nach einer Änderung des
Runlevels).
CONSOLE
Die System-KOnsole. Diese wird tatsächlich vom Kernel vererbt;
wenn sie jedoch nicht gesetzt ist, wird init sie auf
/dev/console setzen als Voreinstellung.
BOOTSIGNALE
Es ist möglich init eine Reihe von Bootsignalen (bootflags) vom
Bootmonitor aus (d.h. vom LILO aus) zu übergeben. Init akzeptiert
folgende Signale:
-s, S, single
Bootet im Single-user Modus. In diesem Modus wird zuerst die
Datei /etc/inittab eingelesen; danach werden, noch bevor die
Single-User-Shell gestartet wird, die Bootskripte der Datei
/sbin/init.d/boot ausgeführt.
1,2,3,4 oder 5
Weist init an, in welchen Runlevel gebootet werden soll.
-b, emergency
Gibt init die Anweisung direkt in den Single-User-Modus zu
booten, ohne irgendwelche Startup-Skripte auszuführen.
-a, auto
Der LILO-Bootloader fügt das Wort an den Kernel. init ist in
der Lage, es zu lesen.
-z xxx Das Argument zu -z wird irgnoriert. Sie können es benutzen, um
die Komandozeile etwas zu verlängern, damit sie etwas mehr Platz
auf dem Stack reserviert. Init kann anschließend die
Komandozeile derart modifizieren, daß ps(1) den aktuellen
Runlevel anzeigt.
SCHNITTSTELLE
Init lauscht auf einem Fifo in /dev, /dev/initctl, auf Nachrichten.
Telinit benutzt diesen, um mit init zu kommunizieren. Die Schnittstelle
ist noch nicht sehr ausführlich dokumentiert. Wer interessiert ist,
möge die Datei initreq.h im Quellcode von init studieren.
SIGNALE
Init reagiert auf verschiedene Signale:
SIGHUP
Init sucht nach /etc/initrunlvl und /var/log/initrunlvl. Wenn
eine dieser Dateien existiert und einen ASCII-Runlevel enthält,
wechselt init in den neuen Runlevel. Dieses existiert nur für
Abwärtskompatibilität! In normalen Fällen (wenn die Dateien nicht
existieren) verhält sich init, als wenn telinit q ausgeführt
wurde.
SIGUSR1
Beim Emfang dieses Signals schließt init sein Kontroll-Fifo
/dev/initctl und öffnet ihn wieder. Das ist sinnvoll für Boot-
Skripte, wenn /dev neu gemountet wird.
SIGINT
Normalerweise sendet der Kernel dieses Signal an init, wenn CTRL-
ALT-DEL gedrückt wurde. Es aktiviert die ctrlaltdel-Aktion.
SIGWINCH
Der Kernel sendet dieses Signal, wenn die KeyboardSignal-Taste
gedrückt wurde. Es aktiviert die kbdrequest-Aktion.
KONFORM ZU
Init ist kompatibel zum System V init. Er arbeitet eng mit den
Skripten zusammen, die in den Verzeichnissen /sbin/init.d und
/sbin/init.d/rc{runlevel 1-6}.d untergebracht sind. Wenn das System
dieser Konvention folgt, sollte sich in diesem Verzeichniss eine README
-Datei befinden, die erklärt wie diese Skripte funktionieren.
DATEIEN
/etc/inittab
/etc/initscript
/dev/console
/etc/ioctl.save
/var/run/utmp
/var/log/wtmp
/dev/initctl
WARNUNGEN
Init geht davon aus, daß alle Prozesse und Kindprozesse in der selben
Prozessgruppe verbleiben, die ursprünglich für sie eingerichtet worden
ist. Wenn einer dieser Prozesse in eine andere Gruppe wechselt, kann
init ihn nicht mehr beenden, und es kann passieren, daß man in einem
Zustand landet, in dem zwei Prozesse von einer Terminalleitung Befehle
einlesen wollen.
DIAGNOSE
Wenn init herausfindet, daß es kontinuierlich einen Eintrag öfter als
10 mal in 2 Minuten neu erzeugt, wird es annehmen, daß ein Fehler in
der Befehlszeile vorliegt, einen Fehler erzeugen, Meldungen auf die
Systemkonsole erstatten und sich weigern, den Eintrag auszuführen, bis
5 Minuten vergangen sind oder es ein Signal empfängt. Dieses
verhindert, daß Systemresourcen verschwendet werden, wenn jemand einen
Tippfehler in /etc/inittab einbaut oder das zum Eintrag gehörende
Programm löscht.
AUTOR
Miquel van Smoorenburg <miquels@cistron.nl>, ursprüngliche Manpage von
Michael Haardt <u31b3hs@pool.informatik.rwth-aachen.de>, Übersetzung
Martin Okrslar <okrslar@informatik.uni-muenchen.de> und Überarbeitung
von Martin Schulze <joey@infodrom.north.de>.
SIEHE AUCH
getty(1), login(1), sh(1), who(1), shutdown(1), kill(2), inittab(5),
inscript(5), utmp(5).
11 February 2000 INIT(8)