Question Comment puis-je remplacer ou configurer les services systemd?


De nombreux scripts d'initialisation sysv utilisaient un fichier correspondant dans /etc/default pour permettre à l'administrateur de le configurer. Les travaux en cours peuvent être modifiés en utilisant .override des dossiers. Comment puis-je remplacer ou configurer des unités systemd, maintenant que systemd est la valeur par défaut dans Ubuntu?


69
2017-08-09 03:31


origine




Réponses:


systemd les unités n'ont pas besoin d'obéir aux fichiers dans /etc/default. systemd est facilement configurable, mais nécessite la connaissance de la syntaxe des fichiers d'unité systemd.

Les paquets envoient des fichiers unitaires généralement en /lib/systemd/system/. Ceux-ci sont ne pas à éditer Au lieu, systemd vous 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 en utilisant systemctl status foo, ou voir ses journaux en utilisant journalctl -u foo. Pour contourner quelque chose dans la définition de foo, faire:

sudo systemctl edit foo

Cela crée un répertoire dans /etc/systemd/system nommé d'après l'unité, et un override.conf fichier dans ce répertoire (/etc/systemd/system/foo.service.d/override.conf). Vous pouvez ajouter ou remplacer des paramètres en utilisant ce fichier (ou autre .conf fichiers dans /etc/systemd/system/foo.service.d/).

Remplacement des arguments de commande

Prendre la getty service par exemple. Disons que je veux avoir une autologin TTY2 pour mon utilisateur (ce n'est pas conseillé, mais juste un exemple). TTY2 est géré par le getty@tty2 un service (tty2 étant une instance du modèle /lib/systemd/system/getty@service). Pour ce faire, je dois modifier le getty@tty2 un service.

$ 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

En particulier, je dois changer le ExecStart ligne, qui est actuellement:

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

Pour remplacer ceci, faites:

sudo systemctl edit getty@tty2

Et ajouter:

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

Notez que:

  1. Je devais explicitement effacer ExecStart avant de le remettre à nouveau, car c'est un réglage additif, similaire à After, Environment (dans son ensemble, pas par variable) et EnvironmentFile, et opposé à des paramètres tels que RestartSec ou Type. ExecStart peut avoir plusieurs entrées uniquement pour Type=oneshot prestations de service.
  2. J'ai dû utiliser l'en-tête de section approprié. Dans le fichier d'origine, ExecStart est dans le [Service] section, donc mon remplacement doit mettre ExecStart dans le [Service] section aussi. Souvent, en regardant le fichier de service réel en utilisant systemctl cat vous dira ce que vous devez remplacer et la section dans laquelle il se trouve.

Habituellement, si vous modifiez un fichier d'unité systemd, pour qu'il prenne effet, vous devez exécuter:

sudo systemctl daemon-reload

cependant, systemctl edit le fait automatiquement pour vous.

À présent:

$ 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 cet ATS.

Comme je le disais avant, getty@tty2 est une instance d'un modèle. Alors, que faire si je voulais remplacer toutes les instances de ce modèle? Cela peut être fait en éditant le modèle lui-même (en supprimant l'identifiant de l'instance - dans ce cas, tty2):

systemctl edit getty@

Contourner l'environnement

Un cas d'utilisation courant de /etc/default Les fichiers définissent les variables d'environnement. Habituellement, /etc/default est un script shell, vous pouvez donc y 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

Disons que vous avez 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/grub ne contient que des affectations et aucune syntaxe de shell, vous pouvez l'utiliser comme EnvironmentFile.

Via Environment entrées

Ce qui précède pourrait également être accompli en utilisant la substitution suivante:

[Service]
Environment=FOO=bar

Cependant, cela peut être compliqué avec plusieurs variables, espaces, etc. Regardez une de mes autres réponses pour un exemple d'une telle instance.

Lectures complémentaires

Grâce à ce mécanisme, il devient très facile de remplacer systemd unités, ainsi que pour annuler ces modifications (en supprimant simplement le fichier de substitution). Ce ne sont pas les seuls paramètres pouvant être modifiés.

Les liens suivants seraient utiles:


118
2017-08-09 03:31



Vous devez effacer la variable avant de la définir pour des services qui ne sont pas du type one-top. Cela a résolu mon problème. - Colin
Quelqu'un peut-il m'indiquer où dans les documents systemd je peux trouver des informations sur "effacer" la valeur héritée avec ExecStart= comme indiqué dans cette réponse? - Mark Edington
@MarkEdington du systemd.service(5) page de manuel, section sur ExecStart: "Sauf si Type = est d'image unique, une seule commande doit être donnée. Lorsque Type = onehot est utilisé, aucune commande ou plus ne peut être spécifiée. Des commandes peuvent être spécifiées en fournissant plusieurs lignes de commande dans la même directive ou cette directive peut être spécifié plus d'une 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 affectations antérieures de cette option n'auront aucun effet. " - muru
@Orient vous pouvez sudo rm le fichier de substitution, puis systemctl daemon-reload, ou tu peux systemctl edit et remplacer tout dans la substitution par des commentaires. Les commentaires dans les fichiers de service commencent par #. - muru
@Orient systemctl revert foo - Ayell