Wie erstelle ich ein systemd-Ziel?

16

Nachdem ich viele Posts, Youtube-Videos und "Dokumentationen" zu systemd durchsucht habe, bin ich immer noch ratlos.

Der Link ( https://wiki.archlinux.org/index.php/systemd#Create_custom_target ) schien vielversprechend, war aber (für mich) etwas vage.

Frage

Wie würde man vorgehen, um ein benutzerdefiniertes systemd-Ziel (IE: foo.target) zu erstellen, damit man mit ausgewählten .service-Einheiten booten kann?

Beispiel

  1. System bootet default.target (Symlink von "foo.target")
  2. "foo.target" startet nur einen Barebones X-Server und ein GUI-Programm, beispielsweise "gvim".

Grund

Ich möchte lediglich ein benutzerdefiniertes Ziel für den schnellen Start eines X-Programms erstellen. Ich wäre nett, alle Dienstleistungen auszuschließen, die ich nicht brauche.

Danke im Voraus!

Pilbox
quelle

Antworten:

16

Lesen Sie durch man 5 systemd.unitund man 5 systemd.targetsagen Sie uns, dass Unit-Dateien verwendet werden, um Ziele sowie alles andere systemd zu definieren. Es gibt keine Dokumentation speziell zum Erstellen eines Ziels , daher ist es schwierig, die Vorgehensweise zu bestimmen, aber es unterscheidet sich nicht allzu sehr vom Erstellen eines Diensts.

Wenn Sie Ihr Ziel erstellen, müssen Sie Symlinks zum target.wantsVerzeichnis aus dem Verzeichnis systemd services erstellen . Dann können Sie Ihr Ziel setzen / booten. Hier ist, wie es in Ihrem Beispiel aussehen könnte.

/etc/systemd/system/foo.target

Dies ist die Einheitendatei des Ziels. Wenn Sie das Beispiel graphical.target verwenden, können Sie daraus ein eigenes Ziel erstellen.

[Unit]
Description=Foobar boot target
Requires=multi-user.target
Wants=foobar.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target
AllowIsolate=yes

Erläuterungen zu den Optionen auf den Manpages des Systems.

  • Description- Beschreibt das Ziel. Du solltest verstehen
  • Requires- Harte Abhängigkeiten des Ziels. Sie sollten das Basissystem starten lassen, bevor Sie Ihre eigenen Dienste starten.
  • Wants- Weiche Abhängigkeiten. Das Ziel benötigt diese nicht zum Starten.
  • Conflicts - Wenn eine Einheit eine Konflikteinstellung auf einer anderen Einheit hat, stoppt das Starten der ersteren die letztere und umgekehrt.
  • After - Stiefel nach diesen Diensten
  • AllowIsolate- Es liegt ganz bei Ihnen und Ihrer Umgebung. Details finden Sie in der Manpagesystemd.unit(5)

/etc/systemd/system/foo.target.wants/

In diesem Verzeichnis verknüpfen Sie die Dienste, die Sie für Ihr Ziel erstellen / benötigen. Dies entspricht der Wants=Option in der Unit-Datei. Erstellen Sie dieses Verzeichnis und erstellen Sie dann Symlinks wie folgt; ln -s /usr/lib/systemd/system/bar.service /etc/systemd/system/foo.target.wants/bar.service. Dadurch wird ein Symlink von bar.service im Systemverzeichnis zu Ihrem Verzeichnis foo.target.wants erstellt.


Ich denke, das Erstellen einer Unit-Datei für einen Service gehört nicht zum Umfang dieser Antwort, und diese Frage ist definitiv besser dokumentiert. Deshalb lasse ich das jetzt weg. Wenn Sie Ihre Unit-Datei erstellen, verknüpfen Sie sie einfach mit einem Symlink in das Verzeichnis target.wants oder fügen Sie sie der Wants=Direktive hinzu.

m32
quelle
Ich habe die obigen Anweisungen befolgt, um ein neues Ziel zu erstellen, und meinem Service einige Ziele hinzugefügt. Keiner dieser Dienste wird jedoch von systemd gestartet. Gibt es ein vollständiges Beispiel, das zeigt, dass Dienste innerhalb des neu hinzugefügten Ziels funktionieren?
Linuxfan
1
Wenn Sie nach einfachen Schritten suchen, um einen benutzerdefinierten Dienst für die Ausführung beim Booten einzurichten, lesen Sie den Stack-Beitrag des Nekromanten .
28.
@linuxfan füge ich foo.targetdem RequiresFeld und dem BeforeFeld hinzu multi-user.target, und es gefällt Requires: base.target foo.target. Danach starte ich mein Arch Linux vm neu und foobar.servicelaufe automatisch als Daemon.
L_K
2
Gute Antwort, aber es scheint nicht wie erwartet zu funktionieren. 1. Nur weil es in Wünschen ist, heißt das nicht, dass der Dienst mit diesem Ziel beginnt. 2. Das multi-user.target scheint irgendwelche versteckten Dinge zu haben, die es zum Laufen bringen.
Otheus