Comment puis-je remplacer ou configurer les services systemd?

66

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

    
posée muru 09.08.2015 - 05:31
la source

1 réponse

115

systemd 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/ . Ce sont pas à éditer. Au lieu de cela, systemd vous permet de remplacer ces fichiers en créant les fichiers appropriés dans /etc/systemd/system/ .

Pour un service donné, foo , le package fournira /lib/systemd/system/foo.service . Vous pouvez vérifier son statut en utilisant systemctl status foo ou afficher ses journaux en utilisant journalctl -u foo . Pour remplacer quelque chose dans la définition de foo , faites:

sudo systemctl edit foo

Cela crée un répertoire dans /etc/systemd/system nommé d'après l'unité et un fichier override.conf 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 fichiers .conf dans /etc/systemd/system/foo.service.d/ ).

Ignorer les arguments de commande

Prenez le service getty par exemple. Disons que je veux avoir une autologin TTY2 pour mon utilisateur (ce n'est pas conseillé, mais juste un exemple). TTY2 est exécuté par le service [email protected] ( tty2 étant une instance du modèle /lib/systemd/system/[email protected] ). Pour ce faire, je dois modifier le service [email protected] .

$ 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

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

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

Pour remplacer cela, faites:

sudo systemctl edit [email protected]

Et ajoutez:

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

Notez que:

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

En général, si vous éditez 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.

Maintenant:

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

Et si je le fais:

sudo systemctl restart [email protected]

et appuyez sur Ctrl Alt F2 , presto! Je serai connecté à mon compte sur ce TTY.

Comme je l’ai déjà dit, [email protected] 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 d'instance - dans ce cas tty2 ):

systemctl edit [email protected]

Remplacement de l'environnement

Un cas d'utilisation courant des fichiers /etc/default est la définition des variables d'environnement. En général, /etc/default est un script shell, vous pouvez donc y utiliser des constructions de langage shell. Avec systemd , 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/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. Consultez 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 les unités systemd , ainsi que d’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:

réponse donnée muru 09.08.2015 - 05:31
la source

Lire d'autres questions sur les étiquettes