Systemd-Dienste in Fedora
Dieses Dokument beschreibt die Richtlinien für systemd-Dienste zur Verwendung und Einbindung in Fedora-Pakete.
Definitionen
Da systemd einige Konzepte beinhaltet, die Erweiterungen früherer Konzepte darstellen, könnten die folgenden Definitionen hilfreich sein:
- Dienst
-
Ein Prozess oder eine Aufgabe, die vom Init-System (z.B. systemd) ausgeführt und gesteuert wird.
- Traditioneller Dienst
-
Ein Dienst, der explizit gestartet oder gestoppt wird, entweder vom Init-System beim Systemstart oder manuell von einem Superuser. In systemd ist dies einer von mehreren Diensttypen, die über eine
.service-Datei gesteuert werden. - Aktivierter Dienst
-
Ein Dienst, der nicht (oder nicht unbedingt) explizit vom Benutzer gestartet wird, sondern startet, wenn bestimmte andere Ereignisse eintreten oder ein bestimmter Zustand eintritt.
- Socket-aktivierter Dienst
-
Ein Dienst, der auf Datenverkehr über einen Socket wartet, bevor er aktiviert wird. In systemd wird er durch eine
.socket-Datei gesteuert. - D-Bus-Dienst
-
Ein Dienst, der als Reaktion auf eine Meldung vom D-Bus-Systembus aktiviert wird.
- Unit-Datei
-
Das systemd-Äquivalent eines SysV-Init-Skripts.
Unit-Dateien
Jedes Paket, das Software enthält, die beim Systemstart einen traditionellen Dienst starten möchte/muss, MUSS eine systemd-Unit-Datei enthalten.
Idealerweise sind systemd-Unit-Dateien distributionsübergreifend wiederverwendbar und werden mit den Upstream-Paketen ausgeliefert. Bitte erwägen Sie, mit dem Upstream-Projekt zusammenzuarbeiten, um die von Ihnen erstellten systemd-Dateien in die Upstream-Quellen zu integrieren. Informationen für Entwickler zur optimalen Integration der systemd-Unterstützung in ihr Bausystem finden Sie in der Handbuchseite daemon(8).
Benennung
Unit-Dateien für traditionelle Dienste folgen dem Namensschema foobar.service. Bei der Wahl des Basisnamens ist zu beachten, dass wir für Software über verschiedene Distributionen hinweg einheitliche Dienstnamen verwenden möchten. Außerdem sollen die .service-Dateien in den Upstream-Paketen enthalten sein. Aus diesen Anforderungen ergeben sich folgende Richtlinien für die Benennung von Unit-Dateien:
-
Wenn bereits eine
.service-Datei verteilt wird, sollten Sie sich an die Vorgaben des Upstream-Projekts halten, da es unwahrscheinlich ist, dass es zu Konflikten mit anderen Paketen kommt. -
Schauen Sie sich Pakete in anderen Distributionen an oder sprechen Sie mit den Betreuern dieser Pakete und dem Upstream-Projekt, um einen gemeinsamen Namen zu finden.
-
Unit-Dateien sollten nach der von ihnen unterstützten Softwareimplementierung und nicht nach dem generischen Softwaretyp benannt werden. Ein guter Name wäre beispielsweise
apache-httpd.service, währendhttpd.serviceoderapache.serviceungeeignet wären, da es mehrere httpd-Implementierungen und zahlreiche Projekte der Apache Foundation gibt.
Aus Gründen der Abwärtskompatibilität empfiehlt es sich, einen symbolischen Link vom alten zum neuen Namen zu erstellen. Im obigen Beispiel hat Fedora beispielsweise immer httpd für den Dienst verwendet. Erstellen Sie beim Anlegen der neuen Datei apache-httpd.service auch einen symbolischen Link namens httpd.service, der auf apache-httpd.service verweist. So können Endbenutzer, die service httpd gewohnt sind, diesen weiterhin nutzen.
Grundlegendes Format
[Unit]
Jede .service-Datei muss mit einem [Unit]-Abschnitt beginnen:
[Unit] Description=A brief human readable string describing the service (not the .service file!) Documentation=man:foo.service(8) man:foo.conf(5) https://www.foo.org/docs/
Die Zeile Description= darf maximal 80 Zeichen lang sein und muss den Dienst beschreiben, nicht die Datei .service. Beispielsweise ist „Apache Webserver“ eine gute Beschreibung, „Startet und stoppt den Apache-Webserver“ hingegen nicht.
Documentation-Feld
Systemd unterstützt die Definition von Dokumentation in Unit-Dateien über das Feld Documentation=. Systemadministratoren prüfen den Inhalt des Feldes Documentation=, um den Dienst zu identifizieren, seine Konfiguration zu gewährleisten und weitere Dokumentationsquellen zu finden. Daher wird Paketentwicklern dringend empfohlen, alle verfügbaren Quellen mit diesen Informationen im Feld Documentation= anzugeben. Falls eine Manpage oder Infoseite im Paket vorhanden ist, verwenden Sie man:manpage bzw. info:infofile. Liegt die Dokumentation im Klartext vor, verwenden Sie file://pfad/zur/datei. Existiert keine lokale Dokumentation im Paket, sondern unter einer URL, tragen Sie die URL (mit https://) in dieses Feld ein. Mehrere URIs können als durch Leerzeichen getrennte Liste im Feld Documentation= hinzugefügt werden. Details zu URI-Definitionen und -Formatierung finden Sie in der Manpage uri(7) (man uri).
[Service]
Als Nächstes muss die .service-Datei einen Abschnitt [Service] enthalten:
[Service] Type=... ExecStart=... ExecReload=...
Die Einstellung Type= ist sehr wichtig. Für D-Bus-Dienste sollte sie dbus lauten, für herkömmliche Dienste ist forking in der Regel empfehlenswert, und für Dienste ohne Schnittstellen zu anderen Diensten ist simple optimal. Für einmalige Skripte ist oneshot ideal, oft in Kombination mit RemainAfterExit=. Weitere Informationen finden Sie in der Handbuchseite systemd.service(5). Da simple der Standardtyp ist, können .service-Dateien, die normalerweise Type=simple setzen würden, die Zeile Type einfach weglassen.
BusName= sollte für alle Dienste, die eine Verbindung zu D-Bus herstellen, gesetzt werden. Das heißt, es ist zwingend erforderlich für Dienste mit Type=dbus, kann aber auch in anderen Fällen sinnvoll sein. Lassen Sie diese Option weg, wenn Ihr Dienst keinen Namen im Bus verwendet.
ExecStart= ist für alle Dienste erforderlich. Diese Zeile definiert die Zeichenkette, die zum Starten des Daemons ausgeführt wird, zusammen mit allen erforderlichen Optionen.
ExecReload= sollte für alle Dienste angegeben werden, die ein Neuladen unterstützen. Es wird dringend empfohlen, hier Code einzufügen, der die Konfigurationsdatei synchron neu lädt (d.h. /bin/kill -HUP $MAINPID ist aufgrund seiner asynchronen Natur in der Regel ungeeignet). Lassen Sie diese Option weg, wenn Ihr Dienst kein Neuladen unterstützt.
[Install]
Schließlich sollte die Datei .service einen Abschnitt [Install] enthalten:
[Install] WantedBy=...
Die empfohlenen Parameter für WantedBy= sind entweder graphical.target (Dienste der grafischen Benutzeroberfläche) oder multi-user.target (alle anderen Dienste). Wenn der Benutzer (oder unsere Skripte) systemctl enable aufruft, wird der Dienst so konfiguriert, dass er in diesen Zielen startet.
Weitere Informationen zu diesen Optionen finden Sie in den Handbuchseiten systemd.unit(5) und systemd.service(5).
EnvironmentFiles und Unterstützung für /etc/sysconfig-Dateien
Die Zeile EnvironmentFiles= im Abschnitt [Service] von .service-Dateien dient zum Laden von Umgebungsvariablen, die in Unit-Dateien verwendet werden können. Wenn Ihr sysv-initscript beispielsweise eine Datei in /etc/sysconfig verwendet, um Befehlszeilenoptionen festzulegen, können Sie EnvironmentFiles= wie folgt verwenden:
Beispiel:
[Service] Type=forking EnvironmentFile=-/etc/sysconfig/httpd ExecStart=httpd $OPTIONS ExecReload=httpd $OPTIONS -k restart
Anschließend können Sie in den Zeilen ExecStart= (und den zugehörigen Zeilen) mit ${FOOBAR} und $FOOBAR auf Variablen verweisen, die in der Datei /etc/sysconfig/httpd festgelegt sind. (${FOOBAR} erweitert die Variable zu einem Wort, $FOOBAR hingegen teilt den Variablenwert an Leerzeichen in mehrere Wörter auf.)
Das - in der Zeile EnvironmentFile= stellt sicher, dass keine Fehlermeldungen generiert werden, falls die Umgebungsvariablen-Datei nicht existiert. Da viele dieser Dateien in sysvinit optional waren, sollten Sie das - bei Verwendung dieser Direktive angeben.
Zu vermeidende Felder
Für die meisten Dienste möchten wir keine Abhängigkeiten im Abschnitt [Unit] verwenden, wie z. B. Requires= oder Wants=. Stattdessen verwenden wir ausschließlich Reihenfolgeabhängigkeiten: Before= und After=. Dies dient der losen Kopplung: Wenn zwei Dienste gleichzeitig gestartet werden sollen, sorgt systemd für die korrekte Startreihenfolge, ohne dass der Start eines Dienstes zwingend erforderlich ist, wenn der andere gestartet wird.
Wenn Sie eine Anforderungsabhängigkeit verwenden, nutzen Sie Wants= anstelle von Requires=, um die Stabilität zu erhöhen. In fast allen Fällen sollten Sie bei der Verwendung einer Anforderungsabhängigkeit auch eine Reihenfolgeabhängigkeit hinzufügen, da Reihenfolge- und Anforderungsabhängigkeiten in systemd orthogonal sind.
Hier ein Beispiel für diesen häufigen Fall:
-
Eine Web-Anwendung benötigt postgresql zum Speichern ihrer Daten.
-
Es ist so konfiguriert, dass es erst nach dem Start von postgresql startet (
After). Beim Startvorgang wird die Webanwendung erst gestartet, nachdem postgresql geladen ist. -
Nach dem Start muss der Systemadministrator postgresql aufgrund einer Konfigurationsänderung neu starten.
-
Da nur
Afterverwendet wurde, kann es vorübergehend vorkommen, dass die Webanwendung einige Anfragen nicht bedienen kann. Sie muss jedoch nicht neu gestartet werden, um nach der Wiederherstellung der Datenbank wieder Seiten bereitzustellen.
Vermeiden Sie es, in allen Zeilen, die Unit-Namen verwenden (wie z.B. +WantedBy), auf +runlevel.target-Units zu verweisen. Dies sind veraltete Namen, die nur wegen der Kompatibilität zu SysV existieren.
Vermeiden Sie Names= (im Abschnitt [Unit]). Es ist in der Regel besser, einen zusätzlichen Namen im Dateisystem zu verlinken. Beachten Sie, dass ein in Names= aufgeführter Name nur dann sinnvoll ist, wenn bereits eine Dienstdatei geladen wurde. Systemd lädt jedoch nur die Dienstdateien, auf die in einem anderen geladenen Dienst verwiesen wird, und verwendet die Dateinamen bei der Suche. Daher ist ein Name in Names= als Suchschlüssel nicht geeignet, ein symbolischer Link im Dateisystem hingegen schon. Fügen Sie außerdem keine (redundante) Zeile Names=foobar.service in eine Datei namens foobar.service ein. Wir möchten unsere Dienstdateien kurz halten.
Unit-Dateien sollten die Verwendung von StandardOutput= oder StandardError= vermeiden. Die Standardeinstellung ist in fast allen Fällen die richtige Wahl, und die Verwendung der Standardeinstellung ermöglicht es Benutzern, globale Standardeinstellungen in /etc/systemd/system.conf zu ändern.
Aktivierung
Systemd erlaubt die folgenden Formen der Aktivierung von Diensten: Hardware-Aktivierung, Socket-Aktivierung, Timer-Aktivierung und DBus-Aktivierung.
Hardware-Aktivierung
Die Hardwareaktivierung erfolgt bei der Installation eines Dienstes, der jedoch nur bei Installation bestimmter Hardware aktiv wird. Die Aktivierung des Dienstes erfolgt üblicherweise über eine udev-Regel. Derzeit liegen uns keine weiteren Hinweise zur Erstellung dieser udev-Regeln vor. Der Dienst selbst installiert seine .service-Dateien an den üblichen Speicherorten und wird wie gewohnt über die systemd-Scriptlets installiert. Diese Dienste sollten niemals über das Paket aktiviert werden, da dies automatisch durch udev erfolgt.
Socket-Aktivierung
Die Socket-Aktivierung erfolgt, wenn ein Dienst systemd anweist, Verbindungen zu einem bestimmten Socket zu überwachen. Sobald systemd eine Verbindung über diesen Socket empfängt, startet es den Dienst. Dazu sind geringfügige Anpassungen im Quellcode erforderlich, um systemd das Überwachen von Verbindungen über den Socket zu ermöglichen. Außerdem muss sich im Verzeichnis %{_lib}/systemd/system/ eine Datei .socket befinden, die systemd anweist, den Socket zu überwachen und den zu startenden Dienst beim Empfang einer Verbindung festzulegen. Dies ähnelt der Funktionsweise von inetd, und einige, aber nicht alle Dienste, die für die Verwendung mit inetd entwickelt wurden, sind auch zur Socket-Aktivierung kompatibel.
Die Socket-Aktivierung ermöglicht auch den parallelen Start von Diensten. Unterstützt ein Dienst die Socket-Aktivierung von systemd (wie oben beschrieben) und wird er zusätzlich explizit beim Systemstart gestartet, startet systemd ihn und ermöglicht gleichzeitig den Start abhängiger Dienste. Sendet ein abhängiger Dienst eine Anfrage an den Socket-aktivierbaren Dienst, bevor dieser gestartet ist, sorgt systemd dafür, dass die Anfrage wartet, bis der Socket-aktivierbare Dienst gestartet ist und die Anfrage bearbeiten kann. Damit dies funktioniert, muss der Dienst wie oben beschrieben Socket-aktivierbar sein, die Datei .service des Dienstes muss eine Zeile Wants= für die Datei .socket enthalten, und der Dienst muss automatisch starten.
Beachten Sie, dass bestimmte Socket-basierte Dienste (insbesondere solche, die über das Netzwerk lauschen) die Genehmigung von FESCo benötigen – siehe Standarddienste für Details. Sobald Sie die Genehmigung haben, können Sie die Datei .socket paketieren und die systemd-Skripte verwenden, die den Dienst standardmäßig aktivieren. Überprüfen Sie außerdem die Datei .service, um sicherzustellen, dass sie einen Eintrag Wants= für die Datei .socket enthält. Dadurch wird sichergestellt, dass systemd beim Starten des Dienstes über den Socket informiert wird.
Timer-Aktivierung
Alle Pakete mit zeitgesteuerter Ausführung, die bereits von systemd abhängen (zum Beispiel, weil sie systemd-Units enthalten), müssen Timer-Units anstelle von Cron-Jobs verwenden, ohne Abhängigkeiten oder Anforderungen an eine Crontab.
Pakete, die nicht bereits von systemd abhängen oder dieses benötigen, dürfen keine Timer-Units verwenden, sondern müssen von Crontabs abhängen und diese benötigen, um die Einführung unnötiger neuer Abhängigkeiten von systemd direkt zu vermeiden.
DBus-Aktivierung
Um den parallelen Start eines D-Bus-Dienstes und seiner Nutzer zu ermöglichen, ist es unerlässlich, dass D-Bus-Dienste über den Bus aktiviert werden können und die Aktivierungsanforderung vom D-Bus-Systembus an systemd weitergeleitet wird. Dadurch wird sichergestellt, dass nur eine einzige Instanz des Dienstes existiert, selbst wenn dieser sowohl beim Systemstart als auch bei der Aktivierung ausgelöst wird. Falls Ihr D-Bus-Dienst bisher nicht über den Bus aktiviert, sondern über ein SysV-Init-Skript gestartet wurde, sollte er auf Busaktivierung umgestellt werden. Dies kann durch das Erstellen einer .service-Datei für D-Bus im Verzeichnis /usr/share/dbus-1/system-services/ und die Verwendung der Direktive SystemdService= in dieser Datei implementiert werden, um die Aktivierung an systemd umzuleiten.
Hier ist ein Beispiel für einen D-Bus-Bus-aktivierbaren Dienst. Die ConsoleKit-Bus-Aktivierungsdatei /usr/share/dbus-1/system-services/org.freedesktop.ConsoleKit.service:
[D-BUS Service] Name=org.freedesktop.ConsoleKit Exec=console-kit-daemon --no-daemon User=root SystemdService=console-kit-daemon.service
Und die zugehörige systemd-Unit-Datei /usr/lib/systemd/system/console-kit-daemon.service:
[Unit] Description=Console Manager [Service] Type=dbus BusName=org.freedesktop.ConsoleKit ExecStart=console-kit-daemon --no-daemon
Wie Sie sehen können, wird SystemdService= in der D-Bus-Aktivierungsdatei verwendet, um den systemd-Dienst an den D-Bus-Dienst zu binden.
Traditionell konnten D-Bus-aktivierte Dienste nur durch vollständige Deinstallation deaktiviert werden. Mit systemd lassen sich Dienste deaktivieren, indem D-Bus einen systemd-Aliasdienstnamen (der zum Aktivieren/Deaktivieren erstellt oder entfernt werden kann) als Zwischeninstanz für den eigentlichen Dienst aufruft.
Sie können die Deaktivierung einfach implementieren, indem Sie den D-Bus-Dienst auf einen Aliasnamen der eigentlichen Dienstdatei verweisen (im Dateisystem erscheint dies als symbolischer Link in /etc/systemd/system). Dieser Alias wird dann über systemctl enable und systemctl disable gesteuert. Es empfiehlt sich (technisch nicht zwingend erforderlich), diesen Aliasnamen nach dem D-Bus-Busnamen des Dienstes zu benennen und dbus- voranzustellen. Beispiel für Avahi, einen Dienst, den der Administrator möglicherweise deaktivieren muss: Ersetzen Sie SystemdService=avahi-daemon.service in der D-Bus-Aktivierungsdatei durch SystemdService=dbus-org.freedesktop.Avahi.service und definieren Sie dbus-org.freedesktop.Avahi.service anschließend als optionalen Alias für avahi-daemon.service. Dieser Alias kann über die Direktive Alias= im Abschnitt [Install] der systemd-Dienstdatei gesteuert werden. systemctl enable und systemctl disable lesen diese Direktive, um einen symbolischen Link zu erstellen bzw. zu entfernen und den Dienst unter diesem zusätzlichen Namen verfügbar bzw. nicht verfügbar zu machen. Ein vollständiges Beispiel für Avahi:
Hier ist die D-Bus .service-Datei für Avahi (/usr/share/dbus-1/system-services/org.freedesktop.Avahi.service):
[D-BUS Service] Name=org.freedesktop.Avahi SystemdService=dbus-org.freedesktop.Avahi.service # This service should not be bus activated if systemd isn't running, # so that activation won't conflict with the init script startup. Exec=false
Hier ist die Avahi-Systemd-Unit-Datei .service (/usr/lib/systemd/system/avahi-daemon.service):
[Unit] Description=Avahi mDNS/DNS-SD Stack Requires=avahi-daemon.socket [Service] Type=dbus BusName=org.freedesktop.Avahi ExecStart=avahi-daemon -s ExecReload=avahi-daemon -r NotifyAccess=main [Install] WantedBy=multi-user.target Also=avahi-daemon.socket Alias=dbus-org.freedesktop.Avahi.service
Die Zeile Alias= stellt sicher, dass die Existenz des Symlinks /etc/systemd/system/dbus-org.freedesktop.Avahi.service durch systemctl enable und systemctl disable gesteuert werden kann.
Beachten Sie, dass das Erstellen/Entfernen von Alias-Symlinks ausschließlich mit systemctl enable und systemctl disable erfolgen sollte. Sie sollten diese Symlinks nicht manuell erstellen.
Generell empfiehlt es sich, für alle bereits busaktivierbaren Dienste native systemd-Units bereitzustellen, damit diese Dienste wie jeder andere Dienst zentral mit Werkzeugen wie systemctl gesteuert und überwacht werden können. Eine ähnliche Logik wie oben beschrieben sollte gelten.
Weitere Informationen zur Busaktivierung finden Sie in der D-Bus-Dokumentation: https://dbus.freedesktop.org/doc/dbus-specification.html#message-bus-starting-services
Automatischer Neustart
Wenn Sie einen Dienst mit langer Laufzeit bereitstellen, aktivieren Sie bitte die automatische Neustartfunktion von systemd, um die Zuverlässigkeit zu verbessern, indem sichergestellt wird, dass das System automatisch versucht, einen ausgefallenen Daemon wiederherzustellen. Bitte verwenden Sie dafür
[Service] ... Restart=on-failure
oder
[Service] ... Restart=on-abnormal
in der .service-Datei Ihrer Unit.
Die erste Option weist systemd an, den Daemon bei jedem Fehler unabhängig von der genauen Ursache neu zu starten. Dies ist für die meisten langlaufenden Dienste eine gute Wahl. Einige Daemons benötigen jedoch eine Möglichkeit, ständige Neustarts zu vermeiden, indem sie mit einem Exit-Code ungleich null beendet werden. Verwenden Sie für diese Dienste Restart=on-abnormal. Dadurch wird der Daemon bei einem „abnormalen“ Fehler – beispielsweise durch ein fehlerhaftes Signal, einen Core-Dump, ein Timeout oder einen Watchdog-Beendigungsfehler – neu gestartet, jedoch nicht bei fehlerhaften Exit-Codes. Es wird empfohlen, automatische Neustarts für alle langlaufenden Dienste zu aktivieren. Welche Einstellung die richtige ist und ob sie überhaupt sinnvoll ist, hängt jedoch vom jeweiligen Dienst ab. Weitere Informationen zu den verschiedenen Einstellungen finden Sie in der Handbuchseite systemd.service(5).
Private Geräte und Netzwerk
Wenn Sie einen Systemdienst mit langer Laufzeit paketieren, sollten Sie erwägen, die systemd-Einstellungen PrivateDevices= und PrivateNetwork= dafür zu aktivieren, um die Sicherheit zu verbessern und die Angriffsfläche zu minimieren.
Wenn PrivateDevices=yes im Abschnitt [Service] einer systemd-Dienst-Unit-Datei gesetzt ist, laufen die Prozesse des Dienstes in einem privaten Dateisystem-Namensraum. Dort wird /dev durch eine Minimalversion ersetzt, die nur die Geräteknoten /dev/null, /dev/zero, /dev/full, /dev/urandom, /dev/random und /dev/tty sowie die Unterverzeichnisse /dev/shm, /dev/pts, /dev/mqueue und /dev/hugepages und die symbolischen Links /dev/stdout, /dev/stderr und /dev/stdin enthält. Geräteknoten für physische Geräte werden jedoch nicht berücksichtigt. Des Weiteren wird die CAP_MKNOD-Capability entfernt. Schließlich wird der devices-Cgroup-Controller verwendet, um sicherzustellen, dass nur auf die aufgelisteten Geräteknoten zugegriffen werden kann. Dies ist eine effiziente Methode, um den physischen Gerätezugriff für Dienste zu unterbinden und somit die Angriffsfläche zu minimieren.
Wenn PrivateNetwork=yes im Abschnitt [Service] einer systemd-Dienst-Unit-Datei gesetzt ist, laufen die Prozesse des Dienstes in einem privaten Netzwerk-Namensraum mit einer privaten Loopback-Schnittstelle und ohne Zugriff auf andere Netzwerkgeräte. Die Netzwerkkommunikation zwischen Host und Dienst kann nicht initiiert werden. Dies ist eine effiziente Methode, um Diensten den Netzwerkzugriff zu entziehen und somit die Angriffsfläche zu minimieren.
Standardmäßig sind beide Schalter auf no eingestellt.
Beachten Sie, dass PrivateDevices=yes nicht für Folgendes verwendet werden sollte:
-
Dienste, die tatsächlich physischen Gerätezugriff benötigen
-
Dienste, die zur Ausführung beliebiger, von Benutzern oder Administratoren bereitgestellter Programme (wie z.B. Cronjobs usw.) verwendet werden können. Wir sollten die Nutzungsmöglichkeiten dieser Dienste nicht einschränken.
-
Diese Option erstellt einen neuen Dateisystem-Namensraum, in dem die Weitergabe von Einhänge-/Aushänge-Aktionen an den Host deaktiviert ist. Das bedeutet, dass die vom Dienst erstellten Einhängungen dienstintern bleiben. Daher sollte diese Option nicht von Diensten verwendet werden, die in der Lage sein sollen, Einhängungen auf dem Host zu erstellen.
Beachten Sie, dass PrivateNetwork=yes nicht für Folgendes verwendet werden sollte:
-
Dienste, die tatsächlich Netzwerkzugriff benötigen (mit Ausnahme von Daemons, die lediglich eine Socket-Aktivierung erfordern)
-
Dienste, die zur Ausführung beliebiger, vom Benutzer oder Administrator bereitgestellter Programme verwendet werden können. (siehe oben)
-
Dienste, die möglicherweise Nicht-Systembenutzer- und Gruppennamen auflösen müssen. Da in manchen Konfigurationen die Auflösung von Nicht-Systembenutzern Netzwerkzugriff auf einen LDAP- oder NIS-Server erfordert, kann die Aktivierung dieser Option die Auflösung dieser Benutzernamen beeinträchtigen. Beachten Sie jedoch, dass Systembenutzer und -gruppen auch ohne Netzwerkzugriff immer auflösbar sind. Daher können Sie diese Option bedenkenlos für Daemons aktivieren, die lediglich ihren eigenen Systembenutzer- oder -gruppennamen auflösen müssen.
-
Dadurch wird auch der abstrakte AF_UNIX-Namensraum vom Host getrennt (Falls Sie sich fragen, was das bedeutet: Sockets, die in
/proc/net/unixaufgeführt sind und mit@beginnen, befinden sich im abstrakten Namensraum; solche, die mit/beginnen, befinden sich im Dateisystem-Namensraum). Dies kann dazu führen, dass Dienste, die AF_UNIX-Sockets in den abstrakten Namensräumen überwachen oder sich mit ihnen verbinden, nicht mehr funktionieren. AF_UNIX-Sockets im Dateisystem funktionieren auch mitPrivateNetwork?=yesweiterhin korrekt. Wir empfehlen dringend, die Verwendung von AF_UNIX-Sockets im abstrakten Namensraum einzustellen, da sie heutzutage kaum noch Vorteile bieten. Falls Ihr Paket diese verwendet, verschieben Sie sie bitte in ein Unterverzeichnis im Dateisystem:/run(Systemdienste) oder$XDG_RUNTIME_DIR(Benutzerdienste). -
Dadurch werden auch die Socket-Familien AF_NETLINK und AF_AUDIT vom Host getrennt. Für Dienste, die eine Überwachung benötigen, Netzwerkkonfigurationsänderungen verfolgen müssen oder die das Ein- und Aussteigen von Hardwaregeräten (udev) überwachen möchten, kann
PrivateNetwork?=yesdaher nicht verwendet werden.
Weitere Einzelheiten finden Sie in der Handbuchseite systemd.exec(5).
Paketierung
Orte im Dateisystem
Systemd-Unit-Dateien müssen entweder in %{_unitdir} oder %{_userunitdir} abgelegt werden, für Systemdienste bzw. Benutzersitzungsdienste. Unit-Drop-ins müssen in den entsprechenden Unterverzeichnissen dieser beiden Verzeichnisse abgelegt werden. Unit-Dateien und Drop-ins müssen für alle Benutzer lesbar sein (d.h. Modus 0644) und dürfen nicht als %config oder %config(noreplace) markiert sein.
Die Makros %{_unitdir} und %{_userunitdir} sind im Paket systemd-rpm-macros definiert, daher ist etwa Folgendes erforderlich, damit sie verfügbar sind:
BuildRequires: systemd-rpm-macros
Unit-Dateien in Spec-Datei-Scriptlets
Informationen zur korrekten Handhabung von Unit-Dateien in Spec-Datei-Scriptlets finden Sie hier.
Tmpfiles.d
tmpfiles.d ist ein von systemd bereitgestellter Dienst zur Verwaltung temporärer Dateien und Verzeichnisse für Daemons. Weitere Informationen zur Verwendung von Tmpfiles.d in Fedora-Paketen finden Sie unter: Tmpfiles.d.
Warum …
-
… starten wir den Dienst nicht nach der Installation?
Installationen können in Chroot-Umgebungen, im Kontext eines Installationsprogramms oder in anderen Situationen erfolgen, in denen die Dienste nicht automatisch gestartet werden sollen.
Want to help? Learn how to contribute to Fedora Docs ›