Aller au contenu

Maitriser la gestion des services Linux avec systemd

Mise à jour :

Systemd a révolutionné la gestion des services dans l’écosystème Linux, apportant une approche plus cohérente et intégrée par rapport aux systèmes d’initialisation antérieurs. Au cœur de systemd se trouve systemctl, un outil de commande puissant qui simplifie la gestion des services, des processus d’arrière-plan et même du démarrage du système lui-même.

Fondamentaux sur les Services Systemd

J’ai écrit un article sur ce qu’est systemd, que vous pouvez consulter ici.

Fichiers de Configuration des Services

Chaque service ou unité géré par systemd est décrit par un fichier de configuration spécifique. Ces fichiers contiennent des informations essentielles sur le service, telles que son nom, son exécutable, ses dépendances, etc. Les fichiers de configuration des services peuvent être situés dans plusieurs emplacements, notamment :

  • /etc/systemd/system/ : Pour les fichiers de configuration système qui affectent tous les utilisateurs.
  • /usr/lib/systemd/system/ : Pour les fichiers de configuration système fournis par les packages de la distribution.
  • ~/.config/systemd/user/ : Pour les fichiers de configuration spécifiques à l’utilisateur.

Ces fichiers de configuration permettent de personnaliser le comportement des services et de définir des options spécifiques. Un exemple de service :

