documentation/outils/logiciels/systemd.md

312 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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 lunité.
Saffiche dans les logs et avec systemctl status.
`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.
`Requires=` : Lunité 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 denvironnement.
`[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
```
`$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.