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.