Automatisch gesteuerte Services
Artikel erschienen in Swiss IT Magazine 2008/09
Ein unixoides System stellt in der Regel eine Vielzahl von Services bereit. Diese müssen beim Betriebssystemstart oder spätestens beim ersten Zugriff auf «ihren» Netzwerk-Port gestartet werden. Einfache Netzwerk-Dienste werden in der Regel über (x)inetd gestartet, der bei der Anfrage auf einen Port die konfigurierte Service-Instanz startet und nach Beantwortung der Anfrage wieder stoppt. Komplexere Dienste oder solche ohne Netzwerk-Zugriff werden in der Regel über ein Init-Script gestartet, wobei BSD-Derivate ein einziges monolithisches Script (/etc/rc oder /etc/rc.local) für alle Services haben und von System V abgeleitete Unices wie Linux einzelne Scripts pro Service in /etc/init.d.
Beide Methoden haben das Problem, dass Dienste im Falle eines Absturzes nicht überwacht und gegebenenfalls neu gestartet werden. Auch Abhängigkeiten – beispielsweise Services, die von einem zweiten Daemon abhängen – werden nicht abgebildet. Ebenso kann man nicht ohne weiteres ermitteln, welche Prozesse zu welchem Init-Script gehören.
Aus diesen Gründen sind Init-Scripts nicht mehr ganz zeitgemäss, und es gibt viele Initiativen, um die Init-Scripts zu erweitern oder gar ganz zu ersetzen. Sun hat zu diesem Zweck mit Solaris 10 das sogenannte Service Management Facility (SMF) eingeführt. Bei SMF handelt sich um ein Framework, welches die Nachteile von System V Init und (x)inetd beheben soll. Kurz zusammengefasst gibt es ein XML-basiertes Regelwerk, welches die Abhängigkeiten von Services (Diensten) untereinander beschreibt, wie Prozesse gestartet oder gestoppt werden und wie reagiert werden soll, wenn der Prozess beendet ist oder abstürzt.
Die Service-Konfiguration besteht bei SMF aus zwei Teilen. SMF unterscheidet zwischen einem Dienst (Service) und einer Dienst-Instanz (Service Instance). Der Dienst beschreibt generell, wie ein Prozess gestartet wird – etwa der Secure Shell Daemon (sshd). Die Dienst-Instanz weiss hingegen unter anderem, wo die Konfigurationsdateien zu finden sind,
welche Abhängigkeiten benötigt werden (wie ein initialisiertes Netzwerk), wie und ob ein Prozess beim Beenden neu gestartet werden soll und an welchem Port der Dienst lauschen soll. Man kann für einen Dienst mehrere Instanzen konfigurieren, etwa einen weiteren SSH-Daemon, der an einem anderen Port lauscht.
Jeder Dienst und seine zugehörige Instanz sind dem System mit einem eindeutigen Namen bekannt. Dieser Name besteht aus drei Teilen: einer Definition, um was es sich handelt – im Fall von SSH um einen Service (Dienstprozess) –, einem Namen für den Service und dem dritten Teil, dem Namen der Instanz. Standardmässig lautet dieser Name «default». Im Beispiel des SSH-Daemon würde der komplette Name also wie folgt aussehen: svc:/network/ssh:default. Dieser eindeutige Name wird als Fault Manager Resource Identifier (FMRI) bezeichnet. Anhand des FMRI weiss der fmd (Fault Management Daemon), um welchen Prozess es sich
handelt.
Um Informationen zu den registrierten Services abzufragen, dient das Werkzeug svcs. Mit svcs -a lässt sich beispielsweise eine Liste der vorhandenen Dienste ausgeben, die über den Zustand der Dienste (Services State) informiert und seit wann dieser Zustand besteht. SMF kennt dabei eine Reihe von Service States:
- degraded: Der Dienst läuft eingeschränkt. Das Starten des Dienstes hat geklappt, ein Teil davon läuft aber nicht.
Gesteuert wird ein Dienst mit dem Befehl svcadm. Er ermöglicht unter anderem das Aktivieren, Deaktivieren und Neuladen eines Service. Ausserdem erlaubt er, das System zu einem Meilenstein zu versetzen. Ein Milestone ist grob mit den unter System V bekannten Init States verwandt, die man sich als eine Gruppe von Diensten vorstellen kann. Sind alle in einem Milestone als zwingend definierten Dienste erfolgreich gestartet, wird in den nächsten Milestone gewechselt. Der System V Runlevel S entspricht beispielsweise dem Milestone «single-user», Runlevel 2 «multi-user». Solaris kennt aber noch andere Milestones, etwa «devices». Er richtet alle im Server eingebauten Devices ein.
Der Milestone «network» bedeutet, dass alle für einen Netzwerkdienst erforderlichen Komponenten intitialisiert wurden. Nebst den vorhandenen Standard-Meilensteinen können auch eigene definiert werden. So wäre es etwa denkbar, einen Milestone «database» einzuführen, welcher erreicht wird, sobald alle Datenbanken hochgefahren sind. Ein Webserver,
welcher auf die Datenbanken zugreifen soll, könnte nun von diesem Milestone abhängen und erst dann gestartet werden, wenn alle Datenbanken laufen.
Schneller Start dank Milestones und Abhängigkeiten
Um eigene Dienste an die Service Management Facility zur Verwaltung übergeben zu können, ist eine grundlegende Kenntnis von XML von Vorteil. Die Konfiguration eines Dienstes wird nämlich anhand sogenannter XML-basierter Manifest-Dateien getätigt. Die im System bekannten Manifeste liegen unter /var/svc/manifest. Um ein eigenes Manifest zu schreiben, kopiert man am besten eine Datei irgendwo auf das System und editiert sie. Hat man diese an die eigenen Vorstellungen angepasst, muss man sie noch SMF bekannt machen. Dies geschieht aber nicht, indem man sie selber nach /var/svc/manifest kopiert, sondern mit Hilfe des Programms svccfg, mit dem das Manifest vor dem Import validiert werden kann:
# svccfg
svc:> validate /tmp/mein_ssh.xml
svc:> import /tmp/mein_ssh.xml
svc:> quit
Anschliessend ist der Dienst betriebsbereit und kann via
svcadm aktiviert werden. Wenn alles richtig gemacht wurde, kann man seinen neuen Dienst testweise killen und beobachten, wie er automatisch neu gestartet wird.
Beispiel für Service-Manifest
Wie man sieht, ist SMF eine sinnvolle Neuerung für (Open)Solaris und bietet dem Systemadministrator einige Vorteile. Statt sich Start- und Überwachungsscripts selber basteln zu müssen, erledigt das das Betriebssystem von selber. Man muss ihm nur per Konfigurationsdatei sagen, was es zu tun hat. Durch die Abhängigkeiten funktioniert dies nicht nur über mehrere Services hinweg, in Kombination mit den Milestones kann auch noch das Betriebssystem schneller booten. So kann der Webserver beispielsweise parallel zum SSH-Server gestartet werden, sobald das Netzwerk bereit ist.
Gregor Longariva (lonagriva@softbaer.de) ist Solaris-Administrator am Rechenzentrum der Universität Erlangen-Nürnberg.