Traductions de cette page:

Systemd > systemctl (carte de référence rapide)

systemctl (manpage) – Contrôle le système systemd et le gestionnaire de services.
Ne pas confondre avec sysctl (manpage) – Configureur du noyau Linux.

systemd est un processus d'init controversé qui a été imposé sous de nombreuses distributions GNU/Linux ayant rompu avec la philosophie UNIX (1 programme fait 1 seule chose en optimisant vers la simplicité). L'imposition dans Debian de l'usine à gaz systemd à la place de SysV init et des autres alternatives d'init a conduit à la création de la distribution Devuan et de ses dérivées sans systemd. Mais on n'a pas toujours la chance de travailler sous Devuan. Voici donc une carte de référence rapide de systemctl.

Principe général de systemd : Le fichier d'init SysV /etc/inittab est remplacé par le répertoire /etc/systemd/system/ qui contient des liens symboliques vers des fichiers se trouvant dans /lib/systemd/system/.

En outre, systemd prévoit une configuration complémentaire optionnelle par utilisateur (cf. wiki archlinux) chargée depuis des répertoires listés ci-dessous par ordre de priorité :

  1. /usr/lib/systemd/user/ : où résident les unités fournies par les paquets installés
  2. ~/.local/share/systemd/user/ : où résident les unités fournies par les paquets installés dans le répertoire home
  3. /etc/systemd/user/ : où résident les unités système placées par l'administrateur système
  4. ~/.config/systemd/user/ : où résident les unités placées par l'utilisateur lui-même

Les 4 types d'unités (fichiers stockés dans /lib/systemd/) :

  • Unités de service : *.service
  • Groupes d'unités : *.target
  • Unités de montage : *.mount
  • Unités de socket : *.socket

Commandes de monitoring des unités

Lister les noms de fichier de chaque unité et l'état respectif

systemctl list-unit-files

Chemin vers le fichier : find /lib/systemd/ -name {NOM}

Lister toutes les unités actives en mémoires

systemctl list-units

Lister les unités services actives en mémoires

systemctl list-units --type=service

Lister les unités présentes dans le système

systemctl list-unit-files

Lister les unités services présentes dans le système

systemctl list-unit-files --type=service

État d'une unité ou de toutes les unités

systemctl status [NOM]
(Codes d'état "running", "degraded", "maintenance"… : Voir ci-dessous Diagnostic avec systemctl : systemctl is-system-running)

Exemples :
systemctl status
systemctl status sshd.service

Afficher les dépendances d'une unité et leurs états respectifs

systemctl list-dependencies {NOM}

Commandes de gestion des unités

IMPORTANT :

  1. Activation = systemd crée un lien symbolique dans /etc/systemd/system/… vers /lib/systemd/system/…
  2. Désactivation = systemd supprime le lien symbolique dans /etc/systemd/system/… afin qu'il ne soit pas exécuté au prochain boot
  3. Masquage = systemd crée un lien symbolique dans /etc/systemd/system/… vers /dev/null ce qui inhibe tout démarrage manuel ou par dépendance de l'unité
  4. Démasquage = systemd supprime le lien symbolique dans /etc/systemd/system/… afin qu'il puisse être démarré manuellement ou par dépendance
  5. Un service désactivé ou démasqué peut être démarré manuellement ou automatiquement par dépendance d'un autre service

Attention : systemd peut masquer un service qui n'existe pas (encore) :

root@debian9:~# systemctl mask test.service
Unit test.service does not exist, proceeding anyway.
Created symlink /etc/systemd/system/test.service --> /dev/null.
root@debian9:~# echo $?
0
root@debian9:~# systemctl status test.service
● test.service
   Loaded: masked (/dev/null; bad)
   Active: inactive (dead)
root@debian9:~# systemctl unmask test.service
Removed /etc/systemd/system/test.service.
root@debian9:~# stat /etc/systemd/system/test.service
stat: impossible d'évaluer '/etc/systemd/system/test.service': Aucun fichier ou dossier de ce type

Démarrer ou stoper une unité (non masquée uniquement)

systemctl {start|stop} {NOM_OU_CHEMIN}

Activer ou désactiver une unité (non masquée uniquement)

systemctl {enable|disable} {NOM_OU_CHEMIN}

Masquer ou démasquer une unité

systemctl {mask|unmask} {NOM_OU_CHEMIN}

Démarrer ou stoper une unité service (non masquée uniquement)

systemctl {start|stop} {NOM}.service

Activer ou désactiver une unité service (non masquée uniquement)

systemctl {enable|disable} {NOM}.service

Masquer ou démasquer une unité service

systemctl {mask|unmask} {NOM}.service

Exemples de services :

  • sshd.service
  • smb.service
  • avahi-daemon.service
  • display-manager.service

Recharger la configuration utilisée par un service

systemctl reload {NOM}.service

Recharger le fichier de configuration d'un service

systemctl daemon-reload {NOM}.service

Gestion de certains services au niveau utilisateur

Pour gérer un service fourni au niveau utilisateur, il faut ajouter l'option --user.
Pour désactiver par exemple le service dropbox :
systemctl --user disable dropbox

Émuler /etc/rc.local ou créer un nouveau service

Un script /etc/rc.local n'a aucun sens pour systemd1).

La méthode correcte consiste à créer un nouveau service qui sera exécuté en mode multi-utilisateurs.

Exemple d'un nouveau fichier de configuration /etc/systemd/system/my-startup.service demandant l'exécution du script /usr/local/libexec/my-startup-script :

# /etc/systemd/system/my-startup.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/libexec/my-startup-script

[Install]
WantedBy=multi-user.target

Puis activation de ce nouveau service2) :
systemctl enable my-startup.service

