Linux: Service-Management mit systemd

Systemd hat bei fast allen großen Linux-Distributionen Einzug gehalten. Einfaches und übersichtlicheres Service-Management sind zwei der Vorteile.

Systemd ist eine radikale Änderung verglichen mit dem früheren Service-Management unter Linux. Die Komponente bietet nicht nur für Services eine allgemeine Schnittstelle, sondern auch für die Verwaltung der Hardware.

Bis zur Veröffentlichung von Upstart vor einigen Jahren, benutzte Linux eine Init-basierte Start-Prozedur. Upstart sollte das Starten von Linux effizienter machen, hatte allerdings eine relativ geringe Lebensdauer. Kaum war es am Start, bekam es mit systemd starke Konkurrenz. Fast alle großen Linux-Distributionen nutzen systemd für das Starten und Verwalten der Services.

Linux-Administratoren haben die Service-Skripte ihrer favorisierten Linux-Distribution gewöhnlich im Verzeichnis /etc/[rc.d]/init.d gesucht und gefunden. Dort sind sie allerdings nicht mehr. Hier befinden sich lediglich noch einige Dienste, die noch kein systemd-Start-Skript besitzen. Unter Fedora sind die systemd-Services im Verzeichnis /etc/system/system. Hier befinden sich allerdings nur Links auf den wirklichen Ort der Service-Skripte,/usr/lib/system/system, hinterlegt. Dort gibt es wiederum ein Unterverzeichnis mit Namen multi-user.target.wants, das die Service-Skripte für die im System installierten Dienste enthält.

In systemd wurde das Konzept der runlevels verworfen. Während des Starts durchläuft der Computer einige Phasen, die man als wants bezeichnet. Die Definition eines want ist nicht so strikt wie die eines runlevel. Somit lassen sich Distributions-übergreifend Unterschiede feststellen. Unter Fedora 17 finden Sie zum Beispiel folgende „wants“:

  • sysinit.target.wants: Enthält Skripte, die früh gestartet werden müssen;
  • basic.target.wants: Weitere Skripte, die früh gestartet werden müssen;
  • multi-user.target.wants: Normale Services, die Sie in der Regel für ein funktionierendes System benötigen.

Zu diesen allgemeinen wants gibt es einige spezielle. Sie finden möglicherweise bluetooth.target.wants, das Bluetooth startet. Um ttys für Anwender zu starten, ist getty.target.wants zuständig. In diesen Dateien finden Sie das eigentliche Skript. Auch hier werden Sie bei unterschiedlichen Distributionen Abweichungen finden. Die Entwickler der jeweiligen Distributionen erschaffen einfach die wants, die sie benötigen.

Die Start-Skripte sind im eigentlichen Sinne keine mehr. Bei der alten Methode wurden Bash-Skripte benutzt, um die Services zu starten. Jetzt übergeben die Startup-Skripte von systemd benötigte Parameter, um die jeweiligen Services zu starten. Es ist einfach zu verstehen, wie ein Service aufgerufen wird (Beispiel 1).

Beispiel 1: Ein typisches Skript für systemd unter Linux

[root@IAD multi-user.target.wants]# cat sshd.service
[Unit]
Description=OpenSSH server daemon
After=syslog.target network.target auditd.service

