systemd
Einheiten müssen Dateien in nicht befolgen /etc/default
. systemd
ist leicht konfigurierbar, setzt jedoch voraus, dass Sie die Syntax der systemd-Unit-Dateien kennen.
Pakete versenden Einheitendateien normalerweise in /lib/systemd/system/
. Diese dürfen nicht bearbeitet werden. systemd
Ermöglicht Ihnen stattdessen, diese Dateien zu überschreiben, indem Sie entsprechende Dateien in erstellen /etc/systemd/system/
.
Für einen bestimmten Service foo
würde das Paket bieten /lib/systemd/system/foo.service
. Sie können den Status mit überprüfen systemctl status foo
oder die Protokolle mit anzeigen journalctl -u foo
. Um etwas in der Definition von zu überschreiben foo
, mache:
sudo systemctl edit foo
Dadurch wird ein Verzeichnis erstellt, /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
). Mit dieser Datei (oder anderen .conf
Dateien in /etc/systemd/system/foo.service.d/
) können Sie Einstellungen hinzufügen oder überschreiben .
Befehlsargumente überschreiben
Nehmen Sie getty
zum Beispiel den Service. Angenommen, ich möchte, dass mein Benutzer TTY2 automatisch anmeldet (dies ist nicht ratsam, sondern nur ein Beispiel). TTY2 wird vom getty@tty2
Dienst ausgeführt ( tty2
wobei es sich um eine Instanz der Vorlage handelt /lib/systemd/system/getty@service
). Dazu muss ich den getty@tty2
Dienst anpassen .
$ systemctl cat getty@tty2
# /lib/systemd/system/getty@.service
# 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 serial-getty@.service, 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 ExecStart
Zeile ändern , die derzeit ist:
$ systemctl cat getty@tty2 | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
Um dies zu überschreiben, gehen Sie wie folgt vor:
sudo systemctl edit getty@tty2
Und füge hinzu:
[Service]
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM
Beachten Sie, dass:
- Ich musste ausdrücklich klar ,
ExecStart
bevor sie wieder einstellen, da es eine additive Einstellung ist ähnlich After
, Environment
(als Ganze, nicht pro-Variable) und EnvironmentFile
, und im Gegensatz zu überschreiben Einstellungen , wie RestartSec
oder Type
. ExecStart
kann nur für Type=oneshot
Dienste mehrere Einträge enthalten .
- Ich musste die richtige Abschnittsüberschrift verwenden. Befindet sich in der Originaldatei
ExecStart
in der [Service]
Sektion, so muss mein Override auch ExecStart
in der [Service]
Sektion stehen. Wenn Sie sich die eigentliche Servicedatei mit ansehen, systemctl cat
erfahren Sie oft, was Sie überschreiben müssen und in welchem Bereich 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
Tut dies jedoch automatisch für Sie.
Jetzt:
$ systemctl cat getty@tty2 | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM
$ systemctl show getty@tty2 | grep ExecS
ExecStart={ path=/sbin/agetty ; argv[]=/sbin/agetty -a muru --noclear %I $TERM ; ... }
Und wenn doch:
sudo systemctl restart getty@tty2
und drücken Sie CtrlAltF2, presto! Ich werde auf diesem TTY in meinem Konto angemeldet sein.
Wie ich schon sagte, getty@tty2
ist eine Instanz einer Vorlage. Was ist, wenn ich alle Instanzen dieser Vorlage überschreiben möchte? Dies kann durch Bearbeiten der Vorlage selbst geschehen (Entfernen der Instanzkennung - in diesem Fall tty2
):
systemctl edit getty@
Die Umgebung überschreiben
Ein häufiger Anwendungsfall für /etc/default
Dateien ist das Festlegen von Umgebungsvariablen. In der Regel /etc/default
handelt es sich um 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 Ihre /etc/default/grub
nur Zuweisungen und keine Shell-Syntax enthält, können Sie sie als die verwenden EnvironmentFile
.
Über Environment
Einträge
Das oben Genannte kann auch mithilfe der folgenden Außerkraftsetzung erreicht werden:
[Service]
Environment=FOO=bar
Dies kann jedoch bei mehreren Variablen, Leerzeichen usw. schwierig werden. Schauen Sie sich eine meiner anderen Antworten an, um ein Beispiel für eine solche Instanz zu erhalten.
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:
ExecStart=
mit einem leeren Eintrag versehenen Eintrags keinen Kommentar hinterlassen können, der wieExecStart= # Empty line to clear previous entries.
folgt lautet: Dies wird als ein andererExecStart=
Eintrag übernommen und der Liste hinzugefügt. PS. Ich konnte murus Antwort wegen meines schlechten Rufs nicht kommentieren.