6.9 KiB
Systemd
Systemd est une suite logicielle pour systèmes GNU/Linux. Elle a pour but de standardiser et d'améliorer la gestion du démarrage, des services, des journaux, du réseau, de la virtualisation et plus encore. Ce document introduit certaines fonctionnalités essentielles de Systemd.
Unites de configuration : un format unificateur
Systemd gère différents composants du système à travers des "unités".
Chaque unité est un fichier de configuration situé dans
/etc/systemd/system/
ou /lib/systemd/system/
,
avec l'extension .service
, .timer
, .mount
, etc.
Paramètres courants des unités systemd
Ci-dessous, on détaille quelques unes des lignes les plus fréquemment
rencontrées dans des fichiers de type .service
.
[Unit]
Description=
: Champ texte décrivant l’unité. S’affiche dans les logs et avec systemctl status.
After=
: Spécifie l’ordre de démarrage.
L’unité sera lancée après celle(s) mentionnée(s),
mais cela ne garantit pas que les dépendances seront satisfaites.
Requires=
: L’unité dépend strictement de celle mentionnée.
Si la dépendance échoue à démarrer, celle-ci échoue aussi.
Wants=
: Similaire à Requires=
, mais plus souple :
si la dépendance échoue, cela n'empêche pas le démarrage.
[Service]
ExecStart=
: La commande à exécuter pour démarrer le service.
Obligatoire.
ExecStop=
: (Optionnel)
Commande à exécuter lors de l'arrêt du service.
Restart=
: Définit la politique de redémarrage
(on-failure
, always
, etc.).
RestartSec=
: Temps à attendre avant de relancer
le service après un échec.
User=
: Définit sous quel utilisateur exécuter le service.
WorkingDirectory=
: Répertoire de travail du processus.
Environment=
: Définition de variables d’environnement.
[Install]
WantedBy=
: Indique quand ce service doit être activé automatiquement.
Typiquement multi-user.target
pour les services système.
RequiredBy=
: Comme WantedBy=
, mais avec une dépendance forte.
Dans la suite de ce document, on illustre l'utilisation de ces paramètres par des exemples.
Services
Les services sont les démons ou applications qui tournent en arrière-plan.
Exemple : créer un service simple
[Unit]
Description=Script de sauvegarde automatique
[Service]
ExecStart=/usr/local/bin/backup.sh
User=backup
[Install]
WantedBy=multi-user.target
Commandes utiles :
sudo systemctl start nom_du_service # Démarrage immédiat
sudo systemctl enable nom_du_service # Activation au démarrage
sudo systemctl status nom_du_service # Statut
sudo journalctl -u nom_du_service # Voir les logs
Minuteurs (timers)
Les timers remplacent cron
pour la planification de tâches.
Ils utilisent une unité .timer
couplée à un .service
.
Exemple : lancer backup.service
tous les jours à minuit
[Unit]
Description=Timer de sauvegarde
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl enable backup.timer
sudo systemctl start backup.timer
(Auto)mount
Systemd gère aussi les points de montage statiques ou
dynamiques avec les unités .mount
et .automount
.
Exemple : monter un disque automatiquement
Fichier /etc/systemd/system/data.mount
:
[Unit]
Description=Montage du disque data
[Mount]
What=/dev/sdb1
Where=/mnt/data
Type=ext4
[Install]
WantedBy=multi-user.target
Il faut ensuite l'activer avec
sudo systemctl enable --now data.mount
Configuration réseau
Systemd intègre une configuration réseau via systemd-networkd
et systemd-resolved
.
Ces composants permettent une configuration déclarative et centralisée.
Obtenir des adresses IPs
Créez un fichier /etc/systemd/network/20-wired.network
:
[Match]
Name=enp3s0
[Network]
DHCP=yes
Activer ensuite le service par
sudo systemctl enable --now systemd-networkd
Configuration DNS (récursif)
Systemd peut agir comme résolveur local avec systemd-resolved
.
Pour activer :
sudo systemctl enable --now systemd-resolved
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
Journalisation (logging)
Systemd fournit journald
pour centraliser les logs de tous les services.
Lecture des journaux : les bases
journalctl # Tout le journal
journalctl -u ssh # Pour un service
journalctl -b # Depuis le dernier boot
journalctl --since "2 hours ago"
Espaces de noms (namespaces)
Les journaux peuvent être isolés par service, utilisateur ou conteneur. Pour un utilisateur :
journalctl --user
Partage de journaux entre machines
Via systemd-journal-remote
, il est possible de centraliser les
journaux sur une autre machine.
Installation :
sudo apt install systemd-journal-remote
Activation :
sudo systemctl enable --now systemd-journal-remote
Aspects pratiques (pour utilisateur·ices)
Chiffrement de disque
Systemd supporte systemd-cryptsetup
pour gérer les
volumes chiffrés au démarrage.
Intégration possible avec crypttab
.
echo 'cryptdata UUID=xxx none luks' | sudo tee -a /etc/crypttab
Ajouter ensuite une unité .mount
pour /mnt/data
comme vu plus haut.
Chargeur d'amorçage (bootloader)
Systemd intègre un bootloader systemd-boot
,
simple et rapide, surtout utile avec EFI.
Pour l'installer, lancer la commande (sur les systèmes EFI uniquement) :
bootctl install
Dans le fichier de config /boot/loader/loader.conf
, ajouter la ligne
default $arch
où $arch
pointe vers le fichier boot/loader/entries/$arch.conf
(remplacer arch
par debian
ou nixos
dans les cas courants).
Conteneurisation et virtualisation
Conteneurisation
systemd-nspawn
permet de lancer des conteneurs légers,
similaires à chroot
ou Docker
.
sudo debootstrap stable /var/lib/machines/deb
sudo systemd-nspawn -D /var/lib/machines/deb
Virtualisation
Systemd peut être utilisé avec des outils comme QEMU
ou libvirt
,
mais fournit aussi des commandes comme
machinectl start nom_machine
Gestion des secrets
Systemd 248+ permet de gérer des secrets via LoadCredential=
et SetCredential=
dans les unités,
pour ne pas stocker de secrets en clair dans les fichiers .service
.
Exemple :
[Service]
LoadCredential=token:/etc/secret/token
Environment=API_TOKEN=%d/token
Trucs et astuces
Systèmes dynamiques : gestion des erreurs dans les services
Ajouter Restart=on-failure
dans une unité .service
permet de redémarrer automatiquement en cas de plantage.
[Service]
Restart=on-failure
RestartSec=5s
Administration à distance
Systemd prend en charge systemd-ssh
ou l'utilisation de
systemctl
à distance via ssh
.
systemctl --host user@machine status nginx
Cela fonctionne à condition d'avoir un accès SSH à la machine distante.