Notes complémentaires de "What is the correct substitute for rc.local in systemd instead of re-creating rc.local" :

  • If your script has a dependency on any other service, including network-online.target, you must declare it. E.g. add a [Unit] section, with the lines Wants=network-online.target and After=network-online.target
  • You don't need to worry about dependencies on "early boot" services - specifically, services that are already ordered before basic.target. Services like my-startup.service are automatically ordered after basic.target, unless they set DefaultDependencies=no
  • If you're not sure whether one of your dependencies is an "early boot" service, one approach is to list the services that are ordered before basic.target, by running systemctl list-dependencies --after basic.target. (Note that's --after, not --before)

Atteindre une cible d'état systemd : arrêt, redémarrage, etc.

Pour systemd, les runlevels n'ont pas de sens. Il faut penser cibles3) (targets).

Arrêter le système puis éteindre via un signal ACPI (équivalent de init 0 et halt)

systemctl poweroff
(Équivalent de : systemctl start poweroff.target --job-mode=replace-irreversibly)

systemctl --force poweroff
Arrêt brutal : systemctl --force --force poweroff

Arrêter le système puis éteindre via une interruption ROM

systemctl halt
(Équivalent de : systemctl start halt.target --job-mode=replace-irreversibly)

systemctl --force halt
Arrêt brutal : systemctl --force --force halt

Redémarrer le système (équivalent de init 6 et reboot)

systemctl reboot
(Équivalent de : systemctl start reboot.target --job-mode=replace-irreversibly)

Redémarrage brutal : systemctl --force --force reboot
Pour certains BIOS (U)EFI, redémarrer dans le setup : systemctl --firmware-setup reboot

Redémarrer le système via kexec

systemctl kexec
(Équivalent de : systemctl start kexec.target --job-mode=replace-irreversibly)

systemctl --force kexec
Redémarrage brutal : systemctl --force --force kexec

Entrer dans le runlevel N (équivalent de init N)

systemctl isolate N
systemctl start isolate.target N

Note : "isolate" est valide seulement pour les commandes start et provoque l'arrêt de toutes les autres unités lorsque l'unité spécifique est démarrée.

Entrer dans l'état systemd par défaut

systemctl isolate default.target

Inventorier les cibles d'états systemd disponibles

root@debian10:~# find /lib/systemd/ -name '*.target'
/lib/systemd/user/shutdown.target
/lib/systemd/user/exit.target
/lib/systemd/user/default.target
/lib/systemd/system/halt.target
/lib/systemd/system/poweroff.target
/lib/systemd/system/shutdown.target
/lib/systemd/system/suspend-then-hibernate.target
/lib/systemd/system/default.target
...

Examen du fichier de configuration cible default.target qui ne fait que requérir d'autre fichiers cibles en tant que dépendances :

root@debian10:~# cat /lib/systemd/system/default.target
#  SPDX-License-Identifier: LGPL-2.1+
#
#  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=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes

Créer une nouvelle cible d'état systemd

TODO…

Diagnostic avec systemctl

