Comment remplacer ou configurer les services systemd?

110

De nombreux scripts sysv init utilisaient un fichier correspondant /etc/defaultpour permettre à l'administrateur de le configurer. Les travaux Upstart peuvent être modifiés à l'aide de .overridefichiers. Comment remplacer ou configurer des unités systemd, maintenant que systemd est la valeur par défaut dans Ubuntu?

muru
la source
Notez que lorsque vous effacez le texte ExecStart=avec une entrée vide, vous ne pouvez pas ajouter de commentaire après: ExecStart= # Empty line to clear previous entries.Cela sera considéré comme une autre ExecStart=entrée et sera ajouté à la liste. PS Je ne pouvais pas ajouter de commentaire à la réponse de Muru à cause de ma mauvaise réputation.
tysik

Réponses:

186

systemdles unités ne doivent pas obéir aux fichiers en /etc/default. systemdest facilement configurable, mais nécessite que vous connaissiez la syntaxe des fichiers unité systemd.

Les colis expédient généralement des fichiers d'unité au format /lib/systemd/system/. Ceux-ci ne doivent pas être édités. À la place, systemdvous permet de remplacer ces fichiers en créant les fichiers appropriés dans /etc/systemd/system/.

Pour un service donné foo, le paquet fournirait /lib/systemd/system/foo.service. Vous pouvez vérifier son statut à l'aide de systemctl status fooou afficher ses journaux à l'aide de journalctl -u foo. Pour remplacer quelque chose dans la définition de foo, faites:

sudo systemctl edit foo

Cela crée un répertoire /etc/systemd/systemnommé d'après l'unité et un override.conffichier dans ce répertoire ( /etc/systemd/system/foo.service.d/override.conf). Vous pouvez ajouter ou remplacer des paramètres à l'aide de ce fichier (ou d'autres .conffichiers contenus dans /etc/systemd/system/foo.service.d/).

Remplacement des arguments de commande

Prenez le gettyservice par exemple. Dites que je veux avoir TTY2 connexion automatique à mon utilisateur (ce n'est pas conseillé, mais juste un exemple). TTY2 est exécuté par le getty@tty2service ( tty2en tant qu'instance du modèle /lib/systemd/system/getty@service). Pour ce faire, je dois modifier le getty@tty2service.

$ systemctl cat getty@tty2
# /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

En particulier, je dois changer la ExecStartligne, qui est actuellement:

$ systemctl cat getty@tty2 | grep Exec     
ExecStart=-/sbin/agetty --noclear %I $TERM

Pour annuler cela, faites:

sudo systemctl edit getty@tty2

Et ajouter:

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

Notez que:

  1. Je devais explicitement clair ExecStartavant de nouveau, car il est un paramètre additif, semblable à After, Environment(dans son ensemble, et non par variable) et EnvironmentFile, et opposés aux paramètres comme remplaçant RestartSecou Type. ExecStartpeut avoir plusieurs entrées que pour les Type=oneshotservices.
  2. Je devais utiliser le bon en-tête de section. Dans le fichier d'origine, se ExecStarttrouve dans la [Service]section, mon remplacement doit donc également figurer ExecStartdans la [Service]section. Souvent, consulter le fichier de service réel systemctl catvous indiquera ce que vous devez remplacer et dans quelle section il se trouve.

Habituellement, si vous éditez un fichier unité systemd pour que celui-ci prenne effet, vous devez exécuter:

sudo systemctl daemon-reload

Cependant, systemctl editcela le fait automatiquement pour vous.

Maintenant:

$ 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 ; ... }

Et si je le fais:

sudo systemctl restart getty@tty2

et appuyez sur CtrlAltF2, hop! Je serai connecté à mon compte sur ce téléscripteur.

Comme je l'ai dit précédemment, getty@tty2est une instance d'un modèle. Alors, si je voulais remplacer toutes les instances de ce modèle? Cela peut être fait en modifiant le modèle lui-même (en supprimant l'identifiant d'instance - dans ce cas tty2):

systemctl edit getty@

Dépasser l'environnement

Un cas d'utilisation courant de /etc/defaultfichiers est la définition de variables d'environnement. Habituellement, /etc/defaultc'est un script shell, vous pouvez donc utiliser des constructions de langage shell. Avec systemd, cependant, ce n'est pas le cas. Vous pouvez spécifier des variables d'environnement de deux manières:

Via un fichier

Supposons que vous ayez défini les variables d'environnement dans un fichier:

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

Ensuite, vous pouvez ajouter à la substitution:

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

En particulier, si votre /etc/default/grubne contient que des assignations et aucune syntaxe de shell, vous pouvez l’utiliser comme EnvironmentFile.

Via les Environmententrées

Ce qui précède pourrait également être accompli en utilisant le remplacement suivant:

[Service]
Environment=FOO=bar

Cependant, cela peut devenir délicat avec plusieurs variables, espaces, etc. Jetez un coup d'œil à l' une de mes autres réponses pour obtenir un exemple d'un tel exemple.

Lectures complémentaires

Grâce à ce mécanisme, il devient très facile de remplacer des systemdunités, ainsi que d'annuler de telles modifications (en supprimant simplement le fichier de substitution). Ce ne sont pas les seuls paramètres qui peuvent être modifiés.

Les liens suivants seraient utiles:

muru
la source
1
Vous devez effacer la variable avant de la définir pour des services qui ne sont pas du type onehot. Cela a résolu mon problème.
Colin
3
@MarkEdington à partir de la systemd.service(5)page de manuel , section ExecStart: "À moins que Type = onehot, une seule commande doit être donnée. Lorsque Type = onehot est utilisé, vous pouvez spécifier zéro ou plusieurs commandes. Vous pouvez spécifier des commandes en fournissant plusieurs lignes de commande directive ou cette directive peut être spécifiée plusieurs fois avec le même effet. Si la chaîne vide est affectée à cette option, la liste des commandes à démarrer est réinitialisée, les attributions précédentes de cette option n'auront aucun effet. "
muru
1
@Orient vous pouvez utiliser sudo rmle fichier de remplacement, puis systemctl daemon-reloadvous pouvez systemctl edittout remplacer dans le remplacement par des commentaires. Les commentaires dans les fichiers de service commencent par #.
Muru
3
@Orientsystemctl revert foo
Ayell
1
Quel est l'ordre de priorité des trois méthodes (fichier de substitution, fichier d'environnement, variable d'environnement)? C'est-à-dire, pour une variable définie dans les trois valeurs, quelle valeur sera la valeur effective?
Nikolaos Kakouros le