# 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 ```ini [Unit] Description=Script de sauvegarde automatique [Service] ExecStart=/usr/local/bin/backup.sh User=backup [Install] WantedBy=multi-user.target ``` #### Commandes utiles : ```bash 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 ```ini [Unit] Description=Timer de sauvegarde [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=timers.target ``` ```bash 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` : ```ini [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 ```bash 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` : ```ini [Match] Name=enp3s0 [Network] DHCP=yes ``` Activer ensuite le service par ```bash sudo systemctl enable --now systemd-networkd ``` ### Configuration DNS (récursif) Systemd peut agir comme résolveur local avec `systemd-resolved`. Pour activer : ```bash 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 ```bash 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 : ```bash journalctl --user ``` ### Partage de journaux entre machines Via `systemd-journal-remote`, il est possible de centraliser les journaux sur une autre machine. Installation : ```bash sudo apt install systemd-journal-remote ``` Activation : ```bash 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`. ```bash 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) : ```bash bootctl install ``` Dans le fichier de config `/boot/loader/loader.conf`, ajouter la ligne ```ini 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`. ```bash 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 ```bash 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 : ```ini [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. ```ini [Service] Restart=on-failure RestartSec=5s ``` ### Administration à distance Systemd prend en charge `systemd-ssh` ou l'utilisation de `systemctl` à distance via `ssh`. ```bash systemctl --host user@machine status nginx ``` Cela fonctionne à condition d'avoir un accès SSH à la machine distante.