Der „/sbin/init“ Prozess ist das erste Programm, das der Kernel startet. Init besitzt immer die Prozess-ID 1. Die Hauptaufgabe von „init“ ist das starten von Prozessen aus der Datei /etc/inittab, die auch die Hauptkonfigurationsdatei von init darstellt, dort sieht init zuerst nach, ob es einen „initdefault“ Eintrag gibt, der den Standard Runlevel des Systems bestimmt. Diese Datei hat Einträge um auf jeder Leitung gettys zu erzeugen, auf der sich Nutzer einloggen können. Außerdem werden alle unabhängigen Prozesse gesteuert, die vom System benötigt werden z.B. mounten von Dateisystemen und Dämonen. Beim Herunterfahren ist „init“ ebenfalls der letzte Prozess, der alle noch laufenden Prozesse beendet.
Beim ersten Eintritt in den Mehrbenutzermodus führt „init“, „boot“ und „bootwait“ Einträge aus, die das einhängen von Dateisystemen erlauben, bevor sich Nutzer anmelden können. Danach werden alle Einträge, die zum Runlevel passen verarbeitet.
Wird ein neuer Prozess gestartet, überprüft „init“ zuerst, ob ein initscript existiert. Ist dies der Fall benutzt es dieses Script um den Prozess zu starten.
Wird ein Kindprozess beendet, protokolliert init den Zustand und den Grund der Beendigung in die Dateien „/var/run/utmp“ und „/var/log/wtmp“, sofern diese Dateien existieren.
Die Runlevel des Systems steuern Gruppen von Prozessen, denen es erlaubt ist zu starten oder zu stoppen. Die Prozesse, die von init für jeden Runlevel erzeugt werden sind in der Datei „/etc/inittab“ definiert.
Der Standardrunlevel wird in der Zeile „initdefault“ festgelegt. Dieser bestimmt dann ob das System im Textmodus oder im Grafischen X-Windows System startet. Bei den meisten Linux Systemen wird X in Runlevel 5 gestartet, bei Debian ist es Runlevel 2.
# The default runlevel. id:2:initdefault:
Standard Runlevel in der Datei „/etc/inittab“ eines Debian Systems.
id:5:initdefault:
Standard Runlevel mit X eines Red Hat Systems.
Bei Debian Systemen mit installierten Display Manager (gdm, kdm oder xdm) wird X automatisch in den Runleveln 2-5 gestartet. Will man ein Debian System dennoch im Textmodus starten, muß man die Start|Stop Links des Display Managers aus den „/etc/rc*.d“ Dateien entfernen.
root@home:~# update-rc.d -f gdm3 remove
root@home:~# update-rc.d gdm3 stop 1 0 1 2 3 4 5 6 .
Hier wird zuerst das löschen aller Start|Stop Links vom Display Manager erzwungen (-f). Danach werden für gdm Stop Links in allen Runlevel eingerichtet.
Die verfügbaren Runlevel der Linux Systeme.
Der Einzelbenutzemodus Runlevel 1 dient dazu, um Wartungsarbeiten am System als Administrator(root) durchzuführen, dabei werden alle anderen angemeldeten Nutzer vom System getrennt.
Debian geht hier eigene Wege. Hier sind die Runlevel 2-5 gleich.
Auszüge aus einer Debian /etc/inittab:
# /etc/init.d executes the S and K scripts upon change # of runlevel. # # Runlevel 0 is halt. # Runlevel 1 is single-user. # Runlevels 2-5 are multi-user. # Runlevel 6 is reboot.
Der Runlevel S wird bei Debian dazu benutzt um das System beim Start zu initialisieren. Danach tritt das System automatisch in die Mehrbenutzer Runlevel 2-5 ein.
Mit dem Befehl „runlevel“ liest das System den aktuellen Runlevel über die Binärdatei „/var/run/utmp“ aus.
root@home:~# runlevel N 2
Gibt den aktuellen Runlevel in der zweiten Spalte aus. Wurde der Runlevel gewechselt, wird der letzte Runlevel in der ersten Spalte ausgegeben.
Beim Runlevel wechsel überprüft das „rc“ Script ob es für die Scriptfunktionen einen Start oder Stopp Link gibt, denn es werden nur Funktionen gestoppt, die im folgenden Runlevel nicht gebraucht werden.
Beispiele:
root@home:~# init 3
Runlevel wechseln.
root@home:~# telinit 3
Das Kommando „/sbin/telinit“ ist mit „/sbin/init“ verknüpft. Telinit kann man Argumente mitgeben, die init Signale sendet um Aktionen durchzuführen.
Syntax:
Optionen:
Beim Systemstart steuert die Datei „/etc/inittab“ den init Prozess. Für Einträge in dieser Datei gilt folgendes Format:
id:runlevels:action:process
Gültige Aktionen für das action Feld:
Beispiel einer Debian inittab:
Beispiel einer Red Hat inittab:
Bevor die Runleveldienste geladen werden wird eine Systeminitialisierung durchgeführt, diese sind in einer Zeile der „/etc/inittab“ Datei aufgeführt.
Debian | si::sysinit:/etc/init.d/rcS |
Red Hat | si::sysinit:/etc/rc.d/rc.sysinit |
SuSe | si::sysinit:/etc/init.d/boot |
Initialisiert werden hierdurch:
Nachdem die Systeminitialisierung abgeschlossen ist, kann das System im Standard Runlevel starten. Die Script Dateien befinden sich je nach Distribution in „/etc/init.d“ (Debian ) oder „/etc/rc.d/init.d/“ (Red Hat ). Für die Runlevel existieren die Verzeichnisse „rc0.d“ - „rc6.d“, in denen sich Symbolische Links mit vorangestellten „K“ (Kill) oder „S“ (Start) gefolgt von einer Nummer für die Ausführungsreihenfolge befinden, die auf die jeweiligen init Scripte verweisen. An rc wird der aktuelle Runlevel übergeben und führt zunächst alle im Verzeichnis rc*.d „Kill“ Script Dateien zum beenden, danach alle „Start“ Script Dateien zum starten der Prozesse aus.
drwxr-xr-x 2 root root 4096 29. Okt 18:52 rc0.d drwxr-xr-x 2 root root 4096 29. Okt 18:52 rc1.d drwxr-xr-x 2 root root 4096 20. Nov 05:50 rc2.d drwxr-xr-x 2 root root 4096 20. Nov 05:50 rc3.d drwxr-xr-x 2 root root 4096 20. Nov 05:50 rc4.d drwxr-xr-x 2 root root 4096 20. Nov 05:50 rc5.d drwxr-xr-x 2 root root 4096 29. Okt 18:52 rc6.d -rwxr-xr-x 1 root root 329 8. Okt 21:08 rc.local drwxr-xr-x 2 root root 4096 14. Sep 23:05 rcS.d
Das Verzeichnis rcS.d ist Debian spezifisch und wird bei der System initialisierung eingelesen. Die Datei rc.local wird von init zuletzt verarbeitet und kann zum starten eigener Scripte verwendet werden.
Beispiel /etc/rc2.d Debian :
... lrwxrwxrwx 1 root root 14 4. Jan 2010 S18cron -> ../init.d/cron lrwxrwxrwx 1 root root 14 4. Jan 2010 S18dbus -> ../init.d/dbus lrwxrwxrwx 1 root root 15 4. Jan 2010 S18exim4 -> ../init.d/exim4 lrwxrwxrwx 1 root root 20 4. Jan 2010 S18kerneloops -> ../init.d/kerneloops lrwxrwxrwx 1 root root 21 4. Jan 2010 S18loadcpufreq -> ../init.d/loadcpufreq lrwxrwxrwx 1 root root 13 20. Nov 05:50 S18ntp -> ../init.d/ntp ...
lrwxrwxrwx 1 root root 15 4. Jan 2010 K01exim4 -> ../init.d/exim4 lrwxrwxrwx 1 root root 14 4. Jan 2010 K01fuse -> ../init.d/fuse lrwxrwxrwx 1 root root 14 4. Jan 2010 K01gdm3 -> ../init.d/gdm3 lrwxrwxrwx 1 root root 20 4. Jan 2010 K01kerneloops -> ../init.d/kerneloops lrwxrwxrwx 1 root root 25 4. Jan 2010 K01network-manager -> ../init.d/network-manager
Möchte man bestimmte Dienste automatisch im gewünschten Runlevel starten, müssen die entsprechenden Links erstellt werden. Um zu verhindern, dass ein Dienst automatisch startet, entfernt man den Link. Dies kann man entweder manuell erledigen oder man benutzt die Kommandos der Distibutionen.
Beispiel Apache Webserver mit Red Hat :
[root@home ~]# cd /etc/rc.d [root@home rc.d]# ln -s init.d/httpd rc0.d/K15httpd [root@home rc.d]# ln -s init.d/httpd rc1.d/K15httpd [root@home rc.d]# ln -s init.d/httpd rc2.d/K15httpd [root@home rc.d]# ln -s init.d/httpd rc3.d/S40httpd [root@home rc.d]# ln -s init.d/httpd rc5.d/K15httpd [root@home rc.d]# ln -s init.d/httpd rc6.d/K15httpd
Hier wird der Apache Webserver automatisch im Runlevel 3 gestartet, in allen anderen Runleveln ist der automatische Start deaktiviert. Hierbei ist noch zu beachten, dass der Webserver mit der Prioritätsnummer 40 nach dem Netzwerk startet.
Je nach Distribution existieren Kommandos, die das Einrichhten der Start|Stop Links vereinfachen.
Symbolische Links für Dienste unter Red Hat Systeme verwalten mit „chkconfig“. Wird chkconfig nur mit einem Dienstnamen ohne Optionen aufgerufen, überprüft chkconfig ob der Dienst im aktuellen Runlevel gestartet werden kann.
Syntax:
Optionen:
Beispiele:
[root@home ~]# chkconfig --add httpd
[root@home ~]# chkconfig --list httpd httpd 0:Aus 1:Aus 2:Aus 3:Aus 4:Aus 5:Aus 6:Aus
[root@home ~]# chkconfig --level 35 httpd on [root@home ~]# chkconfig --list httpd httpd 0:Aus 1:Aus 2:Aus 3:Ein 4:Aus 5:Ein 6:Aus
Red Hat init Scripte manuell starten/stoppen:
/etc/init.d/httpd start|stop|restart|reload|status
service httpd start|stop|restart|reload|status
Für beide Schreibweisen für init Scripte sind nicht immer alle Optionen verfügbar.
Red Hat init Konfigurationsdateien | |
---|---|
Systeminitialisierung | /etc/rc.d/rcsysconfig |
Init-Scripte | /etc/rc.d/init.d/* |
Runlevel Links | /etc/rc.d/rc*.d/* |
Konfigurationsdateien | /etc/sysconfig/* |
Mit „update-rc.d“ lassen sich Runlevel Links in Debian verwalten.
Syntax:
Optionen:
Zum entfernen aller Start|Stop Links für einen Dienst kann man folgendes Kommando verwenden.
root@home:~# update-rc.d -f apache2 remove
Entfernt alle Start und Stop Links des Webservers. Ohne die Option -f (force) müssen die Links erst manuell gelöscht werden.
Zum erstellen von Start|Stop Links für einen Dienst können folgende Kommandos verwendet werden.
root@home:~# update-rc.d apache2 defaults 18 1
Definiert in den Runleveln 2-5 Links zum start und stoppen 0, 1, 6 als Default Wert. Linknamen beginnen fortlaufend mit einer Zahl, die die Prozess Priorität darstellt und nacheinander abgearbeitet werden. Im Beispiel wird der Webserver mit der Priorität 18 gestartet und mit 1 gestoppt. Bei Debian Systemen ist es möglich init Scripte mit der gleichen Prozess Priorität paralell zu starten.
Es können aber auch Start|Stop Links inividuell für jeden Runlevel definiert werden, hierzu übergibt man die Start|Stop Argumente für jeden Runlevel. Eine Argumentgruppe wird immer mit einem Punkt abgeschlossen.
root@home:~# update-rc.d apache2 start 18 2 3 4 5 . stop 1 0 1 6 .
Debian init Scripte manuell starten/stoppen:
/etc/init.d/apache2 start|stop|restart|reload|status
invoke.rc apache2 start|stop|restart|reload|status
Für beide Schreibweisen sind für init Scripte nicht immer alle Optionen verfügbar.
Debian init Konfigurationsdateien | |
---|---|
Systeminitialisierung | /etc/init.d/rcS , /etc/rcS.d/* |
Init-Scripte | /etc/init.d/* |
Runlevel Links | /etc/rc*.d/* |
Konfigurationsdateien | /etc/default/* |
Mit „insserv“ lassen sich Runlevel Links unter SuSE verwalten. Mit insserv werden die Start|Stop, sowie die Provides und Requires Kommentare des init Scripts ausgewertet. Falls notwendig werden auch vorhandene Links neu nummeriert. Es wird jedoch nicht empfohlen, die Links manuell zu bearbeiten.
Syntax:
Optionen:
Beispiele:
root # insserv httpd
Erstellt Start|Stop Links für den Webserver.
root # insserv -r httpd
Hebt die Verlinkung wieder auf.
SuSE init Scripte manuell starten/stoppen:
/etc/init.d/httpd start|stop|restart|reload|status
rchttpd start|stop|restart|reload|status
Für beide Schreibweisen für init Scripte sind nicht immer alle Optionen verfügbar.
SuSE init Konfigurationsdateien | |
---|---|
Systeminitialisierung | /etc/init.d/boot, /etc/init.d/boot.d/* |
Init-Scripte | /etc/rc.d/init/* |
Runlevel Links | /etc/rc.d/rc*.d/* |
Konfigurationsdateien | /etc/sysconfig/* |
Mit der Datei „/etc/rc.local“ (Debian ) oder „/etc/rc.d/rc.local“ (Red Hat ) kann man dem init-Prozess selbst geschriebene oder speziell angepasste Scripte hinzufügen. Dieses Script wird erst nach allen anderen init Scripten einmal ausgeführt, sobald das System im Runlevel 2, 3, 4 oder 5 gestartet wird. Hier kann der Pfad zu den Scripten zeilenweise untereinander eingetragen werden.
Beispiel /etc/rc.local:
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. /usr/local/bin/myscript1.sh /usr/local/sbin/myscript2.sh exit 0
Beispiel Debian /etc/init.d/ntp:
Beispiel Red Hat /etc/rc.d/init.d/portmap: