Ich habe gelesen, dass es zwei Ordner für Unit-Dateien gibt (nicht im Benutzermodus).
/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator
Diesem Verständnis widerspricht die folgende Antwort: https://unix.stackexchange.com/a/47715/33386 . Kann jemand die fehlenden Informationen eintragen, damit ich verstehe, was los ist? ( UPDATE: Die Antwort wurde aktualisiert und mein Verständnis steht nicht mehr im Widerspruch dazu. )
Außerdem scheinen die Skripte in Unterordnern innerhalb des /etc/systemd/system/
Ordners angeordnet zu sein:
getty.target.wants
multi-user.target.wants
An einem anderen Ort habe ich gelesen, dass es andere Orte gibt. Es scheint, dass dies für benutzerspezifische Dienste sind.
/usr/lib/systemd/user/ where services provided by installed packages go.
/etc/systemd/user/ where system-wide user services are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own services.
Update 2015-08-31:
Für andere ist hier ein Link zu einer verwandten Frage, die ich kürzlich gestellt habe: Wo lege ich Skripte ab, die von systemd units ausgeführt werden?
quelle
/etc/systemd/system
Hier legen Sie Ihre Skripte ab, Pacman legt/usr/lib/systemd/system
systemctl enable foo.service
/usr
/etc
man systemd.target
: es erklärt die Argumentation hinter den Gruppierungen.Antworten:
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:systemctl enable
. Dies liegt daran, dass Ihre Einheit automatisch einem Einheitenabhängigkeitsbaum (einem Einheiten-Cache) hinzugefügt wird.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 wiedas entspricht einem vordefinierten Ort im Dateisystem. Auf diese Weise
systemctl
wissen Sie, dass diese Einheit von einer Gruppe von Einheitendateien abhängt, die alsmulti-user.target
"Ziel" bezeichnet wird. Sie können alle Gruppen mitsystemctl list-units --type target
auflisten. Die Gruppe von Unit-Dateien, die mit einem Ziel geladen werden sollen, wird in eintargetname.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
dermulti-user.target
Symlink jedoch nicht immulti-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ösensystemctl 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:
Suchen Sie unter systemctl nach Unit File Commands
Unit File Load Path
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 PaketeLadepfad 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
LaufzeiteinheitenGrauzone
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
.quelle
/etc/systemd/system
: Ist das ein allgemeiner Ratschlag für selbst erstellte Unit-Dateien? Alles, was von einem Paketmanager installiert wird, sollte immer/usr/lib/systemd/system
für z./etc/systemd/user
für (garantierte) systemweite Benutzerdienste und~/.config/systemd/user
für benutzerdefinierte benutzerspezifische Dienste./etc/systemd/system
ist , wo Sie setzen Ihre Skripte, setzt Pacman Paket Skripte in/usr/lib/systemd/system
.Beim Ausgeben
systemctl enable foo.service
werden Symlinks von/usr
bis erstellt/etc
. Weitere Informationen finden Sie im Abschnitt Pfad zum Laden von Einheitenman systemd.unit(5)
.quelle
Ich habe 3 geschrieben, eine für
ntpd
eine für eine zweite, statische Ethernet-Karte und eine für die Ausführungp0f
, die passive Betriebssystemkennung. Ich habe sie alle reingelegt/etc/systemd/system
. Sieht so aus, als könnte ich vielleichtsystemd
das NTP-Zeug erledigen lassen , aber ich glaube nicht, dass ich mich so sehr darauf verlassen möchte.quelle