Merge branch 'guide_systemd' into 'master'

Guide systemd

See merge request nounous/documentation!23
glevy 2025-07-24 17:45:28 +02:00
commit b61a698bbb
1 changed files with 286 additions and 32 deletions

View File

@ -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 lunité.
Saffiche dans les logs et avec systemctl status.
### Obtenir des adresses IPs.
`After=` : Spécifie lordre de démarrage.
Lunité 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=` : Lunité 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 denvironnement.
### 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
<!-- LocalWords: IPs virtualisation utilisateurices Journalisation daemon
<!-- LocalWords: Systemd Linux
-->
-->
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
```
`$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.