Systemd
Allgemeines
Systemd ist neben Upstart ein Ersatz für SysV-Init, siehe auch LinuxUser Artikel 01/2011.
Systemd ignoriert Abhängigkeiten
Anfragen werden in eine Warteschlange gestellt
Jedes Service wird in eine sog. CGroup gepackt. CGroup = ControlGroup, ein vom Kernel bereitgestelltes Feature.
Jedes Service hat eine Konfigurationsdatei = Unit in
/lib/systemd/system
Es gibt auch benutzerdefinierte Dateien. Diese haben Vorrang und befinden sich in
/etc/systemd/system
Es gibt auch sog. target-Dateien. Diese entsprechen den Runleveln im SysV-Init System, z.B.
default.target
entspricht default runlevel
Info
Hier werden die wichtigsten systemd Kommandos sehr übersichtlich erklärt:
http://crashmag.net/useful-systemd-commands
systemctl
- systemctl
Alle Services auflisten:
systemctl
Status eines dienstes ausgeben:
systemctl status NetworkManager.service
Ein Service starten
systemctl start NetworkManager.service
Ein Service für automatischen Start aktivieren
systemctl enable postfix.service
Ein Service deaktivieren
systemctl disable postfix.service
Alle Units neu starten
systemctl daemon-reload
Bootprozess auswerten
systemd-analyze systemd-analyze blame
Gegenüberstellung von SysV-Init und Systemd
SysV-Init
/sbin/chkconfig nxserver on /sbin/chkconfig nxserver off
oder
insserv nxserver insserv --remove nxserver
Systemd
systemctl enable nxserver.service systemctl disable nxserver.service
http://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet
Erstellen einer Systemd Unit
Startskript ausführen mit Systemd
- Unit erzeugen
pico /usr/lib/systemd/system/after-local.service
mit folgendem Inhalt
# This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. [Unit] Description=/etc/init.d/after.local Compatibility ConditionFileIsExecutable=/etc/init.d/after.local [Service] Type=oneshot ExecStart=/etc/init.d/after.local TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99
[Install] WantedBy=multi-user.target
- Skript editieren
pico /etc/init.d/after.local
mit folgendem Inhalt
# script with local commands to be executed from init after all scripts # of a runlevel have been executed. # # Here you should add things, that should happen directly after # runlevel has been reached. # umask 0022 # Variablen generieren: . /etc/os-release echo "------------------------------------" > /etc/motd echo "server.example.com" >> /etc/motd echo $PRETTY_NAME >> /etc/motd hostname -I >> /etc/motd echo >> /etc/motd echo "Managed by Administrator Name" >> /etc/motd echo "------------------------------------" >> /etc/motd
- Neues Service zu
systemd
hinzufügen
systemctl enable /usr/lib/systemd/system/after-local.service
- Service starten
systemctl start after-local.service
Systemd Unit für den geoserver
Folgende Systemd Unit sorgt für den Start des geoserver. Man kann diese Datei speichern, wo man will.
# /etc/geoserver.service [Unit] Description=GeoServer After=network.target [Service] User=geoserver Environment=JAVA_HOME=/usr/lib64/jvm/jre-1.7.0-openjdk Environment=GEOSERVER_HOME=/usr/share/geoserver ExecStart=/usr/share/geoserver/bin/startup.sh ExecStop=/usr/share/geoserver/shutdown.sh [Install] WantedBy=multi-user.target
Eine Systemd Unit für den Geoserver ist nur dann notwendig, wenn die bin.zip Variante installiert werden soll:
Will man den Geoserver unter Tomcat installieren, braucht man keine Systemd Unit:
Installation von geoserver
- Download
cd /tmp wget http://sourceforge.net/projects/geoserver/files/GeoServer/2.8.1/geoserver-2.8.1-bin.zip
- Entpacken
unzip -d geoserver geoserver-2.8.1-bin.zip
- Verschieben nach /usr/share
mv /tmp/geoserver /usr/share
- Environment Variable definieren und aktivieren
echo "export GEOSERVER_HOME=/usr/share/geoserver" >> ~/.profile source ~/.profile
- Einen Benutzer anlegen, unter dem der Server laufen soll
useradd -r geoserver
- Eigentumsrechte setzen
sudo chown -R geoserver /usr/share/geoserver/
- Info
http://docs.geoserver.org/stable/en/user/installation/linux.html
Logging über Systemd
Info
Konfiguration
- pico /etc/systemd/journald.conf
[Journal] Storage=persistent
Sonst gehen die Log-Einträge nach dem Reboot verloren.
systemctl restart systemd-journald
Anwendungsbeispiele
- Log für ein bestimmtes Service anzeigen
journalctl -u apache2 journalctl -u postfix ...
- Bootlog
journalctl -b
- Zeitintervalle
journalctl --since 10:00 --until 11:00 journalctl --since "today" --until "3:20"
Ab jetzt laufende Logs anzeigen
journalctl --since "now" -f
- Log auf STDOUT umleiten
Normalerweise werden die LOG-Einträge mit einem Pager angezeigt. Lange Zeilen sind dann eventuell nicht vollständig sichtbar.
journalctl --no-pager
Rotation steuern über Systemd
- Wechsel von cron zu systemd
Bisher wurde AFAIK die Rotation der LOG Dateien gesteuert über cron mit Hilfe eines Scriptes in /etc/cron.daily
. Nun soll dieser Dienst anscheinend von systemd übernommen werden.
- Hier ist der Timer konfiguriert:
/usr/lib/systemd/system/logrotate.timer
Bei openSuse 12.3 hat man den Timer zwar konfiguriert, aber anscheinend vergessen, ihn zu starten.
systemctl enable logrotate.timer systemctl start logrotate.timer