Drin ist das übergeordnete Element aller Linux-Prozesse. Es ist der erste Prozess, der gestartet wird, wenn ein Computer hochfährt, und er wird ausgeführt, bis das System heruntergefahren wird. Es ist der Vorfahr aller anderen Prozesse.
Seine Hauptaufgabe besteht darin, Prozesse aus einem Skript zu erstellen, das in der Datei / etc / inittab gespeichert ist. In dieser Datei werden normalerweise Einträge gespeichert, die dazu führen, dass Init in jeder Zeile, in die sich Benutzer einloggen können, Gettys erzeugt. Außerdem steuert sie die für ein bestimmtes System erforderlichen autonomen Prozesse.
Runlevels
EIN Runlevel ist eine Softwarekonfiguration des Systems, bei der nur eine ausgewählte Gruppe von Prozessen ausgeführt werden kann. Die von Init für jedes dieser Runlevels erzeugten Prozesse sind in der Datei / etc / inittab definiert. Init kann in einem von acht Runlevels stehen: 0 bis 6 und S oder s. Der Runlevel wird geändert, indem ein privilegierter Benutzer Telinit ausführt, der entsprechende Signale an Init sendet und ihm mitteilt, in welchen Runlevel er wechseln soll.
Runlevel 0, 1 und 6 sind reserviert. Runlevel 0 wird zum Stoppen des Systems verwendet, Runlevel 6 zum Neustarten des Systems und Runlevel 1, um das System in den Einzelbenutzermodus zu bringen. Runlevel S soll nicht direkt verwendet werden, sondern von den Scripts, die bei der Eingabe von Runlevel 1 ausgeführt werden.
Runlevels 7 bis 9 sind ebenfalls gültig, jedoch nicht gut dokumentiert, da "traditionelle" Unix-Varianten sie nicht verwenden. Runlevel S und s sind gleich. Intern sind sie Aliase für den gleichen Runlevel.
Booten
Nachdem Init als letzter Schritt der Kernel-Startsequenz aufgerufen wurde, sucht es nach der Datei / etc / inittab, um zu sehen, ob ein Eintrag des Typs vorhanden ist initdefault . Der Eintrag initdefault bestimmt den anfänglichen Runlevel des Systems. Wenn kein solcher Eintrag vorhanden ist (oder überhaupt keine / etc / inittab), muss an der Systemkonsole ein Runlevel eingegeben werden.
Runlevel S oder s bringt das System in den Einzelbenutzermodus und erfordert keine Datei / etc / inittab. Im Einzelbenutzermodus wird eine Root-Shell in / dev / console geöffnet.
Beim Einstieg in den Einzelbenutzermodus liest init die Ioctl-Status der Konsole aus /etc/ioctl.save. Wenn diese Datei nicht vorhanden ist, initialisiert init die Zeile mit 9600 Baud und mit CLOCAL-Einstellungen. Wenn init den Einzelbenutzermodus verlässt, speichert es die Ioctl-Einstellungen der Konsole in dieser Datei, um sie für die nächste Einzelbenutzersitzung wiederverwenden zu können.
Wenn Sie zum ersten Mal in einen Mehrbenutzermodus wechseln, führt Init die Boot- und Bootwait-Einträge aus, damit Dateisysteme eingehängt werden können, bevor sich Benutzer anmelden können. Anschließend werden alle mit dem Runlevel übereinstimmenden Einträge verarbeitet.
Beim Start eines neuen Prozesses prüft Init zunächst, ob die Datei / etc / initscript vorhanden ist. Wenn ja, verwendet es dieses Skript, um den Prozess zu starten.
Jedes Mal, wenn ein Kind beendet wird, zeichnet Init die Tatsache und den Grund für den Tod in / var / run / utmp und / var / log / wtmp auf, sofern diese Dateien vorhanden sind.
Runlevels ändern
Nachdem alle angegebenen Prozesse gestartet wurden, wartet Init, bis einer seiner abgeleiteten Prozesse stirbt, ein Powerfail-Signal, oder bis Telinit signalisiert, dass der Runlevel des Systems geändert wird. Wenn eine dieser drei Bedingungen eintritt, wird die Datei / etc / inittab erneut geprüft. Zu dieser Datei können jederzeit neue Einträge hinzugefügt werden. Init wartet jedoch immer noch auf eine der drei oben genannten Bedingungen. Um eine sofortige Reaktion zu gewährleisten, kann der Befehl Telinit Q oder q Init aktivieren, um die Datei / etc / inittab erneut zu untersuchen.
Wenn sich Init nicht im Einzelbenutzermodus befindet und ein Powerfail-Signal (SIGPWR) empfängt, liest es die Datei / etc / powerstatus. Es startet dann einen Befehl basierend auf dem Inhalt dieser Datei:
- SCHEITERN): Stromausfall, USV liefert Strom. Führen Sie die Powerwait- und Powerfail-Einträge aus.
- OK): Die Stromversorgung wurde wiederhergestellt, führen Sie die Powerokwait-Einträge aus.
- NIEDRIG): Die Stromversorgung fällt aus, und die USV ist schwach. Führen Sie die Powerfailnow-Einträge aus.
Wenn / etc / powerstatus nicht existiert oder etwas anderes als die Buchstaben F, O oder L enthält, verhält sich Init so, als würde er den Buchstaben F lesen.
Von der Verwendung von SIGPWR und / etc / powerstatus wird abgeraten. Jeder, der mit Init interagieren möchte, sollte den Steuerkanal / dev / initctl verwenden.
Wenn Init aufgefordert wird, den Runlevel zu ändern, sendet es das Warnsignal SIGTERM an alle Prozesse, die im neuen Runlevel nicht definiert sind. Es wartet dann fünf Sekunden, bevor diese Prozesse mit dem Signal SIGKILL erzwungen werden. Beachten Sie, dass Init davon ausgeht, dass alle diese Prozesse und ihre Nachkommen in derselben Prozessgruppe verbleiben, die Init ursprünglich für sie erstellt hat. Wenn ein Prozess seine Zugehörigkeit zu einer Prozessgruppe ändert, empfängt er diese Signale nicht. Solche Prozesse müssen separat beendet werden.
Telinit
Telinit ist mit / sbin / init verbunden. Es erfordert ein Ein-Zeichen-Argument und signalisiert Init, dass die entsprechende Aktion ausgeführt wird. Die folgenden Argumente dienen als Richtlinie für Telinit:
- 0, 1, 2, 3, 4, 5 oder 6: Sagen Sie Init, dass Sie zur angegebenen Run-Ebene wechseln möchten.
- a, b, c: Sagen Sie Init, dass nur die Einträge in der Datei / etc / inittab mit Runlevel a, b oder c verarbeitet werden.
- Q oder q: Fordern Sie Init auf, die Datei / etc / inittab erneut zu untersuchen.
- S oder s: Sagen Sie Init, in den Einzelbenutzermodus zu wechseln.
- U oder u: Weist init an, sich erneut auszuführen (den Zustand erhalten). Es erfolgt keine erneute Überprüfung der Datei / etc / inittab. Der Runlevel sollte S, s, 1, 2, 3, 4 oder 5 sein. Andernfalls wird die Anforderung ignoriert.
Telinit kann Init auch mitteilen, wie lange es dauert, bis die SIGTERM- und SIGKILL-Signale gesendet werden. Der Standardwert ist fünf Sekunden, dieser Wert kann jedoch mit geändert werden -t sek Möglichkeit.
Telinit kann nur von Benutzern mit entsprechenden Berechtigungen aufgerufen werden.
Die Init-Binärdatei prüft, ob es Init oder Telinit ist, indem sie ihre Prozess-ID überprüft. Die Prozess-ID des realen Init ist immer 1. Daraus folgt, dass eine Person Init anstelle von Telinit verwenden kann, um sie als Abkürzung zu verwenden.