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
eines RAID Arrays
# # srv-smb-ra6.mount # [Unit] Description=srv-smb-ra6 [Mount] What=/dev/md/Tokio:0 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
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
Programmierung
- Ziele
- Ich will mit freepascal einen Header Haben mit libsystemd.so
- 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
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