GNU/Linux >> Tutoriels Linux >  >> Linux

Comment gérer les unités systemd au démarrage

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

  1. Page de manuel de Systemd.unit.
  2. Guide des systèmes du projet Fedora.
  3. Description de systemd sur Freedesktop.org.
  4. 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.


Linux
  1. Comment utiliser la commande Systemctl pour gérer les services Systemd

  2. Comment créer un service Systemd sous Linux

  3. Comment gérer les services Linux avec la commande systemctl

  4. Comment puis-je configurer un service systemd pour qu'il redémarre périodiquement ?

  5. Comment activer systemd sur WSL2 :Ubuntu 20 et CentOS 8

Comment gérer les capacités des fichiers Linux

Commandes Systemctl pour gérer le service Systemd

Comment exécuter un script au démarrage dans Debian 11

Comment effacer les journaux de journal Systemd

Comment gérer les bases de données dans MariaDB sur Ubuntu 18.04

CentOS / RHEL 7 :Guide du débutant sur les unités de service systemd