Upstart

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

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

bonding-problem