⚙️ Gestion des Services avec systemd

Bloc 2 Module 2.2 BTS SIO SISR
FormationBTS SIO option SISR — IRIS Mediaschool
BlocB2 — Administration Systèmes & Réseaux
ModuleM2.2 — Administration Linux
PrérequisMaîtrise du shell Linux (C2.2.1)

🎯 Objectifs

  • Comprendre le rôle de systemd dans le démarrage et la gestion des services Linux
  • Maîtriser les commandes systemctl pour administrer les services
  • Savoir créer et personnaliser un fichier .service
  • Utiliser journalctl pour consulter et filtrer les logs
  • Comprendre les targets, les timers et l'ordonnancement des services

📖 systemd : le gestionnaire de démarrage et services

systemd est le système d'initialisation (init system) utilisé par la quasi-totalité des distributions Linux modernes (Debian, Ubuntu, CentOS, Fedora, Arch…). Il remplace les anciens systèmes comme SysVinit et Upstart.

systemd est le premier processus lancé par le noyau Linux au démarrage (PID 1). Il est responsable de :

  • L'initialisation du système (montage des systèmes de fichiers, réseau, etc.)
  • Le démarrage et l'arrêt des services (démons)
  • La gestion des dépendances entre services
  • La journalisation centralisée des logs
  • La gestion des timers (tâches planifiées)

📖 Les unités systemd

systemd organise tout en unités (units). Chaque unité est définie par un fichier de configuration :

Type d'unitéExtensionDescription
Service.serviceGère un processus démon (Apache, Nginx, SSH…)
Socket.socketActive un service à la demande via un socket réseau/IPC
Timer.timerPlanifie l'exécution d'un service (alternative à cron)
Mount.mountGère le montage d'un système de fichiers
Target.targetRegroupe des unités (équivalent des runlevels)

Les fichiers d'unité sont stockés dans :

  • /usr/lib/systemd/system/ : unités fournies par les paquets (ne pas modifier)
  • /etc/systemd/system/ : unités personnalisées ou surcharges (priorité la plus haute)

📖 Commandes systemctl

systemctl est la commande principale pour interagir avec systemd :

CommandeDescription
systemctl start nginxDémarrer un service
systemctl stop nginxArrêter un service
systemctl restart nginxRedémarrer un service
systemctl reload nginxRecharger la configuration sans redémarrage
systemctl enable nginxActiver le démarrage automatique au boot
systemctl disable nginxDésactiver le démarrage automatique
systemctl status nginxAfficher l'état du service (actif, logs récents)
systemctl is-active nginxVérifier si le service est en cours d'exécution
systemctl is-enabled nginxVérifier si le service est activé au boot
systemctl daemon-reloadRecharger les fichiers d'unité après modification
systemctl list-units --type=serviceLister tous les services chargés
⚠️ Important

Après toute modification d'un fichier .service, exécutez systemctl daemon-reload avant de redémarrer le service. Sans cette commande, systemd utilisera l'ancienne version du fichier.

📖 Anatomie d'un fichier .service

Un fichier service est composé de trois sections principales :

[Unit]
Description=Mon application web personnalisée
Documentation=https://example.com/docs
After=network.target
Requires=postgresql.service

[Service]
Type=simple
User=webapp
Group=webapp
WorkingDirectory=/opt/webapp
ExecStart=/opt/webapp/bin/start.sh
ExecStop=/opt/webapp/bin/stop.sh
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
SectionDirectiveDescription
[Unit]DescriptionDescription lisible du service
AfterDémarrer après cette unité
RequiresDépendance obligatoire
[Service]TypeType de service : simple, forking, oneshot, notify
ExecStartCommande de démarrage
ExecStopCommande d'arrêt
RestartPolitique de redémarrage (always, on-failure, no)
UserUtilisateur d'exécution
[Install]WantedByTarget dans laquelle activer le service

📖 Créer un service personnalisé

Exemple complet : créer un service pour une API Node.js :

# 1. Créer le fichier service
sudo nano /etc/systemd/system/mon-api.service

# 2. Contenu du fichier :
[Unit]
Description=API Node.js - Mon Application
After=network.target

[Service]
Type=simple
User=nodeapp
WorkingDirectory=/opt/mon-api
ExecStart=/usr/bin/node /opt/mon-api/server.js
Restart=always
RestartSec=10
Environment=NODE_ENV=production
Environment=PORT=3000

[Install]
WantedBy=multi-user.target

# 3. Recharger, activer et démarrer
sudo systemctl daemon-reload
sudo systemctl enable mon-api
sudo systemctl start mon-api
sudo systemctl status mon-api

📖 Journalisation avec journalctl

journalctl est l'outil de consultation des logs centralisés de systemd :

