diff --git a/outils/logiciels/systemd.md b/outils/logiciels/systemd.md index dad6398..5dc9869 100644 --- a/outils/logiciels/systemd.md +++ b/outils/logiciels/systemd.md @@ -1,57 +1,311 @@ # Systemd -Systemd est une suite logiciel pour systèmes GNU/Linux. Cette suite logiciel -fournit de nombreuses fonctionnalités, notamment pour configurer son OS et -suivre les *daemon*\ s actifs et leurs journaux. +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. -Ce document décrit *certaines* fonctionnalités de Systemd bien choisies, -lesquelles sont jugées intéressantes pour l'administration système ou pour -utilisateurices. Il sera sans doute découpé en plusieurs morceaux s'il devient -trop long. +## Unites de configuration : un format unificateur -## Unités de configuration: un format unifiant. +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. -### Services. +### Paramètres courants des unités systemd -### Minuteurs. +Ci-dessous, on détaille quelques unes des lignes les plus fréquemment +rencontrées dans des fichiers de type `.service`. -### (Auto)mount. +`[Unit]` -## Configuration Réseau. +`Description=` : Champ texte décrivant l’unité. +S’affiche dans les logs et avec systemctl status. -### Obtenir des adresses IPs. +`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. -### Configuration DNS (récursif). +`Requires=` : L’unité dépend strictement de celle mentionnée. +Si la dépendance échoue à démarrer, celle-ci échoue aussi. -## Journalisation. +`Wants=` : Similaire à `Requires=`, mais plus souple : +si la dépendance échoue, cela n'empêche pas le démarrage. -### Lecture des journaux: les bases. +`[Service]` -### Espaces de noms. +`ExecStart=` : La commande à exécuter pour démarrer le service. +Obligatoire. -### Partage de journaux entre machines. +`ExecStop=` : (Optionnel) +Commande à exécuter lors de l'arrêt du service. -## Aspect pratique (pour utilisateurices) +`Restart=` : Définit la politique de redémarrage +(`on-failure`, `always`, etc.). -### Chiffrement de disque. +`RestartSec=` : Temps à attendre avant de relancer +le service après un échec. -### Chargeur d'amorçage. +`User=` : Définit sous quel utilisateur exécuter le service. -## Conteneurisation et virtualisation. +`WorkingDirectory=` : Répertoire de travail du processus. -### Conteneurisation. +`Environment=` : Définition de variables d’environnement. -### Virtualisation. +`[Install]` -## Gestion des secrets. +`WantedBy=` : Indique quand ce service doit être activé automatiquement. +Typiquement `multi-user.target` pour les services système. -## Trucs et astuces. +`RequiredBy=` : Comme `WantedBy=`, mais avec une dépendance forte. -### Systèmes dynamiques: gestion des erreurs dans les services. +Dans la suite de ce document, on illustre l'utilisation de ces paramètres +par des exemples. -### Administration à distance. +### 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.