Linux.systemd
"systemd" ist ein Linux-Programm das den ganzen Boot- und Start-Prozess des Linux-Betriebssystem durchführt. Wenn man Server-Dienste betreibt kommt man systemd in Berührung. Zu startende Dienste sind von anderen abhängig so dass dieser Boot-Prozess nicht ganz einfach ist.
Bedienung
- starten:
systemctl start <dienst>
- Info ob er läuft, und Diagsnose:
systemctl status <dienst>
- stoppen:
systemctl start <dienst>
- Stop+Start:
systemctl restart <dienst>
Dokumentation
- https://www.freedesktop.org/wiki/Software/systemd/
- http://0pointer.de/blog/projects/security.html
- http://fedoraproject.org/wiki/How_to_debug_Systemd_problems
- http://fedoraproject.org/wiki/Systemd
Aufgaben und Anwendungen
Login
- der "automatische Login" soll bei Servern selbstverständlich verhindert werden
- Q: How To Disable Auto Login?
- A: Yast - Security and Users - User/Group Management - Expert Options >Login Settings
- der resourcenfressende grafische Anmeldeschirm soll unterdrückt werden
systemctl set-default multi-user.target
Apache2 Webserver
systemctl enable apache2 systemctl start apache2
Mounten
- Mounts mit systemd sind eine echte Herausforderung, insbesondere weil sie bei booten schiefgehen
- Von Mounts sind oft andere Dienste abhängig, die sollten nicht starten, wenn verschiedene Mounts fehlen
- Es gibt im Moment (meiner Meinung nach) keine ordentliche Lösung
eines RAID Arrays
- verwende immer den "by-id", dieser Funktioniert auch auf einem neuen System, wenn du das RAID umziehen musst
# # srv-smb-ra6.mount # [Unit] Description=srv-smb-ra6 [Mount] What=/dev/disk/by-id/md-uuid-2ca7d214:9c6bfab4:b2ecf28b:72df44ca Where=/srv/smb/ra6 [Install] WantedBy=local-fs.target
# # /etc/systemd/system/srv-nas-user1.mount # [Unit] Description=srv-nas-user1 Requires=network-online.target After=network-online.target [Mount] What=//newyork/user1 Where=/srv/nas/user1 Type=cifs Options=guest
# # /etc/systemd/system/root-.wine-drive_w.mount # # Mount für den cOrgaMon Server # [Unit] Description=root-.wine-drive_w Requires=network-online.target smb.service After=network-online.target smb.service [Mount] What=//tokio.pcworld/app Where=/root/.wine/drive_w Type=cifs Options=guest
cOrgaMon
als XMLRPC-Server
# # /etc/systemd/system/cOrgaMon-XMLRPC@.service # # systemd Rulez for the cOrgaMon Service als XMLRPC # # (c) 2016 Andreas Filsinger # [Unit] Description=cOrgaMon-XMLRPC Server Requires=root-.wine-drive_h.mount multi-user.target After=root-.wine-drive_h.mount multi-user.target [Service] UMask=000 Environment="WINEDEBUG=-all" "LANG=de_DE.UTF-8" ExecStart=/usr/bin/wine "C:\\Program Files (x86)\\OrgaMon\\cOrgaMon.exe" "--Port=%i"
als App-Server
# # systemd Rulez for the cOrgaMon Service # # (c) 2016 Andreas Filsinger # [Unit] Description=cOrgaMon App-Server After=root-.wine-drive_w.mount Requires=root-.wine-drive_w.mount [Service] UMask=000 Environment="WINEDEBUG=-all" "LANG=de_DE.UTF-8" ExecStart=/usr/bin/wine "C:\\Program Files (x86)\\OrgaMon\\cOrgaMon.exe" "--app" "--Id=%i"
als Foto-Server
# # systemd Rulez for the cOrgaMon Service # # (c) 2016 Andreas Filsinger # [Unit] Description=cOrgaMon Foto-Server Requires=root-.wine-drive_w.mount After=root-.wine-drive_w.mount [Service] UMask=000 Environment="WINEDEBUG=-all" "LANG=de_DE.UTF-8" ExecStart=/usr/bin/wine "C:\\Program Files (x86)\\OrgaMon\\cOrgaMon.exe" "--foto" "--Id=%i"
aqbd
# # /etc/systemd/system/aqbd.service # # (c) Andreas Filsinger, OrgaMon.org # [Unit] Description=AqBanking Daemon After=multi-user.target [Service] StandardOutput=null StandardError=null ExecStartPre=/srv/aqb/aqbd.sh ExecStart=/srv/aqb/aqb -D [Install] WantedBy=multi-user.target
einzelne Festplatten in den Standby
# # (c) Andreas Filsinger, OrgaMon.org # # /etc/systemd/system/hdstandby@.service # [Unit] Description=Send "spare" Drives of an RAID-Array to standby After=multi-user.target [Service] Type=oneshot ExecStartPre=/bin/sleep 120 ExecStart=/sbin/hdparm -y /dev/disk/by-id/%i [Install] WantedBy=multi-user.target
# # "So" bekommst Du die Device Namen raus # l /dev/disk/by-id/ata*
# # "So" legst du Platten nach dem Start schlafen # systemctl enable hdstandby@ata-WDC_WD20PURX-64P6ZY0_WD-WCC4M0XEZ7CH
Diagnose
- sehr hilfreich ist die Grafik, die systemd erstellen kann.
- Es ist dann immer gut zu Erkennen, wenn Dienste nicht starten können weil Abhängigkeiten nicht funktionieren
systemd-analyze plot > /srv/www/web/systemd.svg
- journalctl --unit=sshd
Programmierung
- Ziele
- Ich will mit freepascal einen Header Haben mit libsystemd.so
- #include "systemd/sd-daemon.h"
- sd_notify(0, "READY=1");
- Ich will einen ordentlichen cOrgaMon (Linux) haben der sich mit systemd unterhält
- So soll er in einem ersten Step melden, sobald er die Konfiguration geladen hat
- In einem 2. Step soll er über einen Watchdog kontrolliert werden
- Ein weiter Schritt soll sein, dass das Logging über die Lib-Funktionen läuft
- Ein weiterer Schritt soll ein, dass der Dienst ordentlich auf einen Shut-Down reagiert
- Keine Annahme mehr von Aufgaben
- Kontrollierter Abbruch oder Beendigung von aktuellen Aufgaben
- Meldung an systemd wenn es save ist den PID zu killen oder freiwilliger exit
- Ich will mit freepascal einen Header Haben mit libsystemd.so
Alternativen
vor openSuSe 12.1
Nehmen wir an, Du hast ein Skript deindienst.sh das deinen Dienst startet, dies soll ab sofort auch nach einem Neustart des Server erfolgen. Das geht so:
- in /etc/init.d
cp skeleton deindienst ln -s deindienst /usr/sbin/rcdeindienst
- nun deinen Dienst anpassen
joe deindienst
# Provides: deindienst # Required-Start: $ALL
- den ganzen Vorcheck wegmachen
-- snip # Check for missing binaries (stale symlinks should not happen) # Note: Special treatment of stop for LSB conformance FOO_BIN=/usr/sbin/FOO test -x $FOO_BIN || { echo "$FOO_BIN not installed"; if [ "$1" = "stop" ]; then exit 0; else exit 5; fi; } # Check for existence of needed config file and read it FOO_CONFIG=/etc/sysconfig/FOO test -r $FOO_CONFIG || { echo "$FOO_CONFIG not existing"; if [ "$1" = "stop" ]; then exit 0; else exit 6; fi; } # Read config . $FOO_CONFIG -- snap --
- im Startbereich einfach Dein Skript eintragen
## Start daemon with startproc(8). If this fails ## the return value is set appropriately by startproc. /sbin/startproc /etc/deindienst.sh
- nun den Autostart sicherstellen
chkconfig --add deindienst
- willst du jetzt schon starten?
rcdeindienst start