table of contents
- BEZEICHNUNG
- ÜBERSICHT
- BESCHREIBUNG
- IMPLIZITE ABHÄNGIGKEITEN
- PFADE
- ZUGANGSDATEN
- CAPABILITIES
- SICHERHEIT
- MANDATORY ACCESS CONTROL
- PROZESSEIGENSCHAFTEN
- SCHEDULING
- SANDBOXING
- SYSTEMAUFRUFFILTERUNG
- UMGEBUNGSVARIABLEN
- PROTOKOLLIERUNG UND SYSTEM-EIN-/-AUSGABE
- SYSTEM V-KOMPATIBILITÄT
- UMGEBUNGSVARIABLEN IN ERZEUGTEN PROZESSEN
- PROZESS-EXIT-CODES
- SIEHE AUCH
- ANMERKUNGEN
- ÜBERSETZUNG
- buster 2.12-1
- buster-backports 4.10.0-1~bpo10+1
- testing 4.10.0-1
- unstable 4.10.0-1
SYSTEMD.EXEC(5) | systemd.exec | SYSTEMD.EXEC(5) |
BEZEICHNUNG¶
systemd.exec - Konfiguration der AusführungsumgebungÜBERSICHT¶
Dienst.service, Socket.socket, Einhängung.mount, Swap.swapBESCHREIBUNG¶
Unit-Konfigurationsdateien für Dienste, Sockets, Einhängepunkte und Auslagerungsgeräte nutzen eine Teilmenge der Konfigurationsoptionen, die die Ausführungsumgebung von gestarteten Prozessen definieren.Diese Handbuchseite listet die Konfigurationsoptionen auf, die von diesen vier Unit-Typen gemeinsam benutzt werden. Siehe systemd.unit(5) für die Konfiguration der von allen Unit-Typen gemeinsam benutzten Optionen und systemd.service(5), systemd.socket(5), systemd.swap(5) und systemd.mount(5) für weitere Informationen über die Konfigurationsdateioptionen, die für jeden Unit-Typen spezifisch sind. Die ausführungsspezifischen Konfigurationsoptionen werden in den Abschnitten [Service], [Socket], [Mount] oder [Swap] konfiguriert, abhängig vom Unit-Typ
Zusätzlich werden Optionen, die verfügbare Ressourcen mittels Linux Control Groups (cgroups) steuern, in systemd.resource-control(5) aufgeführt. Diese Optionen ergänzen die hier aufgeführten Optionen.
IMPLIZITE ABHÄNGIGKEITEN¶
Ein paar Ausführungsparameter führen zur Ergänzung von zusätzlichen, automatischen Abhängigkeiten:PFADE¶
Die folgenden Einstellungen können zur Änderungen der Sicht eines Dienstes auf das Dateisystem verwandt werden. Bitte beachten Sie, dass die Pfade absolut sein müssen und keine »..«-Pfadkomponente enthalten dürfen.WorkingDirectory=
RootDirectory=
Die Einstellungen MountAPIVFS= und PrivateUsers= sind inbesondere in Zusammenhang mit RootDirectory= nützlich. Für Details siehe unten.
RootImage=
Wenn DevicePolicy= auf »closed« oder »strict« gesetzt ist oder auf »auto« und DeviceAllow= gesetzt ist, dann fügt diese Einstellung /dev/loop-control mit Modus rw, »block-loop« und »block-blkext« mit Modus rwm zu DeviceAllow= hinzu. Siehe systemd.resource-control(5) für die Details über DevicePolicy= oder DeviceAllow=. Siehe auch nachfolgendes PrivateDevices=, da sie die Einstellungen von DevicePolicy= ändern könnte.
MountAPIVFS=
BindPaths=, BindReadOnlyPaths=
BindPaths= erstellt reguläre, schreibbare Bind-Einhängungen (außer die Quelldateisystemeinhängung ist bereits nur-lesbar markiert), während BindReadOnlyPaths= nur-lesbare Bind-Einhängungen erstellt. Diese Einstellungen können mehr als einmal verwandt werden, jede Verwendung hängt sich an die Liste der Bind-Einhängungen der Unit an. Falls zu einer dieser zwei Optionen die leere Zeichenkette zugewiesen wird, wird die gesamte Liste an vorher definierten Bind-Einhängungen dazu zurückgesetzt. Beachten Sie, dass in diesem Fall sowohl die nur-lesbaren als auch die regulären Bind-Einhängungen zurückgesetzt werden, unabhängig davon, welche der zwei Einhängungen verwandt wird.
Diese Option ist besonders nützlich, wenn RootDirectory=/RootImage= verwandt wird. In diesem Fall bezieht sich der Quellpfad auf einen Pfad im Dateisystem des Rechners, während der Zielpfad sich auf einen Pfad unterhalb des Wurzelverzeichnisses der Unit bezieht.
ZUGANGSDATEN¶
User=, Group=Beachten Sie, dass Einschränkungen bei der Namenssyntax der Benutzer/Gruppen erzwungen werden: der festgelegte Name darf nur aus den Zeichen a-z, A-Z, 0-9, »_« und »-« (außer beim ersten Zeichen, das eines aus a-z, A-Z oder »_« sein muss, d.h. Zahlen und »-« sind nicht als erstes Zeichen erlaubt) bestehen. Der Benutzer-/Gruppenname muss mindestens ein und maximal 31 Zeichen enthalten. Diese Einschränkungen werden erzwungen, um Mehrdeutigkeiten zu vermeiden und um sicherzustellen, dass Benutzer-/Gruppennamen und Unit-Dateien zwischen Linux-Systemen portierbar bleiben.
Wenn dies zusammen mit DynamicUser= verwandt wird, wird der festgelegte Benutzer-/Gruppename dynamisch zum Startzeitpunkt des Dienstes zugewiesen und beim Beenden des Dienstes wieder freigegeben — außer er ist bereits statisch zugewiesen (siehe unten). Falls DynamicUser= nicht verwandt wird, muss der festgelegte Benutzer und die festgelegte Gruppe spätestens beim Startmoment des Dienstes statisch in der Benutzerdatenbank erzeugt worden sein, beispielsweise mit der Einrichtung sysusers.d(5), die beim Systemstart oder zum Zeitpunkt der Paketinstallation angewandt wird.
DynamicUser=
SupplementaryGroups=
PAMName=
Beachten Sie, dass für jede Unit, die diese Option einsetzt, ein PAM-Sitzungshandhabungsprozess als Teil der Unit verwaltet und aktiv gehalten wird, solange die Unit aktiv ist, um sicherzustellen, dass geeignete Aktionen unternommen werden können, wenn die Unit und damit die PAM-Sitzung beendet wird. Dieser Prozess heißt »(sd-pam)« und ist ein direkter Kindprozess des Hauptprozesses der Unit.
Beachten Sie, dass es sehr wahrscheinlich ist (abhängig von der PAM-Konfiguration), dass der Haupt-Unit-Prozess in seine eigene Sitzungsgeltungsbereich-Unit migriert wird, wenn diese Option für eine Unit verwandt und sie aktiviert wird. Dieser Prozess wird daher zwei Units zugeordnet sein: der Unit, in der er ursprünglich gestartet wurde (und für die PAMName= konfiguriert wurde) und der Sitzungsgeltungsbereichs-Unit. Jeder Kindprozess dieses Prozesses wird allerdings nur der Sitzungsgeltungsbereichs-Unit zugeordnet sein. Dies hat Auswirkungen, wenn das in Kombination mit NotifyAccess=all verwandt wird, da diese Kindprozesse nicht in der Lage sein werden, Änderungen an der usprünglichen Unit über Benachrichtigungsmeldungen zu erreichen. Es wird angenommen, dass diese Nachrichten zu der Sitzungsgeltungsbereichs-Unit und nicht der ursprünglichen Unit gehören. Es wird daher nicht empfohlen, PAMName= in Kombination mit NotifyAccess=all zu verwenden.
CAPABILITIES¶
CapabilityBoundingSet=Beispiel: Falls eine Unit die Einstellunng
CapabilityBoundingSet=CAP_A CAP_B CapabilityBoundingSet=CAP_B CAP_C
hat, dann werden CAP_A, CAP_B und CAP_C gesetzt. Falls der zweiten Zeile »~« vorangestellt wird, d.h.
CapabilityBoundingSet=CAP_A CAP_B CapabilityBoundingSet=~CAP_B CAP_C
dann wird nur CAP_A gesetzt.
AmbientCapabilities=
Umgebungs-Capabilitymengen sind nützlich, falls Sie einen Prozess als nicht privilegierten Benutzer ausführen wollen, ihm aber dennoch einige Capabilities geben möchten. Beachten Sie, dass in diesem Fall die Option keep-caps automatisch zu SecureBits= hinzugefügt ist, um die Capabilities über den Benutzerwechsel hinweg zu erhalten. AmbientCapabilities= betrifft keine Befehle, denen »+« vorangestellt ist.
SICHERHEIT¶
NoNewPrivileges=SecureBits=
MANDATORY ACCESS CONTROL¶
SELinuxContext=AppArmorProfile=
SmackProcessLabel=
Diesem Wert kann »-« vorangestellt werden, wodurch alle Fehler ignoriert werden. Ein leerer Wert kann festgelegt werden, um alle vorhergehenden Zuweisungen zurückzusetzen. Dies betrifft nicht Befehle, denen »+« vorangestellt ist.
PROZESSEIGENSCHAFTEN¶
LimitCPU=, LimitFSIZE=, LimitDATA=, LimitSTACK=, LimitCORE=, LimitRSS=, LimitNOFILE=, LimitAS=, LimitNPROC=, LimitMEMLOCK=, LimitLOCKS=, LimitSIGPENDING=, LimitMSGQUEUE=, LimitNICE=, LimitRTPRIO=, LimitRTTIME=Beachten Sie, dass die meisten der mit diesen Optionen konfigurierten Ressourcenbeschränkungen prozessbezogen sind und dass Prozesse einen Fork durchführen können, um einen neuen Satz an Ressourcen zu erlangen, die unabhängig vom ursprünglichen Prozess verbucht werden und daher gesetzten Beschränkungen entkommen können. Beachten Sie auch, dass LimitRSS= unter Linux nicht implementiert ist und das Setzen keinen Effekt hat. Oft ist es ratsam, die in systemd.resource-control(5) aufgeführten Ressourcensteuerungen gegenüber den prozessabhängigen zu bevorzugen, da sie auf Dienste als ganzes angewandt, zur Laufzeit verändert werden und im Allgemeinen ausdrucksstärker sind. Beispielsweise ist MemoryLimit= ein leistungsfähigerer (und funktionierender) Ersatz für LimitRSS=.
Für System-Units können diese Ressourcenbeschränkungen frei ausgewählt werden. Für Benutzer-Units (d.h. Units, die als benutzerbezogene Instanz von systemd(1) ausgeführt werden) wird allerdings eine Begrenzungen durch (möglicherweise weiter eingeschränkte) benutzerbezogene Einschränkungen durch das Betriebssystem erzwungen.
Nicht explizit konfigurierte Ressourcenbeschränkungen für eine Unit verwenden als Vorgabe die in den verschiedenen in systemd-system.conf(5) verfügbare Optionen DefaultLimitCPU=, DefaultLimitFSIZE=, … konfigurierten Werte und – falls sie dort nicht konfiguriert sind – die Kernel- oder benutzerbezogenen Vorgaben, wie sie durch das Betriebssystem (letzteres nur für Benutzerdienste, siehe oben) definiert sind.
Tabelle 1. Ressourcenbegrenzungsanweisungen, ihre
äquivalenten
Ulimit-Shell-Befehle und die verwandte Einheit
Anweisung | ulimit-Äquivalent | Einheit |
LimitCPU= | ulimit -t | Sekunden |
LimitFSIZE= | ulimit -f | Bytes |
LimitDATA= | ulimit -d | Bytes |
LimitSTACK= | ulimit -s | Bytes |
LimitCORE= | ulimit -c | Bytes |
LimitRSS= | ulimit -m | Bytes |
LimitNOFILE= | ulimit -n | Anzahl an Dateideskriptoren |
LimitAS= | ulimit -v | Bytes |
LimitNPROC= | ulimit -u | Anzahl an Prozessen |
LimitMEMLOCK= | ulimit -l | Bytes |
LimitLOCKS= | ulimit -x | Anzahl an Sperren |
LimitSIGPENDING= | ulimit -i | Anzahl von Signalen in der Warteschlange |
LimitMSGQUEUE= | ulimit -q | Bytes |
LimitNICE= | ulimit -e | Nice-Stufe |
LimitRTPRIO= | ulimit -r | Echtzeitpriorität |
LimitRTTIME= | Kein Äquivalent | Mikrosekunden |
UMask=
KeyringMode=
OOMScoreAdjust=
TimerSlackNSec=
Personality=
IgnoreSIGPIPE=
SCHEDULING¶
Nice=CPUSchedulingPolicy=
CPUSchedulingPriority=
CPUSchedulingResetOnFork=
CPUAffinity=
IOSchedulingClass=
IOSchedulingPriority=
SANDBOXING¶
Die nachfolgenden Sandboxing-Optionen bieten eine wirksame Art, die Kontakte des System im Hinblick auf die Prozesse der Unit zu begrenzen. Es wird empfohlen, so viele dieser Optionen wie möglich, ohne die Betriebsfähigkeit der Prozesse der Unit negativ zu betreffen, einzuschalten. Beachten Sie, dass viele dieser Sandboxing-Funktionalitäten beschwerdefrei auf Systemen, auf denen der unterliegende Sicherheitsmechanismus nicht verfügbar ist, ausgeschaltet werden. Beispielsweise hat ProtectSystem= keine Wirkung, falls der Kernel ohne Namensräume für Dateisysteme gebaut wurde oder falls der Diensteverwalter in einem Container-Verwalter ausgeführt wird, der dafür sorgt, dass Dateisystem-Namensräume für seine Nutzlast nicht verfügbar sind. Ähnlich hat RestrictRealtime= auf Systemen keine Wirkung, denen die Unterstützung für SECCOMP-Systemaufruffilterung fehlt oder in Containern, in denen die Unterstützung dafür abgeschaltet ist.Beachten Sie auch, dass einige Sandboxing-Funktionalität im Allgemeinen in Benutzerdiensten (d.h. Diensten, die vom benutzerbezogenen Diensteverwalter ausgeführt werden) nicht verfügbar ist. Insbesondere die verschiedenen Einstellungen, die die Unterstützung für Dateisystem-Namensräume benötigen (wie ProtectSystem=) sind nicht verfügbar, da die zugrundeliegende Kernelfunktionalität nur für privilegierte Prozesse erreichbar ist.
ProtectSystem=
ProtectHome=
Setzen dieser Einstellung auf »yes« ist fast äquivalent zum Setzen der drei Verzeichnisse in InaccessiblePaths=. Ähnlich ist »read-only« fast äquivalent zu ReadOnlyPaths= und »tmpfs« ist fast äquivalent zu TemporaryFileSystem=.
Es wird empfohlen, diese Einstellung für alle langlaufenden Dienste (insbesondere solchen zu Netzen) zu aktivieren, um sicherzustellen, dass sie keinen Zugriff auf private Benutzerdaten bekommen, außer der Dienst benötigt tatsächlich Zugriff auf die privaten Daten der Benutzer. Diese Einstellung ist impliziert, falls DynamicUser= gesetzt ist. Diese Einstellung kann nicht für alle Fälle den Schutz sicherstellen. Im Allgemeinen hat es die gleichen Begrenzungen wie ReadOnlyPaths=, siehe unten.
RuntimeDirectory=, StateDirectory=, CacheDirectory=, LogsDirectory=, ConfigurationDirectory=
Tabelle 2. Automatische Verzeichniserstellung
und
Umgebungsvariablen
Ort | fürs System | für Benutzer | Umgebungsvariable |
RuntimeDirectory= | /run | $XDG_RUNTIME_DIR | $RUNTIME_DIRECTORY |
StateDirectory= | /var/lib | $XDG_CONFIG_HOME | $STATE_DIRECTORY |
CacheDirectory= | /var/cache | $XDG_CACHE_HOME | $CACHE_DIRECTORY |
LogsDirectory= | /var/log | $XDG_CONFIG_HOME/log | $LOGS_DIRECTORY |
ConfigurationDirectory= | /etc | $XDG_CONFIG_HOME | $CONFIGURATION_DIRECTORY |
Im Falle von RuntimeDirectory= werden die tiefsten Unterverzeichnisse entfernt, wenn die Unit gestoppt wird. Es ist möglich, in diesem Fall die festgelegten Verzeichnisse zu erhalten, falls RuntimeDirectoryPreserve= auf restart oder yes konfiguriert ist (siehe unten). Die mit StateDirectory=, CacheDirectory=, LogsDirectory=, ConfigurationDirectory= festgelegten Verzeichnisse werden nicht entfernt, wenn die Unit gestoppt wird.
Außer im Fall von ConfigurationDirectory= werden die innersten festgelegten Verzeichnisse dem in User= und Group= festgelegten Benutzer und der Gruppe gehören. Falls die festgelegten Verzeichnisse bereits existieren und ihre besitzenden Benutzer und Gruppe nicht auf die konfigurierten passen, werden alle Dateien und Verzeichnisse unterhalb der festgelegten Verzeichnisse sowie alle Verzeichnisse selbst rekursiv geändert, so dass die Eigentümerschaft auf die konfigurierte passt. Falls die festgelegten Verzeichnisse bereits dem richtigen Benutzer und der richtigen Gruppe gehören werden als Optimierung alle Dateien und Verzeichnisse darunter unverändert gelassen, selbst falls sie nicht auf das angeforderte passen. Die Zugriffsmodi der innersten festgelegten Verzeichnisse wird auf das, was in RuntimeDirectoryMode=, StateDirectoryMode=, CacheDirectoryMode=, LogsDirectoryMode= und ConfigurationDirectoryMode= festgelegt ist, angepasst.
Diese Optionen implizieren BindPaths= für die festgelegten Pfade. Bei der Kombination mit RootDirectory= oder RootImage= werden diese Pfade immer innerhalb des Rechners liegen und von dort in den Dateisystemnamensraum der Unit eingehängt.
Falls DynamicUser= zusammen mit StateDirectory=, CacheDirectory= und LogsDirectory= verwandt wird, wird es leicht geändert: die Verzeichnisse werden unterhalb /var/lib/private, /var/cache/private bzw. /var/log/private erstellt, die Verzeichnisse des Rechners sind, die für nicht privilegierte Benutzer nicht zugreifbar sind. Dadurch wird sichergestellt, dass Zugriff auf diese Verzeichnisse nicht über das Recyclen dynamischer Benutzerkennungen möglich ist. Symbolische Links werden erstellt, um diese Unterschiede im Verhalten zu verstecken. Daher tauchen sowohl aus Sicht des Rechners als auch aus innerhalb der Unit die relevanten Verzeichnisse immer direkt unter /var/lib, /var/cache und /var/log auf.
Verwenden Sie RuntimeDirectory=, um eine oder mehrere Laufzeitverzeichnisse für die Unit zu verwalten und ihre Lebensdauer an die Lebensdauer des Daemons zu koppeln. Dies ist insbesonders für nicht privilegierte Daemons nützlich, die aufgrund fehlender Privilegien keine Laufzeitverzeichnisse in /run erstellen können und um sicherzustellen, dass die Laufzeitverzeichnisse nach der Verwendung automatisch bereinigt werden. Für Laufzeitverzeichnisse, die eine komplexere oder andere Konfiguration oder Lebensdauergarantie benötigen, prüfen Sie den Einsatz von tmpfiles.d(5).
Beispiel: Falls eine Systemdienste-Unit
RuntimeDirectory=foo/bar baz
enthält, erstellt der Diensteverwalter /run/foo (falls es noch nicht existiert), /run/foo/bar und /run/baz. Die Verzeichnisse /run/foo/bar und /run/baz außer /run/foo gehören dem Benutzer und der Gruppe, die in User= und Group= festgelegt sind und werden entfernt, wenn der Dienst gestoppt wird.
Beispiel: Falls eine Systemdienste-Unit
RuntimeDirectory=foo/bar StateDirectory=aaa/bbb ccc
enthält, dann wird die Umgebungsvariable »RUNTIME_DIRECTORY« mit »/run/foo/bar« und »STATE_DIRECTORY« mit »/var/lib/aaa/bbb:/var/lib/ccc« gesetzt.
RuntimeDirectoryMode=, StateDirectoryMode=, CacheDirectoryMode=, LogsDirectoryMode=, ConfigurationDirectoryMode=
RuntimeDirectoryPreserve=
ReadWritePaths=, ReadOnlyPaths=, InaccessiblePaths=
In ReadWritePaths= aufgeführte Pfade sind von innerhalb des Namensraums mit den gleichen Zugriffsmodi wie von außerhalb zugreifbar. In ReadOnlyPaths= aufgeführte Pfade sind nur lesbar zugreifbar, Schreiben wird abgelehnt, selbst falls die normale Dateizugriffssteuerung dies erlauben würde. Schachteln Sie ReadWritePaths= innerhalb von ReadOnlyPaths=, um schreibbare Unterverzeichnisse innerhalb nur lesbarer Verzeichnisse bereitzustellen. Verwenden Sie ReadWritePaths=, um bestimmte Pfade für den Schreibzugriff freizuschalten, falls ProtectSystem=strict verwandt wird.
In InaccessiblePaths= aufgeführte Pfade, einschließlich der Dateisystemhierarchie darunter, werden für Prozesse innerhalb des Namensraums unzugreifbar gemacht. Dies könnte restriktiver als gewünscht sein, da es nicht möglich ist, darin ReadWritePaths=, ReadOnlyPaths=, BindPaths= oder BindReadOnlyPaths= zu verschachteln. Für eine flexiblere Option siehe TemporaryFileSystem=.
Es können auch Pfade, die keine Verzeichnisse sind, angegeben werden. Diese Optionen können mehr als einmal angegeben werden, dann haben alle aufgeführten Pfade von innerhalb des Namensraums aus beschränkten Zugriff. Falls dieser Option die leere Zeichenkette zugewiesen wird, wird die Liste zurückgesetzt und alle vorherigen Zuweisungen haben keinen Effekt.
Pfaden in ReadWritePaths=, ReadOnlyPaths= und InaccessiblePaths= kann ein »-« vorangestellt werden, wodurch sie ignoriert werden, falls sie nicht existieren. Falls ihnen »+« vorangestellt wird, werden die Pfade als relativ zum Wurzelverzeichnis der Unit akzeptiert, wie dies mit RootDirectory=/RootImage= konfiguriert ist, statt relativ zum Wurzelverzeichnis des Rechners (siehe oben). Wenn Sie »-« und »+« auf dem gleichen Pfad kombinieren, verwenden Sie »-« zuerst und danach »+«.
Beachten Sie, dass diese Einstellungen die Ausbreitung von Einhängungen von den Prozessen einer Unit zum Rechner abtrennt. Dies bedeutet, dass diese Einstellung nicht für Dienste benutzt werden darf, die in der Lage sein müssen, Einhängepunkte im Haupteinhängenamensraum zu installieren. Die ReadWritePaths=- und ReadOnlyPaths=-Ausbreitung in die andere Richtung ist nicht betroffen, d.h. Einhängungen, die im Rechner erstellt werden, tauchen im Allgemeinen im Namensraum der Unit auf und Einhängungen, die auf dem Rechner entfernt werden, verschwinden auch dort. Beachten Sie insbesondere, dass die Einhängeausbreitung vom Rechner zu der Unit dazu führt, dass unveränderte Einhängungen im Namensraum der Unit erstellt werden, d.h. schreibbare Einhängungen, die auf dem Rechner auftauchen, werden auch im Namensraum der Unit schreibbar sein, selbst wenn sie zu einem Pfad fortgepflanzt werden, der mit ReadOnlyPaths= markiert ist! Daher wird die Zugriffseinschränkung mit diesen Optionen nicht auf Untereinhängungen eines Verzeichnisses, das später erstellt wird, ausgeweitet. Dies bedeutet, dass die durch diese Einstellung angebotene Verriegelung nicht vollständig ist und keinen vollständigen Schutz bietet.
Beachten Sie, dass die Wirkung dieser Einstellung durch privilegierte Prozesse zurückgenommen werden kann. Um eine wirksame Sandbox-Umgebung für eine Unit einzurichten, wird daher empfohlen, diese Einstellungen mit entweder CapabilityBoundingSet=~CAP_SYS_ADMIN oder SystemCallFilter=~@mount zu kombinieren.
TemporaryFileSystem=
Dies ist nützlich, um Dateien oder Verzeichnisse, die für die von der Unit gestarteten Prozesse nicht relevant sind, zu verstecken, während auf notwendige Dateien oder Verzeichnisse durch Kombination mit BindPaths= oder BindReadOnlyPaths= weiterhin zugegriffen werden kann. Siehe das nachfolgende Beispiel.
Beispiel: Falls eine Unit die Einstellunng
TemporaryFileSystem=/var:ro BindReadOnlyPaths=/var/lib/systemd
Der durch die Unit aufgerufene Prozess kann dann keine Dateien, Verzeichnisse oder Inhalte unter /var außer /var/lib/systemd sehen.
PrivateTmp=
Beachten Sie, dass die Implementierung dieser Einstellung unmöglich sein könnte (beispielsweise, falls Einhängenamensräume nicht verfügbar sind) und dass die Unit auf eine Art geschrieben sein sollte, die sich nicht ausschließlich auf diese Einstellung für die Sicherheit verlässt.
PrivateDevices=
Beachten Sie, dass die Implementierung dieser Einstellung unmöglich sein könnte (beispielsweise, falls Einhängenamensräume nicht verfügbar sind) und dass die Unit auf eine Art geschrieben sein sollte, die sich nicht ausschließlich auf diese Einstellung für die Sicherheit verlässt.
PrivateNetwork=
Beachten Sie, dass die Implementierung dieser Einstellung unmöglich sein könnte (beispielsweise, falls Netzwerknamensräume nicht verfügbar sind) und dass die Unit auf eine Art geschrieben sein sollte, die sich nicht ausschließlich auf diese Einstellung für die Sicherheit verlässt.
PrivateUsers=
Diese Einstellung ist insbesondere im Zusammenspiel mit RootDirectory=/RootImage= nützlich, da die Notwendigkeit, die Benutzer- und Gruppendatenbank im Wurzelverzeichnis und dem Gesamtsystem zu synchronisieren, reduziert wird, da die einzigen Benutzer und Gruppen, die angepasst werden müssen, »root«, »nobody« und der Benutzer und die Gruppe der Unit selbst sind.
Beachten Sie, dass die Implementierung dieser Einstellung unmöglich sein könnte (beispielsweise, falls Benutzernamensräume nicht verfügbar sind) und dass die Unit auf eine Art geschrieben sein sollte, die sich nicht ausschließlich auf diese Einstellung für die Sicherheit verlässt.
ProtectKernelTunables=
ProtectKernelModules=
ProtectControlGroups=
RestrictAddressFamilies=
Verwenden Sie diese Option, um den Kontakt des Prozesses für Zugriff aus der Ferne, insbesondere über exotische und heikle Netzwerkprotokolle wie AF_PACKET, zu begrenzen. Beachten Sie, dass in den meisten Fällen die lokale Adressfamilie AF_UNIX in die konfigurierte Freigabeliste aufgenommen werden sollte, das sie häufig für lokale Kommunikation verwandt wird, einschließlich für die syslog(2)-Protokollierung.
RestrictNamespaces=
Beispiel: Falls eine Unit die Einstellunng
RestrictNamespaces=cgroup ipc RestrictNamespaces=cgroup net
hat, dann werden cgroup, ipc und net gesetzt. Falls der zweiten Zeile »~« vorangestellt wird, d.h.
RestrictNamespaces=cgroup ipc RestrictNamespaces=~cgroup net
dann wird nur ipc gesetzt.
LockPersonality=
MemoryDenyWriteExecute=
RestrictRealtime=
RemoveIPC=
PrivateMounts=
Falls eingeschaltet wird dies drei Aktionen für jeden aufgerufenen Prozess auslösen: ein neuer CLONE_NEWNS-Namensraum wird erstellt, danach werden alle existierenden Einhängungen neu als MS_SLAVE eingehängt, um die Ausbreitung aus den Prozessen der Unit zu dem Hauptsystem zu deaktivieren (aber die Ausbreitung in die umgekehrte Richtung bleibt wirksam). Schließlich werden die Einhängungen erneut gemäß des in dem Schalter MountFlags= konfigurierten Forpflanzungsmodus eingehängt, siehe unten.
Dateisystemnamensräume werden individuell für jeden mit »fork« vom Diensteverwalter gestarteten Prozess eingerichtet. Einhängungen, die im Namensraum des durch ExecStartPre= erstellten Prozesses etabliert wurden werden daher automatisch bereinigt, sobald der Prozess sich beendet und werden für nachfolgend durch ExecStart= mit Fork gestartete Prozesse nicht verfügbar sein (und ähnliches gilt auch für die verschiedenen anderen für Units konfigurierten Befehle). Ähnlich erlaubt JoinsNamespaceOf= nicht die gemeinsame Benutzung von Kernelnamensräumen zwischen Units, es ermöglicht nur die gemeinsame Benutzung der Verzeichnisse /tmp/ und /var/tmp/.
Andere Dateisystemnamensräume-Einstellungen für Units — PrivateMounts=, PrivateTmp=, PrivateDevices=, ProtectSystem=, ProtectHome=, ReadOnlyPaths=, InaccessiblePaths=, ReadWritePaths=, … — ermöglichen Dateisystemnamensräume in einer Art ähnlich dieser Option. Daher ist es primär zur expliziten Anfrage dieses Verhalten nützlich, falls keine der anderen Einstellungen verwandt werden.
MountFlags=
Diese Einstellung steuert nur die abschließenden Ausbreitungseinstellungen, die für alle Einhängepunkte des Dateisystemnamensraums, der für jeden Prozess dieser Unit erstellt wurde, wirksam sind. Andere Dateisystemnamensraum-Unit-Einstellungen (siehe die Diskussion in PrivateMounts= oben) werden implizit Einhänge- und Aushängeausbreitung von den Prozessen der Unit in Richtung des Systems deaktivieren, indem sie die Ausbreitungseinstellungen aller Einhängepunkte in dem Dateisystemnamensraum der Unit zuerst auf slave setzen. Setzen der Option auf shared richtet die Ausbreitung in diesem Fall nicht wieder ein.
Falls nicht gesetzt – aber es sind durch andere Dateisystemnamensraumeinstellungen der Unit keine Dateisystemnamensräume aktiviert – wird shared Einhängeausbreitung verwandt aber, wie erwähnt, wird slave zuerst angewandt, Ausbreitung von den Prozessen der Unit zum Hauptsystem bleibt weiterhin abgeschaltet.
Es wird nicht empfohlen, private Einhängeausbreitung für Units zu verwenden, da dies bedeutet, dass temporäre Einhängungen (wie Wechselmedien) auf dem Hauptsystem eingehängt bleiben und daher unbefristet in mit Fork erstellten Programmen als beschäftigt markiert sind, da die Aushängeausbreitungsereignisse in dem Dateisystemnamensraum der Unit nicht empfangen werden.
Normalerweise ist es am besten, diese Einstellung unverändert zu lassen und stattdessen abstraktere Dateisystemnamensraumoptionen zu verwenden, insbesondere PrivateMounts=, siehe oben.
SYSTEMAUFRUFFILTERUNG¶
SystemCallFilter=Beachten Sie, dass auf Systemen, die mehrere ABIs unterstützen (wie X86/X86-64), empfohlen wird, alternative ABIs für Dienste zu deaktivieren, so dass sie nicht zur Umgehung der Einschränkungen dieser Option verwandt werden können. Insbesondere wird empfohlen, diese Option mit SystemCallArchitectures=native oder ähnlichem zu kombinieren.
Beachten Sie, dass strenge Systemaufruffilterung die Ausführungs- und Fehlerbehandlungs-Code-Pfade des Diensteaufrufs beeinflussen können. Insbesondere wird der Zugriff auf den Systemaufruf execve für die Ausführung des Diensteprogrammes benutzt — falls er blockiert ist, wird der Diensteaufruf notwendigerweise fehlschlagen. Falls auch die Ausführung des Diensteprogramms aus irgendwelchen Gründen fehlschlägt (beispielsweise fehlendes Diensteprogramm) könnte die Fehlerbehandlungslogik Zugriff auf eine zusätzliche Gruppen an Systemaufrufen benötigen, um diesen Fehlschlag korrekt zu verarbeiten und zu protokollieren. Es könnte notwendig sein, temporär die Systemaufruffilter zu deaktivieren, um die Fehlersuche bei solchen Fehlschlägen zu vereinfachen.
Falls Sie beide Arten dieser Option (d.h. explizite Freischaltung und Ausschlussliste) festlegen, wird die erste angetroffene Vorrang haben und die Standardaktion festlegen (Beendigung oder Bestätigung eines Systemaufrufs). Dann wird das nächste Auftreten dieser Option die Liste der Systemaufrufe zu der Menge der gefilterten Systemaufrufe hinzufügen oder aus dieser löschen, abhängig von seiner Art und der Standardaktion. (Falls Sie beispielsweise mit einer expliziten Freischaltung von read und write beginnen und direkt danach eine Ausschlussliste mit write hinzufügen, dann wird write aus der Menge entfernt.)
Da die Anzahl der möglichen Systemaufrufe groß ist, werden vordefinierte Gruppen von Systemaufrufen bereitgestellt. Eine Gruppe beginnt mit dem Zeichen »@«, gefolgt vom Namen der Gruppe.
Tabelle 3. Derzeit vordefinierte
Systemaufrufgruppen
Gruppe | Beschreibung |
@aio | Asynchrone E/A (io_setup(2), io_submit(2) und verwandte Aufrufe) |
@basic-io | Systemaufrufe für grundlegende E/A: Lesen, Schreiben, Suchen, Dateideskriptorenduplizieren und Schließen (read(2), write(2) und verwandte Aufrufe) |
@chown | Änderung der Dateieigentümerschaft (chown(2), fchownat(2) und verwandte Aufrufe) |
@clock | Systemaufrufe zur Änderung der Systemuhr (adjtimex(2), settimeofday(2) und verwandte Aufrufe) |
@cpu-emulation | Systemaufrufe für CPU-Emulierungsfunktionen (vm86(2) und verwandte Aufrufe) |
@debug | Fehlersuche, Leistungsüberwachung und Nachverfolgungsfunktionen (ptrace(2), perf_event_open(2) und verwandte Aufrufe) |
@file-system | Dateisystemaktionen: Öffnen, Dateien und Verzeichnisse zum Lesen und Schreiben erstellen, sie umbenennen oder entfernen, Lesen von Dateieigenschaften oder Erstellen von harten und symbolischen Links |
@io-event | Systemaufrufe für Ereignisschleifen (poll(2), select(2), epoll(7), eventfd(2) und verwandte Aufrufe) |
@ipc | Pipes, SysV IPC, POSIX-Nachrichtenwarteschlangen und andere IPC (mq_overview(7), svipc(7)) |
@keyring | Kernel-Schlüsselbundzugriff (keyctl(2) und verwandte Aufrufe) |
@memlock | Sperren von Speicher im RAM (mlock(2), mlockall(2) und verwandte Aufrufe) |
@module | Laden und Entladen von Kernelmodulen (init_module(2), delete_module(2) und verwandte Aufrufe) |
@mount | Einhängen und Aushängen von Dateisystemen (mount(2), chroot(2) und verwandte Aufrufe) |
@network-io | Socket-E/A (einschließlich lokalem AF_UNIX): socket(7), unix(7) |
@obsolete | Ungewöhnliches, veraltetes oder nicht implementiertes (create_module(2), gtty(2), …) |
@privileged | Alle Systemaufrufe, die Administrator-Capabilities benötigen (capabilities(7)) |
@process | Prozesssteuerung, -ausführung, Namensraumaktionen (clone(2), kill(2), namespaces(7), …) |
@raw-io | Roher E/A-Port-Zugriff (ioperm(2), iopl(2), pciconfig_read(), …) |
@reboot | Systemaufrufe für den Neustart und die Neustartvorbereitung (reboot(2), kexec(), …) |
@resources | Systemaufrufe für die Änderung von Ressourcenbeschränkungen, Speicher- und Schedulingparametern (setrlimit(2), setpriority(2), …) |
@setuid | Systemaufrufe zur Änderung der Benutzerkennung und Gruppenberechtigungen (setuid(2), setgid(2), setresuid(2), …) |
@signal | Systemaufrufe für die Veränderung und Handhabung von Prozesssignalen (signal(2), sigprocmask(2), …) |
@swap | Systemaufrufe für die Aktivierung/Deaktivierung von Auslagerungsgeräten (swapon(2), swapoff(2)) |
@sync | Synchronisierung von Dateien und Speicher auf Platte: (fsync(2), msync(2) und verwandte Aufrufe) |
@system-service | Eine vernünftige Gruppe von Systemaufrufen, die von typischen Systemdiensten benutzt werden, ausschließlich aller Systemaufrufe für besondere Zwecke. Dies ist der empfohlene Anfangspunkt zum expliziten Erlauben von Systemaufrufen für Systemdienste, da es das enthält, was typischerweise von Systemdiensten benötigt wird, aber überspezielle Schnittstellen ausschließt. Beispielsweise sind die folgenden APIs ausgeschlossen: »@clock«, »@mount«, »@swap«, »@reboot«. |
@timer | Systemaufrufe für Scheduling-Aktionen von Time (alarm(2), timer_create(2), …) |
Beachten Sie, dass neue Systemaufrufe zu den obigen Gruppen hinzugefügt werden könnten, wenn neue Systemaufrufe zu dem Kernel hinzugefügt werden. Die Inhalte dieser Gruppen können sich auch zwischen Systemd-Versionen unterscheiden. Zusätzlich hängt die Liste der Systemaufrufe auch von der Kernelversion und der Architektur, für die Systemd kompiliert wurde, ab. Verwenden Sie systemd-analyze syscall-filter, um die tatsächliche Liste der Systemaufrufe in jedem Filter aufzuführen.
Im allgemeinen ist das explizite Erlauben von Systemaufrufen (statt einer Ausschlussliste) der sichere Betriebsmodus. Es wird empfohlen, für alle langlaufenden Systemdienste eine Liste explizit erlaubter Systemaufrufe zu erzwingen. Insbesondere sind die nachfolgenden Zeilen eine relativ sichere grundlegende Wahl für den Großteil der Systemdienste:
[Service] SystemCallFilter=@system-service SystemCallErrorNumber=EPERM
Es wird empfohlen, die Dateisystem-Namensraum-bezogenen Optionen mit SystemCallFilter=~@mount zu kombinieren, um zu verhindern, dass die Prozesse der Unit die Abbildungen rückgängig machen. Insbesondere sind dies die Optionen PrivateTmp=, PrivateDevices=, ProtectSystem=, ProtectHome=, ProtectKernelTunables=, ProtectControlGroups=, ReadOnlyPaths=, InaccessiblePaths= und ReadWritePaths=.
SystemCallErrorNumber=
SystemCallArchitectures=
Falls diese Einstellung verwandt wird, wird den Prozessen dieser Unit nur der Aufruf nativer Systemaufrufe erlaubt und Systemaufrufe der festgelegten Architektur. Für die Zwecke dieser Option wird die Architektur X32 so behandelt, dass sie die Systemaufrufe von X86-64 enthält. Allerdings erfüllt diese Einstellung auf X32 weiterhin ihren Zweck, wie unten dargestellt.
Systemaufruffilterung ist nicht auf allen Architekturen wirksam. Beispielsweise ist auf X86 aufgrund von ABI-Einschränkungen das Filtern von Netz-Socket-bezogenen Aufrufen nicht möglich, eine Einschränkung, die X86-64 allerdings nicht hat. Auf Systemen, die mehrere ABI gleichzeitig unterstützen, wie X86/X86-64, wird daher empfohlen, die Gruppe der erlaubten Systemaufrufarchitekturen einzuschränken, so dass das sekundäre ABI nicht dazu verwandt werden kann, die auf das native ABI des Systems auferlegten Einschränkungen zu umgehen. Insbesondere ist das Setzen von SystemCallArchitectures=native für das Deaktivieren nichtnativer ABIs eine gute Wahl.
Systemaufrufarchitekturen können auch systemweit mittels der Option SystemCallArchitectures= in der globalen Konfiguration eingeschränkt werden. Siehe systemd-system.conf(5) für Details.
UMGEBUNGSVARIABLEN¶
Environment=Beispiel:
Environment="VAR1=Wort1 Wort2" VAR2=Wort3 "VAR3=$Wort 5 6"
ergibt drei Variablen »VAR1«, »VAR2«, »VAR3« mit den Werten »Wort1 Wort2«, »Wort3«, »$Wort 5 6«.
Siehe environ(7) für Details über Umgebungsvariablen.
Beachten Sie, dass Umgebungsvariablen nicht dazu geeignet sind, Geheimnisse (wie Passwörter, Schlüsselmaterial, …) an Diensteprozesse weiterzugeben. Für eine Unit gesetzte Umgebungsvariablen können von nicht privilegierten Clients wie D-Bus-IPC eingesehen werden und werden im Allgemeinen nicht als Daten betrachtet, die geschützt werden müssen. Desweiteren werden Umgebungsvariablen den Prozessbaum heruntergereicht, auch über Sicherheitsgrenzen (wie Setuid/Setgid-Programme) hinweg und könnten daher zu Prozessen durchsickern, die keinen Zugriff auf die geheimen Daten haben sollen.
EnvironmentFile=
Das übergebene Argument sollte ein absoluter Dateiname oder ein Platzhalterausdruck sein, dem optional »-« vorangestellt werden kann, um anzuzeigen, das sie nicht gelesen und keine Fehler- oder Warnmeldung protokolliert wird, falls sie nicht existiert. Diese Option kann mehr als einmal festgelegt werden, in diesem Fall werden alle festgelegten Dateien gelesen. Falls der Option die leere Zeichenkette zugewiesen wird, wird die Liste der zu lesenden Dateien zurückgesetzt und alle vorherigen Zuweisungen haben keine Wirkung.
Die mit dieser Anweisung aufgeführten Dateien werden kurz vor der Ausführung des Prozesses gelesen (genauer gesagt, nachdem alle Prozesse eines vorherigen Unit-Zustandes beendet wurden. Dies bedeutet, dass Sie diese Dateien in einem Unit-Zustand erstellen und sie mit dieser Option in dem nächsten lesen können).
Einstellungen von diesen Dateien setzen mit Environment= vorgenommene Einstellungen außer Kraft. Falls die gleiche Variable zweimal von diesen Dateien gesetzt wird, werden die Dateien in der festgelegten Reihenfolge eingelesen und spätere Einstellungen werden die früheren Einstellungen außer Kraft setzen.
PassEnvironment=
Variablen, die aufgrund dieser Einstellung für aufgerufene Prozesse gesetzt werden, unterliegen der Möglichkeit, durch solche, die mit Environment= oder EnvironmentFile= konfiguriert wurden, außer Kraft gesetzt zu werden.
Beispiel:
PassEnvironment=VAR1 VAR2 VAR3
übergibt die drei Variablen »VAR1«, »VAR2«, »VAR3« mit den für diese Variablen in PID1 gesetzten Werten.
Siehe environ(7) für Details über Umgebungsvariablen.
UnsetEnvironment=
Siehe environ(7) für Details über Umgebungsvariablen.
PROTOKOLLIERUNG UND SYSTEM-EIN-/-AUSGABE¶
StandardInput=Falls null ausgewählt wird, wird die Standardeingabe mit /dev/null verbunden, d.h. alle Leseversuche durch den Prozess werden sofort zu einem EOF führen.
Falls tty ausgewählt ist, wird die Standardeingabe mit einem TTY (wie mit TTYPath= konfiguriert ist, siehe unten) verbunden und der ausgeführte Prozess wird der steuernde Prozess des Terminals. Falls das Terminal bereits durch einen anderen Prozess gesteuert wird, wartet der ausgeführte Prozess, bis der derzeit steuernde Prozess das Terminal freigibt.
tty-force ist ähnlich zu tty, der ausgeführte Prozess wird aber zwangsweise und sofort zum steuernden Prozess des Terminals gemacht, möglicherweise werden dabei vorhergehende steuernde Prozesse von dem Terminal entfernt.
tty-fail ist ähnlich zu tty, falls aber das Terminal bereits einen steuernden Prozess hat, schlägt das Hochfahren des ausgeführten Prozesses fehl.
Die Option data kann zur Konfiguration beliebiger textueller oder binärer Daten, die mittels Standardeingabe an den ausgeführten Prozess übergeben werden sollen, verwandt werden. Die zu übergebenen Daten werden mittels StandardInputText=/StandardInputData= (siehe unten) konfiguriert. Beachten Sie, dass der tatsächlich übergebene Dateideskriptortyp (Speicherdatei, reguläre Datei, UNIX Pipe, …) vom Kernel und den verfügbaren Privilegien abhängen könnte. Auf jeden Fall ist der Dateideskriptor nur lesbar und er liefert die festgelegten Daten, gefolgt von EOF, zurück, wenn er gelesen wird.
Die Option file:Pfad kann zur Verbindung der Standardeingabe mit einem bestimmten Dateisystemobjekt verwandt werden. Es wird ein absoluter Pfad gefolgt von dem Zeichen »:« erwartet, der sich auf eine reguläre Datei, ein FIFO oder eine besondere Datei beziehen kann. Falls ein AF_UNIX-Socket in dem Dateisystem festgelegt ist, wird mit ihm ein Strom-Socket verbunden. Letzteres ist nützlich, um die Standardeingabe eines beliebigen Prozesses mit einem beliebigen Systemdienst zu verbinden.
Die Option »socket« ist nur in Socket-aktivierten Diensten gültig und es muss in der relevanten Socket-Unit-Datei (siehe systemd.socket(5) für Details) Accept=yes gesetzt oder nur ein einzelnes Socket spezifiziert sein. Falls diese Option gesetzt ist, wird die Standardeingabe mit dem Socket, aus dem der Dienst aktiviert wurde, verbunden. Dies ist hauptsächlich für die Kompatibilität mit Daemons nützlich, die für die Verwendung mit der traditionellen inetd(8)-Socket-Daemon-Aktivierung entwickelt wurden.
Die Option fd:Name verbindet die Standardeingabe mit einem durch die Socket-Unit bereitgestellten bestimmten, benannten Dateideskriptor. Der Name kann als Teil dieser Option festgelegt werden, gefolgt vom Zeichen »:« (z.B. »fd:foobar«). Falls kein Name festgelegt ist, wird der Name »stdin« impliziert (d.h. »fd« ist äquivalent zu »fd:stdin«). Mindestens eine Socket-Unit, die den festgelegten Namen definiert, muss über die Option Sockets= bereitgestellt werden und der Dateideskriptorname darf sich vom Namen der Socket-Unit, die ihn enthält, unterscheiden. Falls mehrere Treffer gefunden werden, wird der erste verwandt. Siehe FileDescriptorName= in systemd.socket(5) für weitere Details über benannte Dateideskriptoren und ihrer Sortierung.
Diese Einstellung ist standardmäßig null.
Beachten Sie, dass Dienste, die DefaultDependencies=no festlegen und StandardInput= oder StandardOutput= mit tty/tty-force/tty-fail verwenden, After=systemd-vconsole-setup.service festlegen sollten, um sicherzustellen, dass die TTY-Initialisierung abgeschlossen ist, bevor sie starten.
StandardOutput=
inherit dupliziert den Dateideskriptor der Standardeingabe für die Standardausgabe.
null verbindet die Standardausgabe mit /dev/null, d.h. alles dahin geschriebene geht verloren.
tty verbindet die Standardausgabe mit einem TTY (wie in TTYPath= konfiguriert, siehe unten). Falls das TTY nur für die Ausgabe verwandt wird, wird der ausgeführte Prozess nicht der steuernde Prozess des Terminals werden und wird nicht fehlschlagen oder darauf warten, dass andere Prozesse das Terminal freigeben.
journal verbindet die Standardausgabe mit dem Journal, das über journalctl(1) erreichbar ist. Beachten Sie, dass alles, was nach Syslog oder Kmsg (siehe unten) geschrieben wird, implizit auch im Journal gespeichert wird, die zwei speziellen unten aufgeführten Optionen sind daher eine Obermenge dieser Option.
syslog verbindet die Standardausgabe mit dem Systemprotokollierdienst syslog(3), zusätzlich zum Journal. Beachten Sie, dass der Journal-Daemon normalerweise so konfiguriert ist, dass er alles, was er empfängt, sowieso zum Syslog weiterleitet, wodurch diese Option in diesem Fall keinen Unterschied zu journal darstellt.
kmsg verbindet die Standardeingabe mit dem Kernelprotkollpuffer, der über dmesg(1) erreichbar ist, zusätzlich zum Journal. Der Journal-Daemon könnte so konfiguriert sein, dass er alles, was er empfängt, sowieso zu Kmsg sendet, wodurch diese Option in diesem Fall keinen Unterschied zu journal darstellt.
journal+console, syslog+console und kmsg+console arbeiten auf eine ähnliche Art wie die drei Optionen oben, kopieren aber auch sämtliche Ausgabe auf die Systemkonsole.
Die Option file:Pfad kann zum Verbinden eines bestimmten Dateisystemobjektes mit der Standardausgabe verwandt werden. Die Semantik ist ählich der identischen, oben dargestellten Option StandardInput=. Falls sich Pfad auf eine reguläre Datei auf dem Dateisystem bezieht, wird sie zum Schreiben am Anfang der Datei geöffnet (erstellt, falls sie noch nicht existiert), aber ohne sie abzuschneiden. Falls die Standardeingabe und -ausgabe auf den gleichen Dateipfad verwiesen werden, wird dieser nur einmal zum Lesen und Schreiben geöffnet und dupliziert. Dies ist insbesondere nützlich, wenn sich der festgelegte Pfad auf ein AF_UNIX-Socket im Dateisystem bezieht, da in diesem Fall nur eine einzelne Stromverbindung für sowohl Ein- als auch Ausgabe erstellt wird.
append:Pfad ist ähnlich zu file:path oben, es öffnet die Datei aber im Anhängemodus.
socket verbindet die Standardausgabe zu einem mittels Socket-Aktivierung erlangten Socket. Die Semantik ist ähnlich der identischen, oben dargestellten Option StandardInput=.
Die Option fd:Name verbindet die Standardausgabe mit einem bestimmten benannten, durch eine Socket-Unit bereitgestellten Dateideskriptor. Es kann als Teil dieser Option ein Name, gefolgt von einem »:«-Zeichen, festgelegt werden (z.B. »fd:foobar«). Falls kein Name festgelegt ist, wird der Name »stdout« impliziert (d.h. »fd« ist äquivalent zu »fd:stdout«). Mindestens eine Socket-Unit, die den festgelegten Namen definiert, muss über die Option Sockets= bereitgestellt werden und der Dateideskriptorname darf sich vom Namen der Socket-Unit, die ihn enthält, unterscheiden. Falls mehrere Treffer gefunden werden, wird der erste verwandt. Siehe FileDescriptorName= in systemd.socket(5) für weitere Details über benannte Dateideskriptoren und ihrer Sortierung.
Falls die Standardausgabe (oder die Fehlerausgabe, siehe unten) einer Unit mit dem Journal, dem Syslog oder dem Kernelprotokollpuffer verbunden ist, wird die Unit implizit eine Abhängigkeit vom Typ After= von systemd-journald.socket erhalten (siehe auch den Abschnitt »Implizite Abhängigkeiten« oben). Beachten Sie auch, dass in diesem Fall Stdout (oder Stderr, siehe unten) ein AF_UNIX-Strom-Socket und keine PIPE oder FIFO, die erneut geöffnet werden kann, sein wird. Das bedeutet, dass bei der Ausführung von Shell-Skripten die Konstruktion »echo "hello" > /dev/stderr« zum Schreiben von Text nach Stderr nicht funktionieren wird. Um dies zu entschärfen, verwenden Sie stattdessen die Konstruktion »echo "hello" >&2«, die größtenteils äquivalent ist und diesen Fallstrick vermeidet.
Der Vorgabewert dieser Einstellung ist der mit DefaultStandardOutput= in systemd-system.conf(5) gesetzte Wert, der standardmäßig journal ist. Beachten Sie, dass dieser Parameter zum Hinzufügen zusätzlicher Abhängigkeiten führen kann (siehe oben).
StandardError=
Der Vorgabewert dieser Einstellung ist der mit DefaultStandardError= in systemd-system.conf(5) gesetzte Wert, der standardmäßig inherit ist. Beachten Sie, dass dieser Parameter zum Hinzufügen zusätzlicher Abhängigkeiten führen kann (siehe oben).
StandardInputText=, StandardInputData=
StandardInputText= akzeptiert beliebige textuelle Daten. C-artige Maskierungen für besondere Zeichen sowie die normalen »%«-Kennzeichner werden aufgelöst. Jedes Mal, wenn diese Einstellung benutzt wird, wird der festgelegte Text an den Unit-bezogenen Datenpuffer, gefolgt von einem Zeilenumbruchzeichen, angehängt (daher hängt jeder Einsatz eine neue Zeile an das Ende des Puffers an). Beachten Sie, dass einleitende und abschließende Leerraumzeichen von mit dieser Option konfigurierten Zeilen entfernt werden. Falls eine leere Zeile festgelegt wird, wird der Puffer bereinigt (daher sollte ein zusätzliches »\n« an das Ende oder den Anfang einer Zeile eingefügt werden, um eine leere Zeile einzufügen).
StandardInputData= akzeptiert beliebige, in Base64[4] kodierte binäre Daten. Es werden keine Maskiersequenzen oder Kennzeichner aufgelöst. Sämtliche Leeraumzeichen in der kodierten Version werden während der Dekodierung ignoriert.
Beachten Sie, dass StandardInputText= und StandardInputData= auf dem gleichen Datenpuffer arbeiten und gemischt werden können, um sowohl binäre als auch textuelle Daten für den gleichen Eingabedatenstrom zu konfigurieren. Die textuellen oder binären Daten werden genau in der Reihenfolge zusammengefügt, in der sie in der Unit-Datei auftauchen. Wird einem eine leere Zeichenkette zugewiesen, wird der Datenpuffer zurückgesetzt.
Bitte beachten Sie, dass lange Unit-Dateieinstellungen in mehrere Zeilen aufgeteilt werden können, um die Lesbarkeit zu erhalten. Hierzu wird jeder Zeile (außer der letzten) ein Zeichen »\« vorangestellt (siehe systemd.unit(5) für Details). Dies ist insbesondere für große Daten, die mit diesen Optionen konfiguriert werden, nützlich. Beispiel:
… StandardInput=data StandardInputData=SWNrIHNpdHplIGRhIHVuJyBlc3NlIEtsb3BzLAp1ZmYgZWVtYWwga2xvcHAncy4KSWNrIGtpZWtl \ LCBzdGF1bmUsIHd1bmRyZSBtaXIsCnVmZiBlZW1hbCBqZWh0IHNlIHVmZiBkaWUgVMO8ci4KTmFu \ dSwgZGVuayBpY2ssIGljayBkZW5rIG5hbnUhCkpldHogaXNzZSB1ZmYsIGVyc2NodCB3YXIgc2Ug \ enUhCkljayBqZWhlIHJhdXMgdW5kIGJsaWNrZSDigJQKdW5kIHdlciBzdGVodCBkcmF1w59lbj8g \ SWNrZSEK …
LogLevelMax=
LogExtraFields=
LogRateLimitIntervalSec=, LogRateLimitBurst=
SyslogIdentifier=
SyslogFacility=
SyslogLevel=
SyslogLevelPrefix=
TTYPath=
TTYReset=
TTYVHangup=
TTYVTDisallocate=
SYSTEM V-KOMPATIBILITÄT¶
UtmpIdentifier=UtmpMode=
UMGEBUNGSVARIABLEN IN ERZEUGTEN PROZESSEN¶
Durch den Diensterwalter gestartete Prozesse werden mit einem Umgebungsvariablenblock gestartet, der aus verschiedenen Quellen zusammengesetzt ist. Prozesse, die durch den Systemdiensteverwalter gestartet werden, erben im Allgemeinen die für den Diensteverwalter selbst gesetzten Umgebungsvariablen nicht (dies kann durch PassEnvironment= geändert werden), aber Prozesse, die durch Benutzerdiensteverwalterinstanzen gestartet werden, erben im Allgemein alle für den Diensteverwalter selbst gsetzten Umgebungsvariablen.Für jeden aufgerufenen Prozess wird die Liste der gesetzten Umgebungsvariablen aus den folgenden Quellen zusammengestellt:
Falls die gleichen Umgebungsvariablen aus mehreren dieser Quellen gesetzt werden, gewinnt die letzte Quelle, wobei die Reihenfolge der obigen Liste zählt. Beachten Sie, dass als abschließender Schritt alle in UnsetEnvironment= aufgeführten Variablen wieder von der zusammengestellten Variablenliste entfernt werden, direkt bevor sie an den ausgeführten Prozess übergeben wird.
Die folgenden ausgewählten Umgebungsvariablen werden für jeden durch den Diensteverwalter aufgerufenen Prozesse gesetzt oder fortgepflanzt:
$PATH
$LANG
$USER, $LOGNAME, $HOME, $SHELL
$INVOCATION_ID
$XDG_RUNTIME_DIR
$MAINPID
$MANAGERPID
$LISTEN_FDS, $LISTEN_PID, $LISTEN_FDNAMES
$NOTIFY_SOCKET
$WATCHDOG_PID, $WATCHDOG_USEC
$TERM
$JOURNAL_STREAM
Falls sowohl die Standardausgabe als auch der Standardfehler des ausgeführten Prozesses mit dem Journal über ein Strom-Socket verbunden sind, wird diese Umgebungsvariable Informationen über den Standardfehlerstrom enthalten, da dies normalerweise das bevorzugte Ziel für Protokolldaten ist. (Beachten Sie, dass typischerweise der gleiche Strom sowohl für die Standardausgabe als auch den Standardfehler verwandt wird und daher die Umgebungsvariable sehr wahrscheinlich Geräte- und Inodeinformationen enthalten wird, die auf beide Stromdateideskriptoren passt.)
Diese Umgebungsvariable ist hauptsächlich nützlich, um Diensten zu erlauben, ihr verwandtes Protokollierungsprotokoll optional (mittels sd_journal_print(3) und anderer Funktionen) auf das native Journal-Protokoll anzuheben, falls ihre Standardausgabe oder Standardfehlerausgabe sowieso mit dem Journal verbunden ist. Damit wird die Lieferung von strukturierten Metadaten zusammen mit den protokollierten Nachrichten ermöglicht.
$SERVICE_RESULT
Tabelle 4. Definierte
$SERVICE_RESULT-Werte
Wert | Bedeutung |
"Erfolg" | Der Dienst lief erfolgreich und beendete sich sauber. |
"protocol" | Das Protokoll wurde verletzt: der Dienst hat nicht die von seiner Unit-Konfiguration verlangten Schritte absolviert (insbesondere was in der Einstellung Type= konfiguriert wurde). |
"timeout" | Eine der Schritte hat die Zeit überschritten. |
"exit-code" | Diensteprozess hat sich mit einen von Null verschiedenen Exit-Code beendet; siehe $EXIT_CODE unten für den tatsächlich zurückgelieferten Exit-Code. |
"signal" | Ein Diensteprozess wurde durch ein Signal regelwidrig beendet; ohne einen Speicherauszug. Siehe $EXIT_CODE unten für das tatsächliche Signal, das die Beendigung auslöste. |
"core-dump" | Ein Diensteprozess wurde durch ein Signal regelwidrig beendet und hat einen Speicherauszug ausgegeben. Siehe $EXIT_CODE unden für das Signal, das die Beendigung auslöste. |
"watchdog" | Der Totemannschalter des Watchdogs war für diesen Dienst aktiviert, aber die Frist wurde verpasst. |
"start-limit-hit" | Für die Unit war eine Startbegrenzung definiert und erreicht, wodurch der Start der Unit fehlschlug. Siehe StartLimitIntervalSec= und StartLimitBurst= von systemd.unit(5) für Details. |
"resources" | Eine Auffangbedingung, falls eine Systemaktion fehlschlug. |
Diese Umgebungsvariable ist nützlich, um den Fehlschlag oder die erfolgreiche Beendigung eines Dienstes zu überwachen. Obowohl diese Variable sowohl in ExecStop= und ExecStopPost= verfügbar ist, ist es normalerweise eine bessere Wahl, die Überwachungswerkzeuge in letzterer zu platzieren, da erstere nur für Dienste aufgerufen wird, die ihren Start korrekt verwaltet haben und letztere sowohl Dienste abdeckt, die während ihres Startens fehlschlugen als auch solche, die während ihrer Laufzeit fehlschlugen.
$EXIT_CODE, $EXIT_STATUS
Tabelle 5. Zusammenfassung der möglichen
Variablenwerte für
Diensteergebnisse
$SERVICE_RESULT | $EXIT_CODE | $EXIT_STATUS |
"Erfolg" | "exited" | "0" |
"protocol" | not set | not set |
"exited" | "0" | |
"timeout" | "killed" | »TERM«, »KILL« |
"exited" | »0«, »1«, »2«, »3«, … »255« | |
"exit-code" | "exited" | »1«, »2«, »3«, …, »255« |
"signal" | "killed" | »HUP«, »INT«, »KILL«, … |
"core-dump" | "dumped" | »ABRT«, »SEGV«, »QUIT«, … |
"watchdog" | "dumped" | "ABRT" |
"killed" | »TERM«, »KILL« | |
"exited" | »0«, »1«, »2«, »3«, … »255« | |
"start-limit-hit" | not set | not set |
"resources" | jeder der obigen | jeder der obigen |
Beachten Sie: der Prozess kann auch durch ein Signal beendet werden, das nicht von Systemd gesandt wurde. Insbesondere kann der Prozess sich selbst in einem Handler ein beliebiges Signal für jedes der nicht maskierbaren Signale senden. Nichtsdestotrotz wurden in den Spalten »timeout« und »watchdog« nur die Signale aufgenommen, die Systemd sendet. Desweiteren können mittels SuccessExitStatus= zusätzliche Exit-Stati erklärt werden, um die saubere Beendigung anzuzeigen, was in der Tabelle nicht wiedergegeben wird. |
Für Systemdienste können zusätzliche, durch Systemd definierte Umgebungsvariablen für Dienste gesetzt werden, wenn PAMName= aktiviert und pam_systemd Teil des ausgewählten PAM-Stacks ist. Dies sind insbesondere $XDG_SEAT und $XDG_VTNR, siehe pam_systemd(8) für Details.
PROZESS-EXIT-CODES¶
Beim Aufruf eines Unit-Prozesses könnte der Diensteverwalter möglicherweise nicht in der Lage sein, die mit den oben dargestellten Einstellungen konfigurierten Ausführungsparameter zu setzen. In diesem Fall wird sich der bereits erstellte Diensteprozess mit einem von Null verschiedenen Exit-Code beenden, bevor die konfigurierte Befehlszeile ausgeführt wird. (Oder, mit anderen Worten, der Kindprozess hat sich mit diesen Fehler-Codes beendet, nachdem er mit dem Systemaufruf fork(2) erstellt wurde, aber bevor der zugehörige Systemaufruf execve(2) aufgerufen wurde.) Insbesondere werden die durch die C-Bibliothek, die LSB-Spezifikation und durch den Systemd-Diensteverwalter selbst definierten Exit-Codes verwandt.Die folgenden grundlegenden Dienste-Exit-Codes sind durch die C-Bibliothek definiert.
Tabelle 6. Grundlegende Exit-Codes der
C-Bibliothek
Exit-Code | Symbolischer Name | Beschreibung |
0 | EXIT_SUCCESS | Generischer Erfolgs-Code. |
1 | EXIT_FAILURE | Generischer Fehlschlag oder unspezifizierter Fehler. |
Die folgenden Dienste-Exit-Codes sind durch die LSB-Spezifikation[5] festgelegt.
Tabelle 7. LSB-Dienste-Exit-Codes
Exit-Code | Symbolischer Name | Beschreibung |
2 | EXIT_INVALIDARGUMENT | Ungültige oder überzählige Argumente. |
3 | EXIT_NOTIMPLEMENTED | Nicht implementierte Funktionalität. |
4 | EXIT_NOPERMISSION | Der Benutzer hat nicht genug Privilegien. |
5 | EXIT_NOTINSTALLED | Das Programm ist nicht installiert. |
6 | EXIT_NOTCONFIGURED | Das Programm ist nicht konfiguriert. |
7 | EXIT_NOTRUNNING | Das Programm läuft nicht. |
Die LSB-Spezifikation schlägt vor, dass Fehler-Code 200 und höher für Implementierungen reserviert ist. Einige von ihnen werden vom Diensteverwalter benutzt, um Probleme beim Aufrufen von Prozessen anzuzeigen.
Tabelle 8. Systemd-spezifische Exit-Codes
Exit-Code | Symbolischer Name | Beschreibung |
200 | EXIT_CHDIR | Änderung des angeforderten Arbeitsverzeichnisses schlug fehl. Siehe WorkingDirectory= oben. |
201 | EXIT_NICE | Scheduling-Priorität (Nice-Stufe) konnte nicht gesetzt werden. Siehe Nice= oben. |
202 | EXIT_FDS | Ungewünschter Dateideskriptor konnte nicht geschlossen werden oder übergebene Dateideskriptoren konnten nicht angepasst werden. |
203 | EXIT_EXEC | Die tatsächliche Ausführung des Prozesses schlug fehl (genauer, der Systemaufruf execve(2)). Höchstwahrscheinlich wird dies durch ein fehlendes oder nicht zugreifbares Programm hervorgerufen. |
204 | EXIT_MEMORY | Aufgrund von Speicherknappheit konnte eine Aktion nicht durchgeführt werden. |
205 | EXIT_LIMITS | Ressourcenbegrenzungen konnten nicht angepasst werden. Siehe LimitCPU= und verwandte Einstellungen oben. |
206 | EXIT_OOM_ADJUST | OOM-Einstellungen konnten nicht angepasst werden. Siehe OOMScoreAdjust= oben. |
207 | EXIT_SIGNAL_MASK | Prozesssignalmaske konnte nicht gesetzt werden. |
208 | EXIT_STDIN | Standardeingabe konnte nicht gesetzt werden. Siehe StandardInput= oben. |
209 | EXIT_STDOUT | Standardausgabe konnte nicht gesetzt werden. Siehe StandardOutput= oben. |
210 | EXIT_CHROOT | Würzelverzeichnis konnte nicht geändert werden (chroot(2)). Siehe RootDirectory=/RootImage= oben. |
211 | EXIT_IOPRIO | E/A-Scheduling-Priorität konnte nicht gesetzt werden. Siehe IOSchedulingClass=/IOSchedulingPriority= oben. |
212 | EXIT_TIMERSLACK | Failed to set up timer slack. See TimerSlackNSec= above. |
213 | EXIT_SECUREBITS | Prozess-Sicherheits-Bits konnten nicht gesetzt werden. Siehe SecureBits= oben. |
214 | EXIT_SETSCHEDULER | CPU-Scheduling konnte nicht gesetzt werden. Siehe CPUSchedulingPolicy=/CPUSchedulingPriority= oben. |
215 | EXIT_CPUAFFINITY | CPU-Affinität konnte nicht gesetzt werden. Siehe CPUAffinity= oben. |
216 | EXIT_GROUP | Gruppen-Zugangsdaten konnten nicht bestimmt oder geändert werden. Siehe Group=/SupplementaryGroups= oben. |
217 | EXIT_USER | Benutzer-Zugangsdaten konnten nicht bestimmt oder geändert werden oder Benutzernamensräume eingerichtet werden. Siehe User=/PrivateUsers= oben. |
218 | EXIT_CAPABILITIES | Capabilities konnten nicht abgegeben oder Umgebungs-Capabilities angewandt werden. Siehe CapabilityBoundingSet=/AmbientCapabilities= oben. |
219 | EXIT_CGROUP | Einrichten der Dienste-Control-Gruppe schlug fehl. |
220 | EXIT_SETSID | Erstellung einer neuen Prozesssitzung schlug fehl. |
221 | EXIT_CONFIRM | Ausführung wurde vom Benutzer abgebrochen. Siehe die Kernelbefehlszeileneinstellung systemd.confirm_spawn= in kernel-command-line(7) für Details. |
222 | EXIT_STDERR | Standardfehlerausgabe konnte nicht eingerichtet werden. Siehe StandardError= oben. |
224 | EXIT_PAM | PAM-Sitzung konnte nicht eingerichtet werden. Siehe PAMName= oben. |
225 | EXIT_NETWORK | Netzwerknamensräume konnten nicht eingericht werden. Siehe PrivateNetwork= oben. |
226 | EXIT_NAMESPACE | Einhängenamensräume konnten nicht eingerichtet werden. Siehe ReadOnlyPaths= und verwandte Einstellungen oben |
227 | EXIT_NO_NEW_PRIVILEGES | Neue Privilegien konnten nicht deaktiviert werden. Siehe NoNewPrivileges=yes oben. |
228 | EXIT_SECCOMP | Systemaufruffilter konnten nicht angewandt werden. Siehe SystemCallFilter= und verwandte Einstellungen oben. |
229 | EXIT_SELINUX_CONTEXT | SELinux-Kontext konnte nicht bestimmt oder geändert werden Siehe SELinuxContext= oben. |
230 | EXIT_PERSONALITY | Ausführungsdomäne (Personalität) konnte nicht eingerichtet werden. Siehe Personality= oben. |
231 | EXIT_APPARMOR_PROFILE | AppArmor konnte nicht vorbereitet werden. SIehe AppArmorProfile= oben. |
232 | EXIT_ADDRESS_FAMILIES | Adressfamilien konnten nicht beschränkt werden. Siehe RestrictAddressFamilies= oben. |
233 | EXIT_RUNTIME_DIRECTORY | Laufzeitverzeichnis konnte nicht eingerichtet werden. Siehe RuntimeDirectory= und verwandte Einstellungen oben. |
235 | EXIT_CHOWN | Socket-Eigentümerschaft konnte nicht angepasst werden. Wird nur für Socket-Units verwandt. |
236 | EXIT_SMACK_PROCESS_LABEL | SMACK-Sicherheitskennzeichnung konnte nicht gesetzt werden. Siehe SmackProcessLabel= oben. |
237 | EXIT_KEYRING | Kernel-Schlüsselbund konnte nicht eingerichtet werden. |
238 | EXIT_STATE_DIRECTORY | Zustandsverzeichnis der Unit konnte nicht eingerichtet werden. Siehe StateDirectory= oben. |
239 | EXIT_CACHE_DIRECTORY | Zwischenspeicherverzeichnis der Unit konnte nicht eingerichtet werden. Siehe CacheDirectory= oben. |
240 | EXIT_LOGS_DIRECTORY | Protokollierverzeichnis der Unit konnte nicht eingerichtet werden. Siehe LogsDirectory= oben. |
241 | EXIT_CONFIGURATION_DIRECTORY | Konfigurationsverzeichnis der Unit konnte nicht eingerichtet werden. Siehe ConfigurationDirectory= oben. |
Schließlich definieren die BSD-Betriebssysteme eine Reihe von Exit-Codes, die typischerweise auch auf Linux-Systemen definiert sind:
Tabelle 9. BSD-Exit-Codes
Exit-Code | Symbolischer Name | Beschreibung |
64 | EX_USAGE | Befehlszeilenbenutzungsfehler |
65 | EX_DATAERR | Datenformatfehler |
66 | EX_NOINPUT | Eingabe kann nicht geöffnet werden |
67 | EX_NOUSER | Adresse unbekannt |
68 | EX_NOHOST | Rechnername unbekannt |
69 | EX_UNAVAILABLE | Dienst nicht verfügbar |
70 | EX_SOFTWARE | interner Softwarefehler |
71 | EX_OSERR | Systemfehler (d.h. Fork kann nicht ausgeführt werden) |
72 | EX_OSFILE | kritische Betriebssystemdatei fehlt |
73 | EX_CANTCREAT | (Benutzer)-Ausgabedatei kann nicht erstellt werden |
74 | EX_IOERR | Eingabe/Ausgabe-Fehler |
75 | EX_TEMPFAIL | Temporärer Fehlschlag, Benutzer sollte es noch einmal versuchen |
76 | EX_PROTOCOL | Ferner Fehler im Protokoll |
77 | EX_NOPERM | Erlaubnis verweigert |
78 | EX_CONFIG | Konfigurationsfehler |
SIEHE AUCH¶
systemd(1), systemctl(1), systemd-analyze(1), journalctl(1), systemd-system.conf(5), systemd.unit(5), systemd.service(5), systemd.socket(5), systemd.swap(5), systemd.mount(5), systemd.kill(5), systemd.resource-control(5), systemd.time(7), systemd.directives(7), tmpfiles.d(5), exec(3)ANMERKUNGEN¶
- 1.
- Spezifikation für auffindbare Partitionen
- 2.
- Schalter »Keine neuen Privilegien«
- 3.
- proc.txt
- 4.
- Base64
- 5.
- LSB-Spezifikation
ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@helgefjell.de> erstellt.Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.
systemd 241 |