it-swarm.com.de

Wie kann ich systemd-Dienste überschreiben oder konfigurieren?

Viele Sysv-Init-Skripte verwendeten eine entsprechende Datei in /etc/default, damit der Administrator sie konfigurieren konnte. Upstart-Jobs können mithilfe von .override -Dateien geändert werden. Wie kann ich systemd-Einheiten überschreiben oder konfigurieren, jetzt wo systemd der Standard in Ubuntu ist?

105
muru

systemd-Einheiten müssen den Dateien in _/etc/default_ nicht folgen. systemd ist einfach zu konfigurieren, setzt jedoch voraus, dass Sie die Syntax der System-Unit-Dateien kennen.

Pakete versenden Einheitendateien normalerweise in _/lib/systemd/system/_. Diese sind nicht zu bearbeiten. Stattdessen können Sie mit systemd diese Dateien überschreiben, indem Sie in _/etc/systemd/system/_ entsprechende Dateien erstellen.

Für einen bestimmten Service foo würde das Paket _/lib/systemd/system/foo.service_ liefern. Sie können den Status mit _systemctl status foo_ überprüfen oder die Protokolle mit _journalctl -u foo_ anzeigen. Um etwas in der Definition von foo zu überschreiben, gehen Sie wie folgt vor:

_Sudo systemctl edit foo
_

Dies erstellt ein Verzeichnis in _/etc/systemd/system_, das nach dem Gerät benannt ist, und eine _override.conf_ -Datei in diesem Verzeichnis (_/etc/systemd/system/foo.service.d/override.conf_). Sie können Einstellungen hinzufügen oder überschreiben, indem Sie diese Datei (oder andere _.conf_ -Dateien in _/etc/systemd/system/foo.service.d/_) verwenden.

Befehlsargumente überschreiben

Nehmen Sie zum Beispiel den Dienst getty. Angenommen, ich möchte, dass sich mein Benutzer mit TTY2 automatisch anmeldet (dies ist nicht ratsam, sondern nur ein Beispiel). TTY2 wird vom Dienst _[email protected]_ ausgeführt (_tty2_ ist eine Instanz der Vorlage _/lib/systemd/system/[email protected]_). Dazu muss ich den Dienst _[email protected]_ ändern.

_$ systemctl cat [email protected]
# /lib/systemd/system/[email protected]
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service

# If additional gettys are spawned during boot then we should make
# sure that this is synchronized before getty.target, even though
# getty.target didn't actually pull it in.
Before=getty.target
IgnoreOnIsolate=yes

# On systems without virtual consoles, don't start any getty. Note
# that serial gettys are covered by [email protected], not this
# unit.
ConditionPathExists=/dev/tty0

[Service]
# the VT is cleared by TTYVTDisallocate
ExecStart=-/sbin/agetty --noclear %I $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes

# Unset locale for the console getty since the console has problems
# displaying some internationalized messages.
Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=

[Install]
WantedBy=getty.target
DefaultInstance=tty1
_

Insbesondere muss ich die Zeile ExecStart ändern, die derzeit lautet:

_$ systemctl cat [email protected] | grep Exec     
ExecStart=-/sbin/agetty --noclear %I $TERM
_

Um dies zu überschreiben, führen Sie Folgendes aus:

_Sudo systemctl edit [email protected]
_

Und füge hinzu:

_[Service]
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM
_

Beachten Sie, dass:

  1. Ich musste ExecStart explizit deaktivieren, bevor ich es erneut festlegte, da es sich um eine additive Einstellung handelt, die After, Environment (als Ganzes, nicht pro Variable) und EnvironmentFile ähnelt und Einstellungen wie RestartSec oder Type nicht überschreibt. ExecStart kann nur für _Type=oneshot_ -Dienste mehrere Einträge enthalten.
  2. Ich musste die richtige Abschnittsüberschrift verwenden. In der Originaldatei befindet sich ExecStart im Abschnitt _[Service]_, daher muss mein Override ExecStart auch im Abschnitt _[Service]_ einfügen. Wenn Sie sich die eigentliche Servicedatei mit _systemctl cat_ ansehen, erfahren Sie oft, was Sie überschreiben müssen und in welchem ​​Abschnitt sie sich befindet.

Wenn Sie eine systemd-Unit-Datei bearbeiten, müssen Sie normalerweise Folgendes ausführen, damit sie wirksam wird:

_Sudo systemctl daemon-reload
_

_systemctl edit_ erledigt dies jedoch automatisch für Sie.

Jetzt:

_$ systemctl cat [email protected] | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM

$ systemctl show [email protected] | grep ExecS
ExecStart={ path=/sbin/agetty ; argv[]=/sbin/agetty -a muru --noclear %I $TERM ; ... }
_

Und wenn doch:

_Sudo systemctl restart [email protected]
_

und drücke CtrlAltF2Presto! Ich werde auf diesem TTY in meinem Konto angemeldet sein.

Wie ich bereits sagte, ist _[email protected]_ eine Instanz einer Vorlage. Was ist, wenn ich alle Instanzen dieser Vorlage überschreiben möchte? Dies kann durch Bearbeiten der Vorlage selbst erfolgen (Entfernen der Instanzkennung - in diesem Fall _tty2_):

_systemctl edit [email protected]
_

Die Umgebung überschreiben

Ein häufiger Anwendungsfall für _/etc/default_ -Dateien ist das Festlegen von Umgebungsvariablen. Normalerweise ist _/etc/default_ ein Shell-Skript, sodass Sie darin Shell-Sprachkonstrukte verwenden können. Bei systemd ist dies jedoch nicht der Fall. Sie können Umgebungsvariablen auf zwei Arten angeben:

Über eine Datei

Angenommen, Sie haben die Umgebungsvariablen in einer Datei festgelegt:

_$ cat /path/to/some/file
FOO=bar
_

Dann können Sie die Außerkraftsetzung hinzufügen:

_[Service]
EnvironmentFile=/path/to/some/file
_

Insbesondere wenn Ihr _/etc/default/grub_ nur Zuweisungen und keine Shell-Syntax enthält, können Sie es als EnvironmentFile verwenden.

Über Environment Einträge

Das oben Genannte kann auch mithilfe der folgenden Außerkraftsetzung erreicht werden:

_[Service]
Environment=FOO=bar
_

Dies kann jedoch mit mehreren Variablen, Leerzeichen usw. schwierig werden. Schauen Sie sich eine meiner anderen Antworten für ein Beispiel einer solchen Instanz an.

Weitere Lektüre

Über diesen Mechanismus ist es sehr einfach, systemd-Einheiten zu überschreiben und solche Änderungen rückgängig zu machen (indem einfach die Überschreibungsdatei entfernt wird). Dies sind nicht die einzigen Einstellungen, die geändert werden können.

Die folgenden Links wären nützlich:

178
muru