Upstart
Ubuntu setzt schon sein Jahren auf das Upstart Init System es ist zwar noch nicht komplett umgestellt, aber der Weg ist richtig.
Ziel vs. Ereignis
Upstart (http://upstart.ubuntu.com) ist der Name eines völlig neuartigen Konzeptes, welches eine völlige Abkehr von init darstellen soll. Die bisherigen Konzepte haben eines gemeinsam: sie sind zielorientiert. Dies bedeutet, dass vorher festgelegt wird, welche Dienste am Ende des Startvorganges laufen sollen. Die Abhängigkeiten werden vorher in einer sinnvollen Reihenfolge definiert. Upstart hingegen soll ereignisorientiert sein. Bei dieser Vorgehensweise lauern die Dienste im Hintergrund und starten erst dann, wenn alle Vorbedingungen erfüllt sind. Dies sind die sogenannten »Events«. Beispiel: Wenn Sie einen USB-Stick an den Rechner stecken, löst dies ein Event aus, welches dazu führt, dass der USB-Stick gemountet wird.
Die Events werden in die folgenden drei Klassen eingeteilt:
- Edge-Events Dies sind einfache Events wie »Benutzer löst durch Tastendruck eine bestimmte Funktion aus«.
- Temporale Events Dies sind zeitgesteuerte Ereignisse.
- Level-Events Diese Events erhalten einen zusätzlichen Parameter, beispielsweise den Zustand einer bestimmten Hardware. Dienste starten hierbei bei jedem beliebigen Wert oder einem Schwellenwert des Parameters.
Upstart soll nicht nur das Booten des Sytems beschleunigen, sondern auch das dynamische Verwalten von Diensten. Dies betrifft folgende Bereiche, die mit Upstart vereinheitlicht und verwaltet werden sollen:
- Viele Dienste hängen vom Funktionieren bestimmter Hardware ab. So können manche Dienste erst gestartet werden, wenn die dazu nötige Netzwerkverbindung ad hoc aufgebaut wurde.
- Die Dynamik der Dienste-Verwaltung betrifft auch zeitabhängige Prozesse. So gibt es Services wie Cron oder den Anacron, die bestimmte Prozesse zu festgelegten Zeitpunkten starten.
Die Entwicklung steht noch am Anfang, aber die erste Implementation dieses neuen Konzeptes hat 2006 Einzug in die regulären Ubuntu-Versionen und inzwischen auch in die testing-Version von Debian gehalten. Um den reibungslosen Betrieb der Distributionen nicht zu gefährden, erfolgen große Teile der Initialisierung mithilfe des Kompatibilitätsscriptes /etc/init.d/rc durch die herkömmlichen init-Dateien. Die Ausweitung auf Teile des Systemstarts erfolgt kontinuierlich in neueren Ubuntu-Versionen, wobei temporale Events noch nicht integriert sind
Jobs
Die einzelnen Skripte, die beim Eintreffen eines Events ausgeführt werden sollen, werden von Upstart als Jobs bezeichnet. Diese Skripte werden im Verzeichnis /etc/event.d gesammelt. Wie bei dem init-Konzept wird auch bei Upstart das Programm /sbin/init als erster Prozess vom Kernel gestartet. Die bekannte Datei /etc/inittab gibt es bei Upstart nicht mehr. Stattdessen werden die Jobs aus dem Verzeichnis /etc/event.d vom Upstart-Init gelesen.
Liste der Jobs in /etc/event.d
root@zero:/etc/event.d# ls control-alt-delete last-good-boot logd rc0 rc1 rc2 rc3 rc4 rc5 rc6 rc-default rcS rcS-sulogin sulogin tty1 tty2 tty3 tty4 tty5 tty6
- defaultrunlevel
root@zero:/etc/event.d# cat rc-default
start on stopped rcS
script
runlevel --reboot || true
if grep -q -w -- "-s\|single\|S" /proc/cmdline; then
telinit S
elif [ -r /etc/inittab ]; then
RL="$(sed -n -e "/^id:[0-9]*:initdefault:/{s/^id://;s/:.*//;p}" /etc/inittab || true)"
if [ -n "$RL" ]; then
telinit $RL
else
telinit 2
fi
else
telinit 2
fi
end script
- runlevel 2
root@zero:/etc/event.d# cat rc2 start on runlevel 2 stop on runlevel [!2] console output script set $(runlevel --set 2 || true) if [ "$1" != "unknown" ]; then PREVLEVEL=$1 RUNLEVEL=$2 export PREVLEVEL RUNLEVEL fi exec /etc/init.d/rc 2 end script
- tty1
root@zero:/etc/event.d# cat tty1 start on stopped rc2 start on stopped rc3 start on stopped rc4 start on stopped rc5 stop on runlevel 0 stop on runlevel 1 stop on runlevel 6 respawn exec /sbin/getty 38400 tty1
- control-alt-delete
root@zero:/etc/event.d# cat control-alt-delete start on control-alt-delete exec /sbin/shutdown -r now "Control-Alt-Delete pressed"
Ändern des Verhaltens von Strg-Alt-Entf
Editieren der Datei /etc/event.d/control-alt-delete . Die Datei beginnend mit exec bestimmt, was upstart startet, wenn diese Tastenkombination gedrückt wurde.
initctl
list
Anzeigen der Jobs
root@zero:~# initctl list control-alt-delete (stop) waiting last-good-boot (stop) waiting logd (stop) waiting rc-default (stop) waiting rc0 (stop) waiting rc1 (stop) waiting rc2 (stop) waiting rc3 (stop) waiting rc4 (stop) waiting rc5 (stop) waiting rc6 (stop) waiting rcS (stop) waiting rcS-sulogin (stop) waiting sulogin (stop) waiting tty1 (start) running, process 3128 tty2 (start) running, process 2153 tty3 (start) running, process 2154 tty4 (start) running, process 2143 tty5 (start) running, process 2146 tty6 (start) running, process 2155
emit
Ereignis mit emit auslösen
- Datei mit event erstellen
root@zero:/etc/event.d# cat xinux start on hund-haut-ab exec echo "hund ist abgehauen" >> /tmp/hund
- Event auslösen
root@zero:/etc/event.d# initctl emit hund-haut-ab hund-haut-ab xinux (start) waiting xinux (start) starting xinux (start) pre-start xinux (start) spawned, process 11249 xinux (start) post-start, (main) process 11249 xinux (start) running, process 11249 xinux (stop) running xinux (stop) stopping xinux (stop) killed xinux (stop) post-stop xinux (stop) waiting
- Ergebnis
root@zero:~# cat /tmp/hund hund ist abgehauen
stop
Stoppen eines Jobs
root@zero:/etc/event.d# initctl stop tty1 tty1 (stop) running, process 11020 tty1 (stop) pre-stop, (main) process 11020 tty1 (stop) stopping, process 11020 tty1 (stop) killed, process 11020 tty1 (stop) post-stop tty1 (stop) waiting
status
Status eines Jobs
root@zero:/etc/event.d# initctl status tty1 tty1 (stop) waiting
start
Starten eines Jobs
root@zero:/etc/event.d# initctl start tty1 tty1 (start) waiting tty1 (start) starting tty1 (start) pre-start tty1 (start) spawned, process 11262 tty1 (start) post-start, (main) process 11262 tty1 (start) running, process 11262
Kompatibilität
Zurzeit werden lediglich die Terminalemulatoren der Textkonsolen von Upstart gestartet. Alle anderen Aufgaben werden durch das Kompatibilitätsscript /etc/init.d/rc erledigt. Dieses Skript wird durch die Upstart-Konfigurationsdateien rc0 bis rc6 sowie rcS gestartet und funktioniert wie gehabt. Das heißt, es führt alle Start- und Stopp-Skripte in den Ordnern /etc/rc0...6, S aus. Mittelfristig werden diese Verzeichnisse aber verschwinden und /etc/event.d alle Aufgaben übernehmen.
upstart-Skripte
| Skript | Ereignis | Funktion |
| control-alt-delete | control-alt-delete | Neustart des Systems mit Strg+Alt+Entf |
| logd | Protokollierung | |
| rc0-rc6 | runlevel n | Wechselt in den Runlevel n |
| rc-default | stopped rcS | Setzt den Standard-Runlevel 2 |
| rcS | startup | Systeminitialisierung |
| rcS-sulogin | runlevel S | rcS im Single-User-Betrieb (/etc/nologin) |
| sulogin | Rescue Modus (läuft, wenn keine anderen Jobs ausgeführt werden) | |
| tty1 | runlevel 2-5 | Start der Terminalemulatoren in Textkonsole 1 |
| tty2-tty6 | runlevel 2-3 | Startet die Terminalemulatoren der anderen Textkonsolen |