F.2.4. Das Programm /sbin/init

Das Programm /sbin/init (auch init genannt) koordiniert den verbleibenden Boot-Prozess und konfiguriert die Benutzerumgebung.
Wenn init gestartet wird, wird es automatisch zum übergeordneten Prozess auf erster Ebene (“parent process”) oder zum übergeordneten Prozess auf zweiter Ebene (“grandparent process”) aller zukünftigen, auf dem System automatisch gestarteten Prozesse. Zuerst führt es das /etc/rc.d/rc.sysinit-Skript aus, das den Umgebungspfad einstellt, Swapping startet, die Dateisysteme überprüft und andere Schritte der Systeminitialisierung übernimmt. Die meisten Systeme verwenden beispielsweise eine Uhr, wobei rc.sysinit die Konfigurationsdatei /etc/sysconfig/clock liest, um die Hardware-Uhr zu initialisieren. Falls Sie beispielsweise auch über spezielle, serielle Port-Prozesse verfügen, die ebenfalls initialisiert werden müssen, führt rc.sysinit die Datei /etc/rc.serial aus.
Der init-Befehl führt anschließend die Jobs im /etc/event.d-Verzeichnis aus, welches beschreibt, wie das System in jedem einzelnen SysV Init Runlevel eingerichtet werden sollte. Runlevels sind ein Zustand, oder Modus, der durch die im SysV /etc/rc.d/rc<x>.d/-Verzeichnis enthaltenen Dienste definiert wird, wobei <x> die Nummer des Runlevels ist. Für weitere Informationen zu SysV Init Runlevels siehe Abschnitt F.4, »SysV Init Runlevels«.
Danach legt init die Quellfunktionsbibliothek /etc/rc.d/init.d/functions für das System fest. In der Datei wird festgelegt, wie Programme zu starten oder zu beenden sind und wie die PID eines Programms bestimmt werden kann.
Danach startet init alle Hintergrundprozesse, indem es im entsprechenden rc-Verzeichnis nach den Runlevels sucht, die in /etc/inittab als Standard festgelegt sind. Die rc-Verzeichnisse sind gemäß der Runlevels nummeriert, denen sie entsprechen. So ist zum Beispiel /etc/rc.d/rc5.d/ das Verzeichnis für Runlevel 5.
Das Programm init sucht beim Starten in Runlevel 5 im Verzeichnis /etc/rc.d/rc5.d/, um die Prozesse zu ermitteln, die gestartet und beendet werden müssen.
Nachfolgend ein Beispiel-Listing für das Verzeichnis/etc/rc.d/rc5.d/:
K05innd -> ../init.d/innd 
K05saslauthd -> ../init.d/saslauthd 
K10dc_server -> ../init.d/dc_server 
K10psacct -> ../init.d/psacct 
K10radiusd -> ../init.d/radiusd 
K12dc_client -> ../init.d/dc_client 
K12FreeWnn -> ../init.d/FreeWnn 
K12mailman -> ../init.d/mailman 
K12mysqld -> ../init.d/mysqld 
K15httpd -> ../init.d/httpd 
K20netdump-server -> ../init.d/netdump-server 
K20rstatd -> ../init.d/rstatd 
K20rusersd -> ../init.d/rusersd 
K20rwhod -> ../init.d/rwhod 
K24irda -> ../init.d/irda 
K25squid -> ../init.d/squid 
K28amd -> ../init.d/amd 
K30spamassassin -> ../init.d/spamassassin 
K34dhcrelay -> ../init.d/dhcrelay 
K34yppasswdd -> ../init.d/yppasswdd 
K35dhcpd -> ../init.d/dhcpd 
K35smb -> ../init.d/smb 
K35vncserver -> ../init.d/vncserver 
K36lisa -> ../init.d/lisa 
K45arpwatch -> ../init.d/arpwatch 
K45named -> ../init.d/named 
K46radvd -> ../init.d/radvd 
K50netdump -> ../init.d/netdump 
K50snmpd -> ../init.d/snmpd 
K50snmptrapd -> ../init.d/snmptrapd 
K50tux -> ../init.d/tux 
K50vsftpd -> ../init.d/vsftpd 
K54dovecot -> ../init.d/dovecot 
K61ldap -> ../init.d/ldap 
K65kadmin -> ../init.d/kadmin 
K65kprop -> ../init.d/kprop 
K65krb524 -> ../init.d/krb524 
K65krb5kdc -> ../init.d/krb5kdc 
K70aep1000 -> ../init.d/aep1000 
K70bcm5820 -> ../init.d/bcm5820 
K74ypserv -> ../init.d/ypserv 
K74ypxfrd -> ../init.d/ypxfrd 
K85mdmpd -> ../init.d/mdmpd 
K89netplugd -> ../init.d/netplugd 
K99microcode_ctl -> ../init.d/microcode_ctl 
S04readahead_early -> ../init.d/readahead_early 
S05kudzu -> ../init.d/kudzu 
S06cpuspeed -> ../init.d/cpuspeed 
S08ip6tables -> ../init.d/ip6tables 
S08iptables -> ../init.d/iptables 
S09isdn -> ../init.d/isdn 
S10network -> ../init.d/network 
S12syslog -> ../init.d/syslog 
S13irqbalance -> ../init.d/irqbalance 
S13portmap -> ../init.d/portmap 
S15mdmonitor -> ../init.d/mdmonitor 
S15zebra -> ../init.d/zebra 
S16bgpd -> ../init.d/bgpd 
S16ospf6d -> ../init.d/ospf6d 
S16ospfd -> ../init.d/ospfd 
S16ripd -> ../init.d/ripd 
S16ripngd -> ../init.d/ripngd 
S20random -> ../init.d/random 
S24pcmcia -> ../init.d/pcmcia 
S25netfs -> ../init.d/netfs 
S26apmd -> ../init.d/apmd 
S27ypbind -> ../init.d/ypbind 
S28autofs -> ../init.d/autofs 
S40smartd -> ../init.d/smartd 
S44acpid -> ../init.d/acpid 
S54hpoj -> ../init.d/hpoj 
S55cups -> ../init.d/cups 
S55sshd -> ../init.d/sshd 
S56rawdevices -> ../init.d/rawdevices 
S56xinetd -> ../init.d/xinetd 
S58ntpd -> ../init.d/ntpd 
S75postgresql -> ../init.d/postgresql 
S80sendmail -> ../init.d/sendmail 
S85gpm -> ../init.d/gpm 
S87iiim -> ../init.d/iiim 
S90canna -> ../init.d/canna 
S90crond -> ../init.d/crond 
S90xfs -> ../init.d/xfs 
S95atd -> ../init.d/atd 
S96readahead -> ../init.d/readahead 
S97messagebus -> ../init.d/messagebus 
S97rhnsd -> ../init.d/rhnsd 
S99local -> ../rc.local
Wie Sie sehen, befindet sich keines der Skripte, die die Dienste starten und beenden, im Verzeichnis /etc/rc.d/rc5.d/. Vielmehr sind alle Dateien in /etc/rc.d/rc5.d/ symbolische Links, die auf Skripte im /etc/rc.d/init.d/-Verzeichnis zeigen. Symbolische Links werden in allen rc-Verzeichnissen verwendet, so dass die Runlevel durch Erstellen, Ändern und Löschen der symbolischen Links neu konfiguriert werden können, ohne dass die aktuellen Skripte davon betroffen werden, auf die sie verweisen.
Der Name jedes symbolischen Links beginnt entweder mit einem K oder einem S. Die K-Links sind Prozesse, die in diesem Runlevel gekillt werden, während die Links gestartet werden, die mit einem S beginnen.
Zuerst beendet der Befehl init alle symbolischen K-Links im Verzeichnis mit Hilfe des Befehls /etc/rc.d/init.d/<command> stop, wobei <command> der zu beendende Prozess ist. Anschließend werden alle symbolischen S-Links mit Hilfe von /etc/rc.d/init.d/<command> start gestartet.

