GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Legen Sie die Systemd Unit-Datei ab?

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

Im Widerspruch zu diesem Verständnis steht die Antwort auf diese Frage:How to write startup script for Systemd. Kann jemand die fehlenden Informationen ergänzen, damit ich verstehe, was los ist? (UPDATE:Die Antwort wurde aktualisiert, und mein Verständnis widerspricht ihr nicht mehr. )

Außerdem scheinen die Skripte in Unterordnern innerhalb von /etc/systemd/system/ organisiert zu sein Ordner:

getty.target.wants
multi-user.target.wants

An einem anderen Ort habe ich gelesen, dass es noch andere Orte gibt. Es scheint, dass diese 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.

Aktualisierung 31.08.2015:

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-Einheiten ausgeführt werden?

Akzeptierte Antwort:

Der beste Platz für System Unit-Dateien: /etc/systemd/system Stellen Sie einfach sicher, dass Sie ein Ziel im Abschnitt [Installieren] hinzufügen, lesen Sie „Woher weiß es?“. für Details. AKTUALISIEREN :/usr/local/lib/systemd/system ist eine weitere Option, lesen Sie „Graubereich“ für weitere Einzelheiten.“

Der beste Ort, um Benutzer abzulegen Unit-Dateien: /etc/systemd/user oder $HOME/.config/systemd/user aber es hängt von den Berechtigungen und der Situation ab.

Die Wahrheit ist, dass systemd-Units (oder wie der Einführungssatz sie nennt, „Unit-Konfigurationen“) überall eingesetzt werden können – vorausgesetzt, Sie sind bereit, manuelle Symlinks zu erstellen, und Sie sind sich der Einschränkungen bewusst. Es macht das Leben einfacher, die Unit dort abzulegen, wo systemctl daemon-reload kann es aus guten Gründen finden:

  • Die Verwendung eines Standardspeicherorts bedeutet, dass systemd-Generatoren sie finden und sie beim Booten einfach mit systemctl enable aktivieren können . Das liegt daran, dass Ihre Unit automatisch zu einem Unit-Abhängigkeitsbaum (einem Unit-Cache) hinzugefügt wird.
  • Sie müssen sich keine Gedanken über Berechtigungen machen, da nur die berechtigten Benutzer in die gekennzeichneten Bereiche schreiben können.

Woher weiß es das?

Und wie genau aktiviert systemctl enable Wissen Sie, wo Sie den Symlink erstellen können? Sie codieren es fest innerhalb der Unit
selbst unter [install] Sektion. Normalerweise gibt es eine Zeile wie

[Install]
WantedBy = multi-user.target

