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
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:

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

  1. 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