/usr/lib/systemd/system/ssh.service
[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
Alias=sshd.service

Ce fichier d’unité ssh.service est divisé en trois catégories principales, chacune avec un rôle spécifique dans la configuration et le comportement du service SSH sous systemd.

  1. [Unit] : Cette section contient les métadonnées et les conditions de démarrage du service.
  2. [Service] : Cette section précise comment exécuter et gérer le service SSH.
  3. [Install] : Cette section configure l’intégration du service dans le système.

Ces sections permettent à systemd de gérer SSH avec des règles précises pour l’activation, l’exécution et l’intégration du service dans le système.

États d’un Service

Avant de plonger dans les commandes systemctl, il est essentiel de comprendre les états d’un service dans systemd. Un service peut se trouver dans l’un des états suivants :

  • Actif (active) : Le service est en cours d’exécution et fonctionne correctement.
  • Inactif (inactive) : Le service est arrêté et n’est pas en cours d’exécution.
  • Échec (failed) : Le service a rencontré un problème et a échoué.
  • Masqué (masked) : Le service est masqué, ce qui signifie qu’il ne peut pas être activé ou démarré.
  • Alias (alias) : L’unité est un alias vers une autre unité. Elle ne peut pas être démarrée indépendamment.
  • Statique (static) : L’unité est statique, ce qui signifie qu’elle ne peut pas être activée ou désactivée.
  • Désactivé (disabled) : Le service est désactivé et ne sera pas démarré au démarrage.

Les Commandes systemctl

Maintenant que nous avons acquis une compréhension des services systemd, plongeons dans les commandes systemctl, qui sont essentielles pour la gestion des services et des unités.

Liste des Services

Pour lister les différents services disponibles, vous pouvez utiliser la commande suivante :

Terminal window
systemctl list-unit-files --type=service
UNIT FILE STATE VENDOR PRESET
accounts-daemon.service enabled enabled
apparmor.service enabled enabled
apt-daily-upgrade.service static -
apt-daily.service static -
apt-news.service static -
autovt@.service alias -
binfmt-support.service enabled enabled
blk-availability.service enabled enabled
chrony.service masked enabled
chronyd.service masked enabled
cockpit-motd.service static -
cockpit-wsinstance-http.service static -
cockpit-wsinstance-https-factory@.service static -

Cette commande affichera une liste de tous les fichiers d’unité de type service présents sur votre système, montrant s’ils sont activés ou désactivés.

Démarrer un Service

La commande systemctl start est utilisée pour démarrer un service. Par exemple, pour démarrer le service Apache, vous pouvez utiliser la commande suivante :

Terminal window
sudo systemctl start apache2.service

Arrêter un Service

Pour arrêter un service en cours d’exécution, vous pouvez utiliser la commande systemctl stop. Par exemple, pour arrêter le service Apache, utilisez :

Terminal window
sudo systemctl stop apache2.service

Redémarrer un Service

Lorsque vous avez apporté des modifications à la configuration d’un service, il peut être nécessaire de le redémarrer pour que les changements prennent effet. La commande systemctl restart permet de redémarrer un service. Par exemple, pour redémarrer le service Nginx :

Terminal window
sudo systemctl restart nginx.service

Activer un Service au Démarrage

Lorsque vous souhaitez qu’un service démarre automatiquement avec le système au démarrage, vous pouvez l’activer à l’aide de la commande systemctl enable. Par exemple, pour activer le service SSH :

Terminal window
sudo systemctl enable ssh.service

Désactiver un Service au Démarrage

Si vous ne voulez plus qu’un service démarre automatiquement au démarrage, vous pouvez le désactiver avec la commande systemctl disable. Par exemple, pour désactiver le service MySQL :

Terminal window
sudo systemctl disable mysql.service

Vérifier l’État d’un Service

Pour vérifier l’état d’un service, utilisez la commande systemctl status. Elle vous fournira des informations détaillées sur l’état actuel du service, notamment s’il est actif, inactif ou en échec. Par exemple :

Terminal window
fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-12-06 08:42:17 CET; 23h ago
Docs: man:fail2ban(1)
Main PID: 179095 (fail2ban-server)
Tasks: 5 (limit: 21485)
Memory: 13.3M
CPU: 15.801s
CGroup: /system.slice/fail2ban.service
└─179095 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
déc. 06 08:58:24 internal systemd[1]: Reloading Fail2Ban Service...
déc. 06 08:58:24 internal fail2ban-client[184816]: OK
déc. 06 08:58:24 internal systemd[1]: Reloaded Fail2Ban Service.
déc. 06 09:16:03 internal systemd[1]: Reloading Fail2Ban Service...
déc. 06 09:16:03 internal fail2ban-client[189091]: 2023-12-06 09:16:03,519 fail2ban [189091]: ERROR Failed during configuration: While reading f>
déc. 06 09:16:03 internal systemd[1]: fail2ban.service: Control process exited, code=exited, status=255/EXCEPTION
déc. 06 09:16:03 internal systemd[1]: Reload failed for Fail2Ban Service.
déc. 06 09:17:31 internal systemd[1]: Reloading Fail2Ban Service...
déc. 06 09:17:31 internal fail2ban-client[189879]: OK

Recharger la Configuration

Lorsque vous apportez des modifications aux fichiers de service systemd, vous devez recharger la configuration pour que systemd prenne en compte les changements. Utilisez la commande systemctl daemon-reload pour cela :

Terminal window
sudo systemctl daemon-reload

Journalisation et Dépannage

La gestion des services ne se limite pas seulement à les démarrer et les arrêter, elle implique également de surveiller leur comportement, de diagnostiquer les problèmes et de dépanner les éventuelles erreurs. Cette section se penche sur la journalisation avec journalctl et sur les méthodes de dépannage courantes.

Journalisation avec journalctl

Systemd introduit une approche centralisée de la journalisation à l’aide de l’outil journalctl. Cela signifie que toutes les informations de journalisation des services et du système sont accessibles depuis une seule source. Pour consulter le journal d’un service spécifique, utilisez la commande suivante :

Terminal window
journalctl -u nom_du_service

Cette commande affichera les entrées de journal associées à ce service, ce qui est précieux pour le dépannage.

Filtrer les Entrées du Journal

journalctl offre une variété d’options de filtrage pour affiner les résultats de la journalisation. Vous pouvez filtrer par date, niveau de gravité, utilisateur, etc. Par exemple, pour afficher les entrées de journal du service Apache depuis hier jusqu’à aujourd’hui :

Terminal window
journalctl -u fail2ban.service --since yesterday --until today 07:45:04
déc. 06 08:42:17 internal systemd[1]: Started Fail2Ban Service.
déc. 06 08:42:17 internal fail2ban-server[179095]: Server ready
déc. 06 08:58:24 internal systemd[1]: Reloading Fail2Ban Service...
déc. 06 08:58:24 internal fail2ban-client[184816]: OK
déc. 06 08:58:24 internal systemd[1]: Reloaded Fail2Ban Service.
déc. 06 09:16:03 internal systemd[1]: Reloading Fail2Ban Service...
déc. 06 09:16:03 internal fail2ban-client[189091]: 2023-12-06 09:16:03,519 fail2ban [189091]: ERROR Failed during configuration: While reading f>
déc. 06 09:16:03 internal systemd[1]: fail2ban.service: Control process exited, code=exited, status=255/EXCEPTION
déc. 06 09:16:03 internal systemd[1]: Reload failed for Fail2Ban Service.
déc. 06 09:17:31 internal systemd[1]: Reloading Fail2Ban Service...
déc. 06 09:17:31 internal fail2ban-client[189879]: OK
déc. 06 09:17:31 internal systemd[1]: Reloaded Fail2Ban Service.

Vérification des Erreurs

La journalisation est particulièrement utile pour identifier et résoudre les erreurs. Vous pouvez rechercher les entrées de journal contenant des erreurs en utilisant la commande suivante :

Terminal window
journalctl -p err -u nom_du_service

Cela affichera uniquement les entrées de journal avec un niveau de gravité “error”.

Dépannage des Échecs de Service

Lorsqu’un service échoue au démarrage, journalctl peut être votre meilleur allié pour comprendre la cause du problème. Examinez les messages d’erreur et les détails du journal pour identifier les problèmes potentiels.

Plus d’infos

Vous retrouverez plus d’informations sur la journalisation avec journalctl dans le guide suivant.

Création de Services personnalisés

Systemd offre la possibilité de créer des services personnalisés pour répondre aux besoins spécifiques de votre système. Cette section vous guidera à travers le processus de création de services systemd, vous permettant ainsi de personnaliser le comportement de votre système.

Création d’un Fichier de Service

Pour créer un service personnalisé, commencez par créer un fichier de service systemd. Ces fichiers sont généralement stockés dans le répertoire /etc/systemd/system/. Voici un exemple de fichier de service simple pour un script personnalisé :

[Unit]
Description=Mon Service Personnalisé
After=network.target
[Service]
ExecStart=/usr/bin/mon_script.sh
Type=simple
[Install]
WantedBy=multi-user.target
  • La section [Unit] contient des métadonnées sur le service, telles que sa description et ses dépendances.
  • La section [Service] spécifie comment le service doit être exécuté, y compris le chemin vers l’exécutable.
  • La section [Install] définit comment le service doit être activé au démarrage.

Charger et Activer le Service

Après avoir créé le fichier de service, vous devez le charger dans systemd à l’aide de la commande suivante :

Terminal window
sudo systemctl daemon-reload

Ensuite, vous pouvez activer le service pour qu’il démarre au démarrage du système :

Terminal window
sudo systemctl enable mon_service.service

Démarrer et Gérer le Service

Une fois le service activé, vous pouvez le démarrer avec la commande :

Terminal window
sudo systemctl start mon_service.service

Vous pouvez également l’arrêter, le redémarrer, le désactiver, etc., en utilisant les commandes systemctl que nous avons vues précédemment.

Quelques recommandations

Lors de la création de services personnalisés, voici quelques astuces et bonnes pratiques à garder à l’esprit :

  • Assurez-vous que le chemin vers l’exécutable est correctement spécifié dans le fichier de service.
  • Utilisez des scripts de démarrage ou des programmes fiables et sécurisés.
  • Documentez soigneusement le service en ajoutant des commentaires dans le fichier de service pour expliquer son objectif et ses dépendances.
  • Effectuez des tests approfondis pour vous assurer que le service fonctionne comme prévu.
  • Surveillez régulièrement les journaux du service pour détecter les problèmes potentiels.

En créant des services personnalisés, vous pouvez étendre les fonctionnalités de votre système Linux de manière flexible et adaptée à vos besoins spécifiques. Cependant, assurez-vous de suivre les meilleures pratiques de création et de gestion des services pour garantir la stabilité et la sécurité de votre système.

Sécurité

Voici quelques bonnes pratiques pour maintenir un environnement sécurisé. Tout d’abord, appliquez le principe du moindre privilège, en limitant les permissions des services à ce qui est strictement nécessaire. Utilisez les mécanismes d’isolation offerts par systemd, tels que les cgroups et les namespaces, pour restreindre l’accès et les ressources des services. Limitez également les ressources utilisées par chaque service, comme la mémoire et la CPU, pour éviter qu’un service malveillant ne monopolise les ressources du système.

La journalisation est essentielle : surveillez régulièrement les logs avec journalctl pour détecter toute activité suspecte. Assurez-vous de maintenir le système à jour en appliquant régulièrement les mises à jour de sécurité pour corriger les vulnérabilités. Configurez un pare-feu pour restreindre le trafic réseau aux seules machines autorisées et suivez les bonnes pratiques de gestion des mots de passe et de l’authentification. Enfin, mettez en place un système de surveillance de la sécurité pour identifier et réagir rapidement aux violations ou comportements anormaux.

Optimisation du temps de boot

En plus de journalctl, vous pouvez utiliser systemd-analyze pour analyser les performances de démarrage de votre système. Cette commande vous donne des informations détaillées sur le temps nécessaire au démarrage de chaque unité.

Terminal window
systemd-analyze blame
44.099s apt-daily-upgrade.service
36.972s apt-daily.service
2.941s plocate-updatedb.service
2.014s postfix@-.service
2.006s fstrim.service
1.748s systemd-networkd-wait-online.service
1.231s docker.service
408ms dev-mapper-internal\x2d\x2dvg\x2droot.device

Cette commande vous montrera quelles unités prennent le plus de temps au démarrage, ce qui peut vous aider à identifier les goulots d’étranglement potentiels.

Conclusion

En conclusion, systemd est un outil puissant pour la gestion des services Linux, offrant une grande flexibilité et des fonctionnalités avancées. En comprenant ses concepts fondamentaux et en suivant les meilleures pratiques, vous serez en mesure de gérer efficacement les services sur votre système Linux tout en garantissant la sécurité et la stabilité.

N’oubliez pas que la gestion des services est une compétence essentielle pour tout administrateur système DevOps et elle peut grandement contribuer au bon fonctionnement de votre système.

Plus loin