Linux.systemd: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Zeile 243: | Zeile 243: | ||
*** #include "systemd/sd-daemon.h" | *** #include "systemd/sd-daemon.h" | ||
*** sd_notify(0, "READY=1"); | *** sd_notify(0, "READY=1"); | ||
*** auto r = sd_notify(0, "READY=1\nSTATUS=Polyzalos woke up"); | |||
** Ich will einen ordentlichen cOrgaMon (Linux) haben der sich mit systemd unterhält | ** 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 | ** So soll er in einem ersten Step melden, sobald er die Konfiguration geladen hat |
Version vom 6. Dezember 2020, 14:55 Uhr
"systemd" (https://systemd.io/) 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, systemd bietet hier umfassende Hilfe.
Bedienung
- starten:
systemctl start <dienst>
- Info ob er läuft, und Diagsnose:
systemctl status <dienst>
- stoppen:
systemctl stop <dienst>
- Stop+Start:
systemctl restart <dienst>
- Autostart AN
systemctl enable <dienst>
- Autostart AUS
systemctl disable <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 [Install] WantedBy=remote-fs.target
# # /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
fb
# # /etc/systemd/system/fb.service # # (c) Andreas Filsinger, OrgaMon.org # [Unit] Description=route like a gateway Requires=network-online.target After=network-online.target [Service] WorkingDirectory=/root ExecStart=/root/fb.sh [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");
- auto r = sd_notify(0, "READY=1\nSTATUS=Polyzalos woke up");
- 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
program daemond; uses cthreads, BaseUnix, SomeOtherUnit; var bTerm: boolean; aTerm: pSigActionRec; aThread: TThreadDefinedInSomeOtherUnit; procedure ProcessSig(sig: longint); cdecl; begin bTerm := (bTerm) or (sig = SIGTERM); end; begin bTerm := False; New(aTerm); aTerm^.sa_handler := SigActionHandler(@ProcessSig); FillChar(aTerm^.sa_mask, SizeOf(aTerm^.sa_mask), #0); aTerm^.sa_flags := 0; {$IFDEF LINUX} aTerm^.sa_restorer := nil; {$ENDIF} fpSigAction(SIGTERM, aTerm, nil); if fpFork = 0 then begin Close(input); Close(output); Assign(output, '/dev/null'); ReWrite(output); Close(stderr); Assign(stderr, '/dev/null'); ReWrite(stderr); aThread := TThreadDefinedInSomeOtherUnit.Create; try repeat fpSleep(1); until bTerm; finally aThread.Terminate; aThread.WaitFor; aThread.Free; end; end; Dispose(aTerm); end.
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