Der beste Ort, um System- Unit-Dateien abzulegen: /etc/systemd/system
Stellen Sie sicher, dass Sie im Abschnitt [Install] ein Ziel hinzufügen. Lesen Sie "Woher weiß es das?" für Details. UPDATE : Ist/usr/local/lib/systemd/system
eine andere Option, lesen Sie "Gray Area" für Details. "
Der beste Ort, um User- Unit-Dateien abzulegen: /etc/systemd/user
oder $HOME/.config/systemd/user
aber es hängt von den Berechtigungen und der Situation ab.
Die Wahrheit ist, dass systemd-Einheiten (oder wie der Intro-Satz sie nennt, "Einheitenkonfigurationen") überall hingehen können - vorausgesetzt, Sie sind bereit, manuelle Symlinks zu erstellen, und Sie sind sich der Vorbehalte bewusst. Es macht das Leben leichter, das Gerät systemctl daemon-reload
aus guten Gründen dort aufzustellen, wo es zu finden ist:
- Die Verwendung eines Standardverzeichnisses bedeutet, dass systemd-Generatoren sie finden und beim Booten leicht aktivieren können
systemctl enable
. Dies liegt daran, dass Ihre Einheit automatisch einem Einheitenabhängigkeitsbaum (einem Einheiten-Cache) hinzugefügt wird.
- Sie müssen nicht über Berechtigungen nachdenken, da nur die richtigen privilegierten Benutzer in die festgelegten Bereiche schreiben können.
Woher weiß es das?
Und wie genau weiß systemctl enable
, wo der Symlink erstellt werden soll? Sie können es in der Einheit selbst unter dem [install]
Abschnitt fest codieren . Normalerweise gibt es eine Linie wie
[Install]
WantedBy = multi-user.target
das entspricht einem vordefinierten Ort im Dateisystem. Auf diese Weise systemctl
wissen Sie, dass diese Einheit von einer Gruppe von Einheitendateien abhängt, die als multi-user.target
"Ziel" bezeichnet wird. Sie können alle Gruppen mit systemctl list-units --type target
auflisten. Die Gruppe von Unit-Dateien, die mit einem Ziel geladen werden sollen, wird in ein targetname.target.wants
Verzeichnis gestellt. Dies ist nur ein Verzeichnis voller Symlinks (oder der echten). Wenn in Ihrem [Install]
Abschnitt angegeben ist , dass dies der Fall ist, WantedBy
der multi-user.target
Symlink jedoch nicht im multi-user.target.wants
Verzeichnis vorhanden ist, wird er nicht geladen. Wenn die systemd-Unit-Generatoren Ihre Unit-Datei beim Booten zum Abhängigkeitsbaum-Cache hinzufügen (Sie können Generatoren mit manuell auslösen systemctl daemon-reload
), weiß sie automatisch, wo der Symlink abgelegt werden muss - in diesem Fall im Verzeichnis/etc/systemd/system/multi-user.target.wants/
sollten Sie es aktivieren.
Wichtige Punkte im Handbuch:
Zusätzliche Einheiten können aus Verzeichnissen, die sich nicht im Pfad zum Laden von Einheiten befinden, in systemd ("verknüpft") geladen werden. Siehe den Link-Befehl für systemctl (1).
Suchen Sie unter systemctl nach Unit File Commands
Unit File Load Path
Unit-Dateien werden aus einer Reihe von Pfaden geladen, die während der Kompilierung festgelegt wurden. Eine Beschreibung finden Sie in den beiden folgenden Tabellen. Gerätedateien, die in den zuvor aufgelisteten Verzeichnissen gefunden wurden, überschreiben Dateien mit demselben Namen in den Verzeichnissen weiter unten in der Liste.
Wenn die Variable festgelegt $SYSTEMD_UNIT_PATH
ist, überschreibt der Inhalt dieser Variablen den Pfad für die Ladeeinheit. Wenn $SYSTEMD_UNIT_PATH
mit einer leeren Komponente (":") geendet wird, wird der übliche Ladepfad an den Inhalt der Variablen angehängt.
Tabelle 1 und Tabelle 2 man systemd.unit
sind gut.
Laden Sie Pfade, wenn Sie im Systemmodus ( --system
) ausgeführt werden.
/etc/systemd/system
Lokale Konfiguration
/run/systemd/system
Laufzeiteinheiten
/usr/lib/systemd/system
Einheiten der installierten Pakete
Ladepfad bei Ausführung im Benutzermodus ( --user
)
Es gibt einen Unterschied zwischen Einheiten pro Benutzer und Einheiten aller / globaler Benutzer.
Benutzerabhängig
$XDG_CONFIG_HOME/systemd/user
Benutzerkonfiguration (nur verwendet wenn $XDG_CONFIG_HOME
gesetzt)
$HOME/.config/systemd/user
Benutzerkonfiguration (nur verwendet, wenn $XDG_CONFIG_HOME
nicht festgelegt)
$XDG_RUNTIME_DIR/systemd/user
Runtime Units (nur verwendet wenn $XDG_RUNTIME_DIR
gesetzt)
$XDG_DATA_HOME/systemd/user
Einheiten von Paketen, die im Ausgangsverzeichnis installiert wurden (nur verwendet, wenn $XDG_DATA_HOME
festgelegt)
$HOME/.local/share/systemd/user
Einheiten von Paketen, die im Ausgangsverzeichnis installiert wurden (nur verwendet, wenn $XDG_DATA_HOME
nicht festgelegt)
--global
(Alle Nutzer)
Einheiten, die für alle Benutzer gelten - dh auch für jeden Benutzer. So kann jeder Benutzer diese Dienste beenden, auch wenn sie beim Booten von einem Administrator aktiviert werden.
/etc/systemd/user
Lokale Konfiguration für alle Benutzer ( systemctl --global enable userunit.service
)
/usr/lib/systemd/user
Paketeinheiten, die systemweit für alle Benutzer installiert wurden
/run/systemd/user
Laufzeiteinheiten
Grauzone
Zum einen legt der File Hierarchy Standard fest, dass /etc
lokale Konfigurationen keine Binärdateien ausführen. Andererseits gibt es an, dass /usr/local/
"vom Systemadministrator verwendet wird, wenn Software lokal installiert wird". Sie könnten auch argumentieren (wenn auch nicht nur zum Zweck der Organisation), dass alle System-Unit-Dateien darunter fallen sollten /usr/local/lib/systemd/system
, aber dies ist für Unit-Dateien gedacht, die Teil von "Software" sind und nicht von einem Package Manager stammen. Die entsprechenden systemd Benutzereinheiten, die systemweit sind, könnten darunter fallen
/usr/local/lib/systemd/user
.
/etc/systemd/system
Hier legen Sie Ihre Skripte ab, Pacman legt/usr/lib/systemd/system
systemctl enable foo.service
/usr
/etc