init Prozess
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.
Runlevel
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.
Standard Runlevel
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.
System Runlevel
Die verfügbaren Runlevel der Linux Systeme.
- runlevel 0 ⇒ System halt (Do not use this for initdefault!)
- runlevel 1 ⇒ Single user mode
- runlevel 2 ⇒ Local multiuser without remote network (e.g. NFS)
- runlevel 3 ⇒ Full multiuser with network
- runlevel 4 ⇒ Not used
- runlevel 5 ⇒ Full multiuser with network and xdm
- runlevel 6 ⇒ System reboot (Do not use this for initdefault!)
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.
Aktuellen Runlevel anzeigen
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.
Runlevel wechseln
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:
- telinit [opt] [args]
Optionen:
- 0-6 ⇒ In den angegebenen Runlevel wechseln.
- Q|q ⇒ Die Datei /etc/inittab erneut einlesen.
- S|s ⇒ In den Einzelbenutzermodus zu wechseln (Debian).
- -e [VAR=WERT]|[VAR] ⇒ Weist init an die Umgebung für Prozesse zu ändern. VAR=WERT setzt eine Variable. VAR leert die Variable.
inittab
Beim Systemstart steuert die Datei „/etc/inittab“ den init Prozess. Für Einträge in dieser Datei gilt folgendes Format:
id:runlevels:action:process
- id ⇒ Der id Code kann aus 1-4 Zeichen bestehen die den Eintag eindeutig identifizieren. Ältere sysvinit Versionen mit der libc5 < 5.2.18 Bibliothek sind limitiert auf zwei Zeichen.
- runlevels ⇒ Gibt an, für welchen Runlevel der Eintrag gilt.
- action ⇒ Enthält die Anweisung für init.
- process ⇒ Gibt an, welcher Prozess oder welches Kommando ausgeführt werden soll.
Gültige Aktionen für das action Feld:
- respawn ⇒ Der Prozess startet nach seinem Ende wieder neu.
- wait ⇒ Der Prozess wird im angegebenen Runlevel einmal gestartet und init wartet auf dass Ende des folgenden Prozesses..
- once ⇒ Startet den Prozess einmal, wenn in den Runlevel eingetreten wird.
- boot ⇒ Der Prozess wird beim Systemstart ausgeführt. Runlevels werden ignoriert.
- bootwait ⇒ Der Prozess wird wärend des Bootvorgangs gestartet und wartet auf das Ende des folgenden Prozesses.
- ondemand ⇒ Prozess wird in einem ondemand Runlevel ausgeführt. Ondemand Runlevel sind a, b, c.
- initdefault ⇒ Definiert den Standard Runlevel des Systems.
- sysinit ⇒ Führt den Prozess einmal wärend des Bootvorganges aus. Runlevel werden ignoriert.
- powerwait ⇒ Führt den Prozess bei einem Stromausfall aus. init wartet auf den Prozess, bis er beendet wurde.
- powerfail ⇒ Wie powerwait, jedoch wartet init nicht bis der Prozess beendet wurde.
- powerokwait ⇒ Dieser Prozess wird ausgeführt, sobald init informiert wird, dass das System wiederhergestellt wurde.
- ctrlaltdel ⇒ Definiert, wie init auf Strg+Alt+Del reagieren soll.
Beispiel einer Debian inittab:
Beispiel einer Red Hat inittab:
Systeminitialisierung
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:
- Systemvariablen.
- Domain und Hostname.
- Dateisystem /proc wird aktiviert.
- Datum und Zeit einstellen.
- Tastatur und Textkonsole einstellen.
- udev System starten.
- RAID u. LVM aktivieren.
- Dateisysteme prüfen.
- Root Partition im read-write Modus neu einbinden.
- Partitionen einbinden.
- Netzwerkfunktionen initialisieren (nur Debian).
init-V-Scripte starten/stoppen
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
Start|Stop Links konfigurieren
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.
Red Hat
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:
- chkconfig [opt] [name] [arg]
Optionen:
- --list [name] ⇒ Zeigt an, in welchen Runlevel der entsprechende Dienst aktiviert oder deaktiviert ist.
- --add [name] ⇒ Fügt einen Dienst zum bearbeiten mit chkconfig hinzu und überprüft ob in allen Runleveln Start|Stop Links existieren, fehlt ein Link wird dieser nach den Standardeinstellungen im init Script erzeugt.
- --del [name] ⇒ Löscht sämtliche symbolische Links des Dienstes aus den Verzeichnissen rc[0-6].d.
- --on ⇒ Prüft den Service und generiert Softlinks.
- --off ⇒ Entfernt Softlinks zu den verwalteten Diensten.
- --level [levels] [name] ⇒ Setzt start Links der angegebenen Runlevel. Beispiel: levels 35 setzt Startlinks für die Runlevel 3 und 5.
- --level [levels] [name] [on|off|reset] ⇒ Startet|Stoppt den Dienst im ausgewählten Runlevel oder setzt diesen zurück.
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/* |
Debian
Mit „update-rc.d“ lassen sich Runlevel Links in Debian verwalten.
Syntax:
- update-rc.d [dienst] [opt] [args.]
Optionen:
- defaults ⇒ Erzeugt die Standard Start|Stopp links des Dienstes.
- defaults [runlevels .] ⇒ Erzeugt die Standard Start|Stopp links des Dienstes.
- disable ⇒ Verhindert automatischen Start des Dienstes. Alle Startlinks (S) werden in Stoplinks (K) umgewandelt.
- enable ⇒ Setzt beim deaktivierten Dienst die Startlinks wieder auf (S).
- remove -f ⇒ Löscht Start|Stop links aus dem Verzeichnis.
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/* |
SuSE
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:
- insserv [opt] [name]
Optionen:
- -r [name] ⇒ Start|Stop Link entfernen.
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/* |
rc.local
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
Aufbau von init Script Dateien
Beispiel Debian /etc/init.d/ntp:
Beispiel Red Hat /etc/rc.d/init.d/portmap:
Cloud