Outils du site

Menu du site


Traductions de cette page:
tech:tech_systemd_systemctl

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.

Les 4 typtes 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

Gestion 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

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

systemctl status [NOM]
(Codes d'état "running", "degraded", "maintenance"… : Voir ci-dessous Diagnostic > "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}

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}

Gestion des unités de type service

Activer ou désactiver un service

systemctl {enable|disable} {NOM}.service

Démarrer, arrêter ou redémarrer un service

systemctl {start|stop|restart} {NOM}.service

Exemples :
systemctl start sshd.service
systemctl start smb.service
systemctl start avahi-daemon.service
systemctl start 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 les services 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

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).

Commentaires

Entrer votre commentaire:
Si vous ne pouvez pas lire le code, téléchargez ce fichier .wav pour l'écouter.
 
tech/tech_systemd_systemctl.txt · Dernière modification: 04/08/2019 23:45 par Médéric