312 lines
6.9 KiB
Markdown
312 lines
6.9 KiB
Markdown
# 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.
|