- Français (fr)
- English (en)
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é :
/usr/lib/systemd/user/
: où résident les unités fournies par les paquets installés~/.local/share/systemd/user/
: où résident les unités fournies par les paquets installés dans le répertoire home/etc/systemd/user/
: où résident les unités système placées par l'administrateur système~/.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 :
- Activation = systemd crée un lien symbolique dans
/etc/systemd/system/…
vers/lib/systemd/system/…
- Désactivation = systemd supprime le lien symbolique dans
/etc/systemd/system/…
afin qu'il ne soit pas exécuté au prochain boot - 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é - Démasquage = systemd supprime le lien symbolique dans
/etc/systemd/system/…
afin qu'il puisse être démarré manuellement ou par dépendance - 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
andAfter=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