1. Connaître l'état global du système :
systemctl is-system-running
Renvoie l'un des mots suivants (exit code) :

  • initializing (>0) : early bootup en cours avant l'exécution de basic.target ou de l'état maintenance
  • starting (>0) : Late bootup en cours
  • running (0) : Le système est complètement opérationnel
  • degraded (>0) : Le système est opérationnel mais une ou plusieurs unités ont défailli
  • maintenance (>0) : Les cibles rescue.target ou emergency.target sont en cours d'éxécution
  • stopping (>0) : Le gestionnaire est en train de s'éteindre
  • offline (>0) : Le gestionnaire n'est pas en fonctionnement
  • unknown (>0) : État indéterminé

2. Afficher brièvement les services en échec de démarrage :
systemctl --failed

2. Ou bien afficher les service en échec en rouge parmi les autres
systemctl --fail

2. Ou bien afficher les services démarrés en ordre inverse, échecs en rouge, non trouvés en jaune :
systemctl -r -p err

3. Afficher les dépendances d'une unité problématique et leurs états respectifs :
systemctl list-dependencies [NAME]

4. Entrer dans l'état systemd par défaut après correction d'un problème au démarrage :
systemctl isolate default.target

Aller plus loin avec systemctl

man systemctl

Commandes connexes

systemd-delta: Affichage des fichiers d'unité remplacés ou modifés

La commande systemd-delta trouve dans le répertoire /etc/systemd/ des fichiers de configuration surchargés par rapport au sous-répertoire correspondant par défaut dans /usr/lib/systemd/.

Cf. doc FR de Red Hat Enterprise Linux : Surveiller les unités remplacées (archive.org)

Exemple :

root@debian9:~# systemd-delta
[EXTENDED]   /lib/systemd/system/systemd-resolved.service → /lib/systemd/system/systemd-resolved.service.d/resolvconf.conf
[MASKED]     /etc/systemd/system/samba-ad-dc.service → /lib/systemd/system/samba-ad-dc.service
[EXTENDED]   /lib/systemd/system/systemd-timesyncd.service → /lib/systemd/system/systemd-timesyncd.service.d/disable-with-time-daemon.conf
[MASKED]     /etc/systemd/system/systemd-fsck-root.service → /lib/systemd/system/systemd-fsck-root.service
[EXTENDED]   /lib/systemd/system/rc-local.service → /lib/systemd/system/rc-local.service.d/debian.conf
 
5 overridden configuration files found.

Types de différence systemd-delta :

  • [MASKED] : Fichiers d'unités masqués, veuillez consulter la Section 9.2.7, « Désactiver un service » pour une description du masquage d'unité.
  • [EQUIVALENT] : Copies non modifiées qui remplacent les fichiers d'origine mais dont le contenu, typiquement les liens symboliques, ne diffère pas.
  • [REDIRECTED] : Fichiers redirigés vers d'autres fichiers.
  • [OVERRIDEN] : Fichiers remplacés et modifiés.
  • [EXTENDED] : Fichiers étendus avec les fichiers .conf dans le répertoire /etc/systemd/system/unit.d/.
  • [UNCHANGED] : Fichiers non modifiés, uniquement affichés lorsque l'option –type=unchanged est utilisée.

systemd-analyze : Mesure de performances du démarrage

Afficher la durée de démarrage du système, sans détail

systemd-analyze

Exemple :

root@debian10:~# systemd-analyze
Startup finished in 3.518s (kernel) + 37.633s (userspace) = 41.151s 
graphical.target reached after 37.612s in userspace

Afficher la durée de démarrage des processus

systemd-analyze blame

Exemple :

root@debian10:~# systemd-analyze blame
         24.292s plymouth-quit-wait.service
          6.302s ModemManager.service
           ...
            14ms systemd-update-utmp-runlevel.service
            12ms sys-fs-fuse-connections.mount
            10ms user-runtime-dir@1000.service

Afficher la durée de démarrage des processus en arborescence

systemd-analyze critical-chain

Exemple :

root@debian10:~# systemd-analyze critical-chain
The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.

graphical.target @37.612s
└─multi-user.target @37.612s
  └─vboxadd-service.service @37.252s +354ms
    └─vboxadd.service @9.348s +27.901s
      └─basic.target @9.272s
        └─paths.target @9.271s
          └─systemd-ask-password-wall.path @3.027s
            └─-.mount @2.839s
              └─systemd-journald.socket @2.880s
                └─system.slice @2.839s
                  └─-.slice @2.839s
2)
(Pour fonctionner, le script /usr/local/libexec/my-startup-script doit bien sûr être exécutable).