Systemd est un système init et un gestionnaire de système dans les systèmes Linux et est compatible avec LSB et SysV. Vous pouvez utiliser la suite systemd pour gérer et optimiser les services et les ressources de démarrage du système dans un système Linux. Il s'agit d'un outil pratique permettant aux administrateurs système de mettre leur système en service, d'optimiser les processus, de déboguer et de dépanner les services système.
Cet article s'appuiera sur notre guide de la série systemd et illustrera comment gérer les unités système, monter les systèmes de fichiers, dépanner et vous donner des trucs et astuces lorsque vous travaillez avec des systèmes.
Notre premier guide systemd a souligné pourquoi systemd est un outil pratique pour les administrateurs système Linux. La seconde illustre comment planifier des tâches système avec des minuteurs systemd et automatiser les tâches fastidieuses de démarrage du système.
Démarrage de Linux
En tant qu'utilisateur Linux rétro, j'ai toujours existé (encore) lorsque le système Fedora démarre et que des pages sur des pages de messages de diagnostic défilent avant l'invite de connexion. Ces pages contiennent des informations sur les processus de démarrage en cours, les montages de systèmes de fichiers et bien plus encore. Pour comprendre comment gérer et optimiser les services de démarrage, examinons rapidement ce qui se passe entre le moment où vous appuyez sur le bouton de mise sous tension et l'invite de connexion.
Un processus de démarrage commence par le démarrage matériel qui initialise le matériel du système, le démarrage du système d'exploitation qui charge le noyau, puis systemd et le démarrage de Linux, où systemd prépare les processus du système. Le processus de démarrage commence lorsque le noyau transfère le contrôle de l'hôte au systemd. À ce stade, un administrateur système peut gérer les services, les unités, les sockets, l'activation de D-Bus, suivre les processus, les démons et les points de montage du système de fichiers.
Composants Systemd
Voici quelques éléments de base de la suite logicielle systemd que vous pouvez utiliser pour gérer le démarrage de Linux.
- systemd-boot – un gestionnaire de démarrage UEFI.
- systemd-firstboot :gère l'initialisation des paramètres système de base avant le premier démarrage.
- systemd-logind – un outil de gestion de session.
- systemd-networkd – gère les configurations réseau.
- systemd-sysusers – un outil pour créer des groupes d'utilisateurs système et ajouter des utilisateurs à des groupes au démarrage.
- systemd/Journal :gère la journalisation du système.
- systemd/Timers – minuteurs pour contrôler les fichiers ou les événements .service.
Systemctl
Pour gérer systemd, utilisez la commande systemctl, qui utilise à la fois la fonctionnalité du service SysVinit et chkconfig. Vous pouvez l'utiliser pour gérer les unités système qui sont des représentations des services et des ressources système.
# systemctl daemon-reload
Gestion des unités Systemd
Les unités dans systemd peuvent être des services (.service), des points de montage (.mount), des périphériques (.device) ou des sockets (.socket). Systemctl fournit différentes commandes pour gérer les unités.
Utilisez la commande suivante pour analyser l'état du système :
$ systemctl status #Show system status $ systemctl or #List running units $ systemctl list-units #List running units $ systemctl --failed #List failed units $ systemctl list-unit-files #List installed unit files1 $ systemctl status pid #Show process status for a PID
Utilisez les commandes suivantes pour vérifier l'état de l'unité :
$ systemctl help unit #Show a manual page associated with a unit $ systemctl status unit #Status of a unit $ systemctl is-enabled unit #Check whether a Unit is enabled
Utilisez les commandes suivantes pour démarrer et recharger une unité :
systemctl start unit #start a unit immediately systemctl stop unit #stop a unit immediately systemctl restart unit #restart a unit systemctl reload unit #reload a unit and configurations systemctl daemon-reload #reload systemd manager configuration
Utilisez les commandes suivantes pour masquer une Unité :
systemctl mask unit #mask a Unit to make it impossible to start systemctl unmask unit #Unmask a unit
Utilisez les commandes suivantes pour activer une unité :
systemctl enable Unit #enable a Unit to start automatically at boot systemctl enable --now unit #enable a Unit to start automatically and immediately at boot systemctl disable unit #disable a Unit to no longer start at boot systemctl reenable unit #disable and enable anew
Modification des fichiers d'unité
Linux charge les fichiers Unit à partir de plusieurs emplacements de votre système. Vous pouvez exécuter la commande [systemctl show –property=UnitPath] pour voir la liste complète.
- /usr/lib/systemd/system/ :unités fournies par les packages installés.
- /etc/systemd/system/ :unités installées par l'administrateur système.
Exemple de fichier d'unité :
/etc/systemd/system/unit.d/example_unit.conf [Unit] Requires=new dependency After=new dependency
Gestion des dépendances
Vous pouvez résoudre les dépendances d'unité en concevant correctement les fichiers d'unité.
Par exemple, si l'unité A nécessite l'exécution de l'unité B avant le démarrage de A. Ensuite, ajoutez Requires=B et After=B à la section [Unit] de A.
# /etc/systemd/system/unit.d/example_unit.conf [Unit] Requires=B After=B
Si la dépendance est facultative, ajoutez Wants=B et After=B.
/etc/systemd/system/unit.d/example_unit.conf [Unit] Requires=B After=B Wants=B
Remarque :les dépendances sont placées sur les services et non sur les cibles.
Types de services
Vous pouvez définir différents types de service de démarrage dans un fichier de service personnalisé avec le paramètre Type=dans la section [Service] :
/etc/systemd/system/unit.d/example_unit.conf [Unit] Requires=B After=B Wants=B [Service] Type=simple
- Type=simple (par défaut) :systemd considère que le service démarre immédiatement.
- Type=forking :systemd considère que le service a démarré une fois que le processus a bifurqué et que le parent a quitté.
- Type=oneshot :vous pouvez l'utiliser pour les scripts qui effectuent une seule tâche, puis se terminent. Vous pouvez définir RemainAfterExit=yes pour que systemd puisse toujours considérer le service comme actif après la fin du processus.
- Type=idle :systemd retardera l'exécution du service binaire jusqu'à ce que tous les travaux soient distribués.
- Type=notify :vous pouvez l'utiliser comme Type=simple, mais le démon signalera le systemd lorsqu'il sera prêt.
- Type=dbus :le service est considéré comme prêt lorsque le BusName spécifié apparaît sur le bus système de DBus.
Fichiers d'unité de remplacement
Vous pouvez remplacer un fichier d'unité dans [/usr/lib/systemd/system/] en créant un nouveau fichier d'unité avec un nom similaire et réactiver l'unité pour mettre à jour les liens symboliques.
# systemctl reenable Unit
Vous pouvez également exécuter la commande [# systemctl edit –full Unit] qui ouvre le fichier d'unité dans votre éditeur et le recharge automatiquement lorsque vous avez terminé l'édition.
# systemctl edit --full Unit
Fichiers à déposer
Vous pouvez créer un fichier d'unité d'insertion en créant le répertoire /etc/systemd/system/unit.d/ et placez votre nouveau fichier .conf. Le fichier remplacera ou ajoutera de nouvelles options de configuration. systemd analysera et appliquera ces fichiers au-dessus du fichier Unit d'origine.
Vous pouvez également exécuter la commande suivante [# systemctl edit unit] pour ouvrir le fichier /etc/systemd/system/unit.d/new_override.conf dans un éditeur de texte et recharger automatiquement le fichier Unit.
Annuler les modifications d'un fichier d'unité
Utilisez la commande suivante pour annuler toutes les modifications que vous avez apportées à une unité à l'aide de la commande systemctl edit.
# systemctl revert unit
Ajouter une dépendance supplémentaire à une unité
/etc/systemd/system/unit.d/newcustomdependency.conf [Unit] Requires=new customdependency After=new customdependency
Gestion de l'alimentation
Systemd fournit différentes commandes pour redémarrer ou éteindre votre système.
systemctl reboot #shut down and reboot the system systemctl poweroff #shut down and power-off the system systemctl suspend #suspend the system systemctl hibernate #put the system into hibernation systemctl hybrid-sleep #put the system into hybrid-sleep state
Monter des systèmes de fichiers et des partitions
systemd est chargé de monter les partitions et les systèmes de fichiers spécifiés dans /etc/fstab. Vous pouvez gérer ou monter un système de fichiers en définissant tous les paramètres requis dans un fichier unité. Incluez les détails du système de fichiers et du point de montage. Systemd vous offre plus de flexibilité lorsque vous travaillez avec des unités de montage. Il utilise le fichier /etc/fstab pour la configuration et le montage du système de fichiers. Le processus implique l'utilisation de l'outil systemd-fstab-generator pour créer des unités de montage à partir des données du fichier fstab.
Créer une unité de montage systemd
L'illustration est sur Fedora 33 exécutant un système de fichiers btrfs.
Vérifiez que vous avez de l'espace libre sur le groupe de volumes.
# lsblk
Répertorier les fichiers d'unité de montage disponibles :
[root@foss]# systemctl list-unit-files -t mount OR [root@foss]# systemctl status *mount
Créez un fichier d'unité systemd .mount :
Vérifiez l'UUID du système de fichiers à l'aide de la commande blkid.
[root@foss]# blkid /dev/sda2 /dev/sda2: LABEL="fedoraworkstation33" UUID="688a6af2-xxx-4da4-xxx-878c5b0f063b" UUID_SUB="690a86e7-yyyy-9a92-4bc6-49cca4yyyy8df" BLOCK_SIZE="4096" TYPE="btrfs" PARTUUID="0byyyb88-02"
Créez un nouveau fichier [var-lib-docker.mount] dans le répertoire etc/systemd/system. Ajoutez les données de configuration ci-dessous. Notez que le nom du fichier d'unité et le point de montage doivent être identiques.
# vi /etc/systemd/system/var-lib-docker.mount [Unit] Description=docker mount [Mount] What=/dev/disk/by-uuid/688a6af2-77e1-4da4-bc63-878c5b0f063b Where=/var/lib/docker Type=btrfs Options=defaults [Install] WantedBy=multi-user.target
Notez que l'argument "quoi" peut prendre UUID, LABEL et le chemin d'accès au disque.
La description dans la section [Unité] fournit le nom du montage, affiché avec le systemctl -t mount. Les données de configuration dans la section [Mount] contiennent les mêmes données dans le fichier fstab.
Activez l'unité de montage pour qu'elle démarre après le démarrage :
[root@foss]# systemctl enable var-lib-docker.mount Created symlink /etc/systemd/system/multi-user.target.wants/var-lib-docker.mount → /etc/systemd/system/var-lib-docker.mount.
La commande crée un lien symbolique dans le répertoire /etc/systemd/system, permettant à l'unité de montage d'être montée à tous les démarrages suivants.
Démarrez et montez le système de fichiers :
# systemctl start var-lib-docker.mount
Vérifiez que le système de fichiers a été monté :
# systemctl status var-lib-docker.mount ● var-lib-docker.mount - Docker mount Loaded: loaded (/etc/systemd/system/var-lib-docker.mount; enabled; vendor preset: disabled) Active: inactive (dead) Where: /var/lib/docker What: /dev/disk/by-uuid/688a6af2-77e1-4da4-bc63-878c5b0f063b
Vous pouvez également modifier le fichier d'unité de service docker pour vous assurer que le service ne démarre qu'après l'appel du service de montage.
# cat /usr/lib/systemd/system/docker.service [Unit] Description=docker service unit file After=network.target var-lib-docker.mount # Added mount unit for docker service to wait Requires=docker.socket
Redémarrez et vérifiez l'état de l'unité de service de montage.
# systemctl reboot # systemctl status var-lib-docker.mount
Vérifiez le point de montage [var-lib-docker] :
# mount | grep var-lib-docker
Trucs et astuces
Exécuter un service une fois le réseau opérationnel
Vous pouvez retarder le démarrage d'un service jusqu'à ce que le réseau soit opérationnel en ajoutant les dépendances suivantes à votre fichier .service.
/etc/systemd/system/test_foo.service [Unit] Wants=network-online.target After=network-online.target
De plus, vous pouvez ajouter le nss-lookup.target si un service doit effectuer des requêtes DNS.
/etc/systemd/system/test_foo.service [Unit] Wants=network-online.target After=network-online.target nss-lookup.target ...
Utilisez la commande suivante pour vérifier quel service extrait nss-lookup.target.
# systemctl list-dependencies --reverse nss-lookup.target
Installer les outils de configuration de l'interface graphique systemd
Vous pouvez également travailler avec systemd en utilisant les outils graphiques suivants.
- SystemdGenie - est un outil de gestion systemd basé sur KDE.
- Systemadm - est un navigateur graphique pour les unités systemd.
optimisations systemd
Systemd offre des temps de démarrage rapides de <2s pour les environnements de bureau à jour. Cependant, nous pourrions l'optimiser davantage sans avoir à écrire de code en procédant comme suit :
- Tout d'abord, envisagez de contourner l'initrd si vous en utilisez un dans votre système.
- Envisagez de désactiver SELinux et l'audit en ajoutant selinux=0 sur la ligne de commande du noyau. Cependant, notez que les administrateurs système recommandent de laisser SElinux activé pour des raisons de sécurité.
- Envisagez de désinstaller Syslog et utilisez le journal à la place. Journal est l'outil de journalisation par défaut dans les nouveaux systèmes systemd.
- Si la sortie de votre console est lente, utilisez l'indicateur silencieux sur la ligne de commande et désactivez la journalisation du débogage du système.
- Envisagez de supprimer cron et utilisez plutôt des minuteurs systemd.
- Utilisez un environnement de bureau moderne tel que GNOME 40 qui n'intègre pas ConsoleKit.
- Vérifiez et désactivez tous les processus ou services de démarrage inutiles. Un démarrage du système devient plus rapide si vous démarrez moins de processus au démarrage.
- Veuillez vous débarrasser des services basés sur le shell tels que les scripts d'initialisation SysV et les remplacer par des fichiers d'unité.
- Évitez d'utiliser Type=forking et de classer les dépendances. Au lieu de cela, remplacez-les par socket activation et Type=simple chaque fois que possible. Cela permettra un démarrage des services mieux parallélisé.
Dépannage
Enquêter sur les services défaillants
Utilisez la commande suivante pour rechercher les services systemd qui n'ont pas pu démarrer :
# systemctl --state=failed
Diagnostiquer un service
Vous pouvez également obtenir plus d'informations de dépannage sur un service en définissant la variable d'environnement SYSTEMD_LOG_LEVEL sur debug.
Par exemple, pour exécuter le démon systemd-networkd en mode débogage, ajoutez un fichier d'insertion pour le service et les éléments supplémentaires suivants configurations.
[Service] Environment=SYSTEMD_LOG_LEVEL=debug
Alternativement, vous pouvez définir la variable d'environnement manuellement avec la commande suivante :
# SYSTEMD_LOG_LEVEL=debug /lib/systemd/systemd-networkd
Après avoir terminé votre configuration, redémarrez le service et surveillez le journal du service avec l'option -f/–follow pour afficher tous les journaux.
Journaux système
Les journaux système stockent un historique des activités du système telles que l'heure de démarrage, le lancement des services, les tâches système, les services d'arrière-plan, les activités ayant échoué, etc. Systemd maintient un "catalogue" d'erreurs, de messages, de solutions possibles et met en évidence les contextes critiques dans les messages de journaux qui pourraient passer inaperçus. Vous pouvez consulter les journaux systemd avec la commande journalctl.
$ journalctl --pager-end
L'indicateur –pager-end démarre votre revue de journal à la fin de la sortie journalctl.
Ressources supplémentaires
- Page de manuel de Systemd.unit.
- Guide des systèmes du projet Fedora.
- Description de systemd sur Freedesktop.org.
- Systemd ArchWiki.
Conclusion
systemd fournit un moyen robuste de gérer le démarrage de Linux avec des unités systemd. L'article a mis en évidence différentes manières d'utiliser la commande systemctl pour modifier les fichiers d'unité, gérer les unités systemd. Il a mis en évidence comment créer une nouvelle unité de montage systemd pour monter un nouveau système de fichiers et lui permettre de s'initier au démarrage. Enfin, j'ai partagé quelques conseils d'optimisation systemd et comment dépanner les services défaillants.