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 :
[Unit]Description=OpenBSD Secure Shell serverDocumentation=man:sshd(8) man:sshd_config(5)After=network.target auditd.serviceConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]EnvironmentFile=-/etc/default/sshExecStartPre=/usr/sbin/sshd -tExecStart=/usr/sbin/sshd -D $SSHD_OPTSExecReload=/usr/sbin/sshd -tExecReload=/bin/kill -HUP $MAINPIDKillMode=processRestart=on-failureRestartPreventExitStatus=255Type=notifyRuntimeDirectory=sshdRuntimeDirectoryMode=0755
[Install]WantedBy=multi-user.targetAlias=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.
- [Unit] : Cette section contient les métadonnées et les conditions de démarrage du service.
- [Service] : Cette section précise comment exécuter et gérer le service SSH.
- [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 :
systemctl list-unit-files --type=serviceUNIT FILE STATE VENDOR PRESETaccounts-daemon.service enabled enabledapparmor.service enabled enabledapt-daily-upgrade.service static -apt-daily.service static -apt-news.service static -autovt@.service alias -binfmt-support.service enabled enabledblk-availability.service enabled enabledchrony.service masked enabledchronyd.service masked enabledcockpit-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 :
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 :
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 :
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 :
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 :
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 :
● 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]: OKdé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/EXCEPTIONdé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 :
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 :
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 :
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 readydéc. 06 08:58:24 internal systemd[1]: Reloading Fail2Ban Service...déc. 06 08:58:24 internal fail2ban-client[184816]: OKdé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/EXCEPTIONdé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]: OKdé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 :
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.shType=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 :
sudo systemctl daemon-reload
Ensuite, vous pouvez activer le service pour qu’il démarre au démarrage du système :
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 :
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é.
systemd-analyze blame44.099s apt-daily-upgrade.service36.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.