CommandeDescription
journalctlAfficher tous les logs
journalctl -u nginxLogs d'un service spécifique
journalctl -u nginx --since "1 hour ago"Logs depuis une date/durée
journalctl -u nginx --since todayLogs du jour
journalctl -p errFiltrer par priorité (emerg, alert, crit, err, warning, notice, info, debug)
journalctl -fSuivre les logs en temps réel (comme tail -f)
journalctl -bLogs du dernier démarrage
journalctl --disk-usageEspace disque utilisé par les logs
💡 Astuce

Combinez les filtres : journalctl -u nginx -p err --since "2024-01-01" --until "2024-01-31" pour cibler précisément les erreurs d'un service sur une période donnée.

📖 Niveaux de run / targets

Les targets systemd remplacent les anciens runlevels de SysVinit :

Runlevel (ancien)Target systemdDescription
0poweroff.targetArrêt du système
1rescue.targetMode rescue (mono-utilisateur)
3multi-user.targetMulti-utilisateur sans GUI
5graphical.targetMulti-utilisateur avec GUI
6reboot.targetRedémarrage
emergency.targetShell d'urgence minimal
# Voir la target par défaut
systemctl get-default

# Changer la target par défaut
sudo systemctl set-default multi-user.target

# Basculer immédiatement vers une target
sudo systemctl isolate rescue.target

📖 Crontab vs systemd timers

Les timers systemd sont une alternative moderne à cron pour planifier des tâches :

CritèreCrontabsystemd timer
ConfigurationFichier unique avec syntaxe spécifiqueDeux fichiers : .timer + .service
LogsLogs via mail ou redirection manuelleJournalisation intégrée avec journalctl
DépendancesNonOui (After, Requires)
PersistanceNon (tâche manquée = perdue)Oui (Persistent=true)
PrécisionÀ la minuteÀ la seconde ou au microseconde
# Exemple de timer : backup quotidien
# /etc/systemd/system/backup.timer
[Unit]
Description=Backup quotidien à 2h du matin

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target

# Activer le timer
sudo systemctl enable --now backup.timer
# Lister les timers actifs
systemctl list-timers

📖 Analyse du démarrage

L'outil systemd-analyze permet de diagnostiquer les performances de démarrage :

# Temps total de démarrage
systemd-analyze

# Détail par service (les plus lents en premier)
systemd-analyze blame

# Chaîne critique de démarrage
systemd-analyze critical-chain

# Générer un graphe SVG du démarrage
systemd-analyze plot > boot.svg

📖 Dépendances et ordonnancement

systemd gère l'ordre de démarrage via des directives de dépendance :

DirectiveDescription
After=Démarrer après l'unité spécifiée (ordonnancement uniquement)
Before=Démarrer avant l'unité spécifiée
Requires=Dépendance forte : si l'unité requise échoue, ce service échoue aussi
Wants=Dépendance faible : si l'unité souhaitée échoue, ce service démarre quand même
BindsTo=Lien fort : le service s'arrête si l'unité liée s'arrête
💡 Astuce

After contrôle uniquement l'ordre de démarrage. Pour garantir qu'un service est bien démarré, combinez avec Requires ou Wants. Exemple : After=network.target + Requires=network.target.

📝 QCM — Testez vos connaissances

  1. Qu'est-ce que systemd ?
  2. Quelle commande démarre un service avec systemd ?
  3. Comment activer un service au démarrage ?
  4. Que contient un fichier .service de systemd ?
  5. Quelle commande affiche les logs d'un service ?
  6. Que remplace systemd par rapport aux anciens systèmes ?
📝 Afficher les corrections
  1. Le système d'initialisation et gestionnaire de services de Linux — systemd est le PID 1 sur la plupart des distributions modernes, il gère le démarrage et les services.
  2. systemctl start nom-du-service — systemctl start/stop/restart/status permettent de gérer les services.
  3. systemctl enable nom-du-service — enable crée un lien symbolique pour que le service démarre automatiquement au boot.
  4. La configuration du service (commande, dépendances, utilisateur) — Les fichiers .service dans /etc/systemd/system/ définissent ExecStart, After, User, Restart, etc.
  5. journalctl -u nom-du-service — journalctl interroge le journal systemd, -u filtre par unité (service), -f suit en temps réel.
  6. SysVinit et Upstart — systemd a remplacé SysVinit (scripts /etc/init.d/) et Upstart pour un démarrage parallèle plus rapide.
💡 À retenir

systemd est le gestionnaire central des services Linux modernes. Maîtrisez systemctl pour gérer les services, journalctl pour les logs, et sachez créer vos propres fichiers .service. Les timers systemd remplacent avantageusement cron pour les tâches planifiées.

← Cours précédent Cours suivant →