Anmerkung

Wenn das System den Bootvorgang abgeschlossen hat, können Sie sich als root anmelden und dieselben Skripte zum Starten und Beenden der Dienste ausführen. So beendet zum Beispiel der Befehl /etc/rc.d/init.d/httpd stop den Apache HTTP-Server.
Alle symbolischen Links sind nummeriert, um die Startreihenfolge festzulegen. Sie können die Reihenfolge ändern, in der die Dienste gestartet oder beendet werden, indem Sie diese Nummerierung ändern. Je kleiner die Nummer, desto früher wird gestartet. Die symbolischen Links mit derselben Nummer werden in alphabetischer Reihenfolge gestartet.

Anmerkung

Als eine der letzten Aktionen führt das Programm init die Datei /etc/rc.d/rc.local aus. Diese Datei ist nützlich für das Anpassen des Systems. Für weitere Informationen zur Verwendung von rc.local lesen Sie bitte Abschnitt F.3, »Ausführen von zusätzlichen Programmen zum Zeitpunkt des Bootens«.
Nachdem der Befehl init das entsprechende rc-Verzeichnis für das Runlevel verarbeitet hat, spaltet (forkt) Upstart einen /sbin/mingetty-Prozess für jede virtuelle Konsole (Anmeldebildschirm) auf, die dem Runlevel durch die Job-Definition im /etc/event.d-Verzeichnis zugewiesen ist. Runlevel 2 bis 5 rufen alle sechs virtuellen Konsolen auf, während Runlevel 1 (Einzelbenutzermodus) nur eine aufruft und Runlevel 0 und 6 gar keine. Der /sbin/mingetty-Prozess öffnet Kommunikationspfade zu tty-Geräten [16], definiert deren Modus, zeigt die Login-Eingabeaufforderung an, nimmt den Benutzernamen und das -Passwort des Benutzers an und initiiert den Login-Prozess.
In Runlevel 5 führt Upstart ein Skript mit dem Namen /etc/X11/prefdm aus. Das Skript prefdm startet den bevorzugten X-Anzeigemanager[17]gdm, kdm, oder xdm, abhängig vom Inhalt der Datei /etc/sysconfig/desktop.
Nach Beendigung dieses Vorgangs ist das System im Runlevel 5 und zeigt den Anmeldebildschirm an.


[16] Werfen Sie einen Blick in das Red Hat Enterprise Linux Bereitstellungshandbuch für weitere Informationen zu tty-Geräten.
[17] Werfen Sie einen Blick in das Red Hat Enterprise Linux Bereitstellungshandbuch für weitere Informationen zu Anzeigemanagern.