systemd est le système d’initialisation adopté par toutes les dernières distributions Linux. Tout comme Upstart, il est basé sur des événements, ce qui rend son fonctionnement souple et dynamique. Il permet un démarrage en parallèle des processus avec une gestion très fine des dépendances. Il peut même redémarrer un processus qui se serait arrêté par erreur, gérer la planification des tâches, les logs système, les périphériques et plus encore.
Dans ce chapitre, vous allez apprendre à utiliser les principales fonctions de systemd relatives à la gestion des processus.
Gérez le démarrage et l’arrêt de vos processus
systemd est fourni avec la commande systemctl
qui permet de gérer les “unités” (units, en anglais). Pour systemd, unité est un terme générique qui désigne tout objet sur lequel il va pouvoir agir. Les unités peuvent être de différents types : service, montage, périphérique, etc. Les daemons sont de type “service”. Vous appréhenderez d’autres types d’unités dans la suite de ce chapitre.
Dans le cours “Montez un serveur de fichiers sous Linux”, vous aviez déjà utilisé la commande systemctl
pour lancer les serveurs Samba et NFS. Par exemple, vous aviez démarré Samba par la commande :
sudo systemctl start smbd
De la même façon, vous pouvez arrêter le serveur smbd
par la commande :
sudo systemctl stop smbd
D’autres actions possibles sont :
restart
pourstop
puisstart
en une seule commande ;reload
pour mettre à jour la configuration sans couper le service (pour les services qui en sont capables) ;status
pour connaître l’état de votre service ;enable
pour lancer le service au démarrage ;disable
pour ne pas lancer le service au démarrage.
Si vous lancez la commande systemctl
sans argument, ça équivaut à lancer la commande suivante qui liste toutes les unités “actives” :
systemctl list-units
Vous voyez qu’il y a beaucoup d’unités de toutes sortes. Si vous cherchez le nom exact d’un service à lancer, vous pouvez filtrer cette liste pour n’afficher que les unités de type “service” :
systemctl list-units --type=service
Vous voyez que toutes les unités se terminent par “.service”. C’est parce que la configuration de chaque unité est définie dans un fichier dont le nom est du type NOM_DE_L_UNITE.TYPE_DE_L_UNITE. Presque tous les fichiers des unités sont dans /lib/systemd/system
, mais en fait vous n’avez pas besoin de connaître l’emplacement réel des fichiers car la commande systemctl
permet de lire et d’éditer les fichiers d’unité. Je ne vais pas rentrer dans le détail de la syntaxe de ces fichiers, mais sachez que vous pouvez afficher le contenu du fichier unité smbd.service
par la commande :
systemctl cat smbd.service
Vous pouvez également éditer cette configuration par la commande :
sudo systemctl edit smbd.service
Cette commande ne va pas réellement modifier le fichier original, mais plutôt créer un fichier de “surcharge” qui aura la priorité sur le fichier original. L’avantage est de pouvoir revenir à la configuration par défaut en cas de besoin, en supprimant cette surcharge. ;)
Si vous savez ce que vous faites et voulez éditer directement le fichier de configuration, utilisez la commande :
sudo systemctl edit --full smbd.service
Si vous devez éditer un fichier unité de systemd, vous devrez ensuite faire prendre en compte vos changements au système par la commande :
sudo systemctl daemon-reload
Je vais maintenant vous parler des unités de type “target” qui remplacent les runlevels de systemV.
Utilisez les targets, évolution des runlevels de systemV
Vous pouvez afficher la liste des unités de type “target” par la commande :
sudo systemctl list-units --type target --all
Le terme anglais “target” signifie “cible”. Il permet d’amener le système à un certain état cohérent. À la différence des runlevels, vous voyez qu’il peut y avoir plusieurs targets actives en même temps.
Certaines de ces targets, comme swap.target
, correspondent plutôt à des fonctions du système qu’on peut activer ou non, et d’autres, comme graphical.target
, correspondent à des états cohérents du système qui ont pour dépendances les différentes autres targets. Vous pouvez d’ailleurs afficher la liste des dépendances d’une unité par la commande :
sudo systemctl list-dependencies graphical.target
Vous voyez ainsi toutes les targets et autres unités dont dépend graphical.target
.
Vous pouvez voir la target par défaut par la commande :
sudo systemctl get-default
Vous pouvez changer de target par la sous-commande isolate
. Par exemple, la commande suivante permet de passer en mode de secours (sans réseau, seulement root connecté) :
sudo systemctl isolate rescue.target
Vous pouvez fixer graphical.target
comme target par défaut, par la commande :
sudo systemctl set-default graphical.target
Une des nouveautés de systemd par rapport à ses prédécesseurs est la possibilité de pouvoir gérer les fichiers de logs par la commande journalctl
.
Gérez vos logs avec journalctl
Par défaut, la commande journalctl
affiche tous les logs gérés par systemd par ordre chronologique :
sudo journalctl
Vous pouvez choisir de n’afficher les logs que depuis le dernier démarrage du système, par la commande :
sudo journalctl -b
ou n’afficher que les logs du kernel depuis le dernier démarrage (équivalent de la commande dmesg
) par :
sudo journalctl -b -k
Vous pouvez aussi choisir d’afficher uniquement les logs d’un service (ici smbd.service
) ou d’une unité en particulier, par la commande :
sudo journalctl -u smbd.service
systemd est un élément central du fonctionnement de toutes les dernières distributions Linux, et il est probable qu’il prenne encore plus d’importance dans le futur. Il est donc important d’être familier avec ce système.
En résumé
systemd gère des unités qui peuvent être de différents types.
La gestion des unités se fait par la commande
systemctl
.Vous pouvez démarrer vos services par la commande
systemctl start SERVICE_NAME
.Les targets de systemd ont succédé aux runlevels de systemV.
Vous pouvez gérer vos logs système par la commande
journalctl
.
Dans le prochain chapitre, vous apprendrez pourquoi et comment mettre en place un serveur de temps sur votre serveur.