Systemd

Aus Mediawiki Ferdinand Gruber
Zur Navigation springen Zur Suche springen


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
nano /etc/systemd/system/update-motd.service

mit folgendem Inhalt

[Unit]
Description=Generate /etc/motd on boot
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/update-motd.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
  • Skript anlegen
nano /usr/local/bin/update-motd.sh
chmod +x /usr/local/bin/update-motd.sh

mit folgendem Inhalt

#!/bin/bash
# Variablen generieren:
. /etc/os-release 
umask 0022
. /etc/os-release

# MOTD neu schreiben
{
  echo "My Server"
  echo "$PRETTY_NAME"
  hostname -I
  echo
  echo "Managed by <Name of the Owner>"
  echo "------------------------------"
} > /etc/motd

  • Unit aktivieren
systemctl daemon-reload
systemctl enable update-motd.service
systemctl start update-motd.service
  • Prüfen
cat /etc/motd

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:

http://docs.geoserver.org/stable/en/user/installation/index.html

Will man den Geoserver unter Tomcat installieren, braucht man keine Systemd Unit:

http://docs.geoserver.org/stable/en/user/installation/war.html

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

https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs

Konfiguration

# /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
journalctl --list-boots
journalctl -b -1
  • 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

Sonstiges

  • Umask ändern für den (KDE Plasma) Desktop
mkdir /etc/systemd/system/user@.service.d/
touch /etc/systemd/system/user@.service.d/override.conf

Folgendes in die Datei eingetragen:

[Service]
UMask=0002

Siehe folgende Anleitung