das entspricht einem vordefinierten Ort im Dateisystem.
Auf diese Weise systemctl enable weiß, dass diese Unit von einer Gruppe von Unit-Dateien namens multi-user.target abhängig ist („Ziel“ ist der Begriff, der verwendet wird, um Unit-Abhängigkeitsgruppen zu bezeichnen. 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 targetname.target.wants abgelegt Verzeichnis. Dies ist nur ein Verzeichnis voller Symlinks (oder das Original). Wenn Ihr [Install] Abschnitt sagt, dass es WantedBy ist das multi-user.target , aber wenn kein Symlink darauf in multi-user.target.wants existiert Verzeichnis, dann wird es nicht geladen. Wenn die systemd-Unit-Generatoren Ihre Unit-Datei beim Booten zum Abhängigkeitsbaum-Cache hinzufügen (Sie können Generatoren manuell mit systemctl daemon-reload auslösen ), weiß es automatisch, wo der Symlink abgelegt werden muss – in diesem Fall im Verzeichnis /etc/systemd/system/multi-user.target.wants/ sollten Sie es aktivieren.

Schlüsselpunkte im Handbuch:

Zusätzliche Units können aus
Verzeichnissen, die sich nicht im Unit-Ladepfad befinden, in systemd („verlinkt“) geladen werden. Siehe Link-Befehl für
systemctl(1).

Suchen Sie unter systemctl nach Unit File Commands

Ladepfad der Unit-Datei

Bitte lesen und verstehen Sie den ersten Satz im folgenden Zitat aus man systemd.unit (weil es impliziert, dass alle Pfade, die ich hier erwähne, möglicherweise nicht auf Sie zutreffen, wenn Ihr systemd mit anderen Pfaden kompiliert wurde):

Unit-Dateien werden aus einer Reihe von Pfaden geladen, die während der Kompilierung festgelegt wurden, wie in den beiden Tabellen unten beschrieben. Unit-Dateien, die in früher aufgelisteten Verzeichnissen gefunden wurden, überschreiben Dateien mit demselben Namen in Verzeichnissen weiter unten in der Liste.

Wenn die Variable $SYSTEMD_UNIT_PATH gesetzt ist, überschreibt der Inhalt dieser Variablen den Unit-Load-Pfad. Wenn $SYSTEMD_UNIT_PATH mit einer leeren Komponente („:“) endet, wird der übliche Unit-Load-Pfad an den Inhalt der Variablen angehängt.

Tabelle 1 und Tabelle 2 aus man systemd.unit sind gut.

Verwandt:Echo zum Dateideskriptor überschreibt die Datei?

Pfade laden, wenn im Systemmodus ausgeführt wird (--system ).

  • /etc/systemd/system Lokale Konfiguration
  • /run/systemd/system Laufzeiteinheiten
  • /usr/lib/systemd/system Einheiten installierter Pakete (oder /lib/systemd/system Lesen Sie in einigen Fällen man systemd.unit )

Pfad laden, wenn im Benutzermodus ausgeführt wird (--user )

Es gibt einen Unterschied zwischen pro Benutzer Einheiten und all/global Benutzereinheiten.

Benutzerabhängig

  • $XDG_CONFIG_HOME/systemd/user Benutzerkonfiguration (wird nur verwendet, wenn $XDG_CONFIG_HOME eingestellt ist)

  • $HOME/.config/systemd/user Benutzerkonfiguration (wird nur verwendet, wenn $XDG_CONFIG_HOME nicht gesetzt)

  • $XDG_RUNTIME_DIR/systemd/user Laufzeiteinheiten (wird nur verwendet, wenn $XDG_RUNTIME_DIR eingestellt ist)

  • $XDG_DATA_HOME/systemd/user Einheiten von Paketen, die im Home-Verzeichnis installiert wurden (wird nur verwendet, wenn $XDG_DATA_HOME eingestellt ist)

  • $HOME/.local/share/systemd/user Einheiten von Paketen, die im Home-Verzeichnis installiert wurden (wird nur verwendet, wenn $XDG_DATA_HOME nicht gesetzt)

--global (alle Benutzer)

Einheiten, die für alle Benutzer gelten – also auch jedem Benutzer gehören. Daher kann jeder Benutzer diese Dienste stoppen, selbst wenn ein Administrator sie beim Booten aktiviert.

  • /etc/systemd/user Lokale Konfiguration für alle Benutzer (systemctl --global enable userunit.service )
  • /usr/lib/systemd/user Einheiten von Paketen, die systemweit für alle Benutzer installiert wurden (oder /lib/systemd/system in einigen Fällen lesen Sie man systemd.unit)
  • /run/systemd/user Laufzeiteinheiten

Graubereich

Einerseits spezifiziert der File Hierarchy Standard, dass /etc ist für lokale Konfigurationen, die keine Binärdateien ausführen. Andererseits
gibt es an, dass /usr/local/ „wird vom Systemadministrator bei der lokalen Installation von Software verwendet“. Sie könnten auch argumentieren (wenn auch nicht nur aus organisatorischen Gründen), dass alle System-Unit-Dateien unter /usr/local/lib/systemd/system abgelegt werden sollten , aber dies ist für Unit-Dateien gedacht, die Teil von „Software“ sind, nicht von einem Paketmanager.
Die entsprechenden systemd-Benutzereinheiten, die systemweit sind, könnten unter /usr/local/lib/systemd/user .

Transiente Einheit

Ein weiterer vergessener Ort ist nirgendwo! Ein vielleicht weniger bekanntes Programm ist systemd-run . Sie können es verwenden, um transiente Einheiten im laufenden Betrieb auszuführen. siehe man systemd-run .

Um beispielsweise morgen früh um 4 Uhr einen Neustart zu planen (möglicherweise benötigen Sie --force um sicherzustellen, dass ein Neustart erfolgt):

systemd-run -u restart --description="Restarts machine" --on-calendar="2020-12-18 00:04:00" systemctl --force reboot

Dies ergibt eine transiente Unit-Datei restart.service und einen entsprechenden Timer (wegen der --on-calendar , angezeigt durch transient=yes .

/run/systemd/transient/restart.service

# This is a transient unit file, created programmatically via the systemd API. Do not edit.
[Unit]
Description=Restarts machine

[Service]
ExecStart=
ExecStart="/usr/bin/systemctl" "--force" "reboot"

Beachten Sie, dass es auch die gefährlichere Double-Force-Option --force --force gibt , was den Kernel anweist, sofort anzuhalten (und, wenn Sie nicht wissen, was Sie tun, unsicher, weil es fast gleichbedeutend mit einer Stromunterbrechung ist).

Siehe auch:Low-Power-Gerät in versiegelter Einheit – Hilfe beim Design?
Linux
  1. Wie kopiert man eine Datei und erstellt gleichzeitig die Zielverzeichnisse?

  2. Die Bash‘?

  3. Ist Mv Atomic auf den Fs?

  4. Systemd:Generierte Unit-Datei kann nicht deaktiviert werden?

  5. Ändern Sie die Berechtigungen einer Datei

Einführung in das Linux-Dateisystem

Verwenden der SSH-Konfigurationsdatei

So überprüfen Sie den Runlevel unter Linux

Die Hosts-Datei unter Linux

Systemd-Unit-Datei - WantedBy und After

Gibt es eine Möglichkeit, den Ausführungsbaum von systemd anzuzeigen?