[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStartPre=/usr/sbin/sshd-keygen
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

Dieses übersichtliche Service-Skript definiert Variablen, die systemd weiterverarbeitet. Alle Service-Skripte folgen dabei mehr oder weniger derselben Syntax. Dies ist verglichen mit vielen unterschiedlichen Init-Skripten wesentlich einfacher zu verwalten.

Allerdings kümmert sich systemd nicht nur um Services, wie man sie aus der init-basierten Zeit kennt. Die Software kann auch Teile der Hardwareverwaltung übernehmen. Beim Betrachten der Services, die systemd verwaltet, findet man zum Beispiel Netzwerk-Geräte und ttys.

Mit systemctl Linux-Services verwalten

Mit dem Befehl systemctl verwalten Sie die Services. Er ersetzt alte Befehle, wie zum Beispiel service und chkconfig. Diese brauchen Sie nur noch für alte Services, die noch kein systemd-kompatibles Skript besitzen. Geben Sie systemctl auf der Kommandozeile ein, bekommen Sie eine Liste mit allen von systemd verwalteten Services. Auch den derzeitigen Status verrät das Programm (Beispiel 2).

Beispiel 2: Mithilfe von systemctl können Sie sich eine Liste der Services ausgeben lassen

mdmonito...keover.service

loaded active exited

Software RAID Monitor Takeover

mysqld.service

loaded active running

MySQL database server

NetworkManager.service

loaded active running

Network Manager

nfs-idmap.service

loaded active running

NFSv4 ID-name mapping daemon

nfs-lock.service

loaded active running

NFS file locking service.

nfs-mountd.service

loaded active running

NFS Mount Daemon

nfs-rquotad.service

loaded active running

NFS Remote Quota Server

nfs-server.service

loaded active exited

NFS Server

ovirt-engine.service

loaded active running

oVirt Engine

postgresql.service

loaded active running

PostgreSQL database server

prefdm.service

loaded active running

Display Manager

rpcbind.service

loaded active running

RPC bind service

rsyslog.service

loaded active running

System Logging Service

rtkit-daemon.service

loaded active running

RealtimeKit Scheduling Policy Service

sendmail.service

loaded active running

Sendmail Mail Transport Agent

sm-client.service

loaded active running

Sendmail Mail Transport Client

smartd.service

loaded active running

Self Monitoring and Reporting Technology (SMART) Daemon

spice-vdagentd.service

loaded active exited

LSB: Agent daemon for Spice guests

sshd.service

loaded active running

OpenSSH server daemon

system-s...yboard.service

loaded active running

System Setup Keyboard

systemd-journald.service

loaded active running

Journal Service

systemd-logind.service

loaded active running

Login Service

systemd-...ollect.service

loaded active exited

Collect Read-Ahead Data

 

Wollen Sie eine Status-Information über einen bestimmten Service in Erfahrung bringen, benutzen Sie dafür systemctl gefolgt vom Namen des Service. Der Service-Name enthält in der Regel die Endung .service. Richtig wäre zum Beispiel systemctl status sshd.service und nicht systemctl show sshd.

Systemctl bringt noch andere nützliche Ausgabe-Optionen mit. Dazu gehört zum Beispiel systemctl show servicename.service, was die Konfiguration eines bestimmten Service ausgibt.

Beispiel 3: Benutzen Sie systemctl status Service-Name.service, um den derzeitigen Status zu erfahren

[root@IAD ~]# systemctl status sshd.service

sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
Active: active (running) since Wed, 06 Mar 2013 07:44:53 +0100; 6h ago
Process: 1043 ExecStartPre=/usr/sbin/sshd-keygen (code=exited, status=0/SUCCESS)
Main PID: 1085 (sshd)
CGroup: name=systemd:/system/sshd.service
â 1085 /usr/sbin/sshd -D

Mar 06 13:42:32 IAD.example.com sshd[4590]: Connection closed by 127.0.0.1 [preauth]
Mar 06 13:43:32 IAD.example.com sshd[4602]: Connection closed by 127.0.0.1 [preauth]
Mar 06 13:44:32 IAD.example.com sshd[4610]: Connection closed by 127.0.0.1 [preauth]
Mar 06 13:45:32 IAD.example.com sshd[4618]: Connection closed by 127.0.0.1 [preauth]
Mar 06 13:46:32 IAD.example.com sshd[4630]: Connection closed by 127.0.0.1 [preauth]
Mar 06 13:47:32 IAD.example.com sshd[4639]: Connection closed by 127.0.0.1 [preauth]
Mar 06 13:48:32 IAD.example.com sshd[4651]: Connection closed by 127.0.0.1 [preauth]
Mar 06 13:49:32 IAD.example.com sshd[4660]: Connection closed by 127.0.0.1 [preauth]
Mar 06 13:50:32 IAD.example.com sshd[4670]: Connection closed by 127.0.0.1 [preauth]
Mar 06 13:51:32 IAD.example.com sshd[4686]: Connection closed by 127.0.0.1 [preauth]

Um einen Service erstmalig zu starten, verwenden Sie systemctl start Service-Name.service. Äquivalent dazu funktioniert das Anhalten:  systemctl stop Service-Name.service. Somit können Sie Services manuell starten und stoppen. Wollen Sie einen Service gleich beim Systemstart laufen lassen, benutzen Sie den Befehl systemctl enable Service-Name.service. Das Deaktivieren funktioniert dazu äquivalent wie folgt:  systemctl disable Service-Name.service.

Erfahren Sie mehr über Serverbetriebssysteme

- GOOGLE-ANZEIGEN

ComputerWeekly.de

Close