systemd
systemd est un gestionnaire système radicalement différent des systèmes de gestion de l'espace utilisateur (initialisation, services) comme sysvinit
, que 0linux a toujours utilisé via des scripts d'initialisation de type BSD (/etc/rc.d/rc.*
) en conjonction avec udev
. systemd
tend à standardiser la configuration des systèmes Linux mais force à s'approprier de nouvelles commandes, de nouvelles syntaxes et à revoir toute la conception des plus profonds mécanismes du système. La migration est cela dit bien moins douloureuse qu'elle n'y paraît et simplifie grandement de nombreux aspects tout en conservant les pratiques admises par le plus grand nombre de distributions.
systemd a été abandonné dans 0Linux au profit des traditionnels scripts d'initialisation « à la BSD ».
Configuration système
Nom d'hôte
Le nom d'hôte est spécifié dans le fichier /etc/hostname
, dans sa forme simple, sans nom de domaine. On peut spécifier un nom de domaine avec hostnamectl
hostnamectl set-hostname monnomdhote
Contenu du fichier :
- hostname
monnomdhote
Langue et localisation
La langue du système par défaut est spécifiée dans le fichier /etc/locale.conf
. On peut spécifier les variables de localisation ainsi :
localectl set-locale LANG="fr_FR.UTF-8" LC_ALL="fr_FR.UTF-8"
Contenu du fichier :
- locale.conf
LANG="fr_FR.UTF-8" LC_ALL="fr_FR.UTF-8"
Console virtuelle
La console virtuelle contenant les différents terminaux se paramètre dans le fichier /etc/vconsole.conf
. Il spécifie la disposition du clavier par défaut dans les terminaux en mode texte (les tty
). On peut spécifier chaque paramètre avec la commande suivante, par exemple pour spécifier la disposition du clavier en mode console :
localectl set-keymap fr-latin9
Et pour spécifier la disposition du clavier en mode graphique sous X :
localectl set-x11-keymap fr-latin9
Contenu du fichier :
- vconsole.conf
KEYMAP=fr-latin9 FONT=lat9w-16
Horloge système
L'horloge système, basée sur un fuseau horaire donné, se configure via la création d'un lien symbolique nommé /etc/localtime
pointant sur un fichier de fuseau horaire se trouvant sous /usr/share/zoneinfo/
. La commande timedatectl
permet d'automatiser cette procédure :
timedatectl set-timezone Europe/Paris
On peut bien évidemment continuer à créer ce lien manuellement :
ln -sf ../usr/share/zoneinfo/Europe/Paris /etc/localtime
Modules noyau
udev
, faisant désormais partie intégrante de systemd
, gère le chargement automatique des modules noyau au fonctionnement du système. On peut cependant avoir à forcer ou empêcher le chargement de certains modules.
Les modules à charger au démarrage de façon non standard sont spécifiés dans le répertoire /etc/modules-load.d/
sous forme de simples fichiers texte, chaque module figurant sur une ligne dédiée. Les ligne de commentaires doivent commencer directement par le caractère #
ou ;
.
- /etc/modules-load.d/virtio-net.conf
# On charge le module virtio-net.ko pour la virtualisation du réseau : virtio-net
Voyez man 5 modules-load.d
pour en savoir plus.
Montages
La vérification des systèmes de fichiers à monter avec fsck
et les montages eux-mêmes sont gérés automatiquement. Le fichier /etc/fstab
reste la référence, systemd
s'assurant que chaque service soit d'abord lancé selon le type de montage à effectuer (par exemple : le réseau doit être actif avant de procéder au fsck
et au montage des volumes NFS ou Samba.
Voyez man 5 systemd.mount
pour en savoir plus
Montages automatiques
systemd
peut procéder à la vérification et au montage automatiques de vos partitions au moment même où on y accède la première fois (par exemple pour /home
. Il suffit d'ajouter certaines options dédiées dans le fichier /etc/fstab
, comme par exemple :
noauto,x-systemd.automount
Ceci procèdera à la vérification et au montage lors du premier accès à la partition, le noyau mettant dans sa file d'attente (ou « buffer ») tous les accès aux fichiers, le temps que la partition soit prête.
On peut également appliquer ce genre d'auto-montage aux partitions distantes (NFS, Samba…) avec ces mêmes options dans le fichier /etc/fstab
, en conjonction avec l'option x-systemd.device-timeout=XX
pour spécifier un délai d'attente maximal (ou « timeout »), au cas où le volume (ou le réseau) ne serait pas accessible.
Gestion de l'alimentation
systemd
gère aussi des évènements ACPI pour la gestion de l'alimentation. Ils sont spécifiés dans le fichier /etc/systemd/logind.conf
avec les options suivantes ::
HandlePowerKey=ACTION # spécifie quelle action doit être entreprise lorsque le bouton d'alimentation est enfoncé HandleSuspendKey=ACTION # spécifie quelle action doit être entreprise lorsque le bouton de veille est enfoncé HandleHibernateKey=ACTION # spécifie quelle action doit être entreprise lorsque le bouton de veille prolongée (ou d'hibernation) est enfoncé HandleLidSwitch=ACTION # spécifie quelle action doit être entreprise lorsqu'on referme ou replie l'écran de l'ordinateur
Les actions disponibles sont :
halt hibernate ignore kexec poweroff reboot suspend
Si l'on ne configure pas ces actions, celles de systemd
par défaut sont les suivantes :
HandleHibernateKey=hibernate HandleLidSwitch=suspend HandlePowerKey=poweroff HandleSuspendKey=suspend
systemd
ne gère actuellement pas l'alimentation basée sur les évènements concernant la batterie ou le branchement sur secteur.acpid
est toujours d'actualité pour gérer ces évènements.
Fichiers temporaires
systemd-tmpfiles
utilise les fichiers trouvés sous /usr/lib/tmpfiles.d/
et /etc/tmpfiles.d/
- ce dernier étant prioritaire si le même nom de fichier est trouvé dans ces 2 répertoires - lesquels décrivent comment gérer les fichiers temporaires et autres données volatiles, tels que les répertoires /run
ou /tmp
.
Par exemple, Samba a besoin d'un répertoire existant avec certaines permissions, c'est pourquoi ce fichier est livré avec le paquet samba
, nommé /usr/lib/tmpfiles.d/samba.conf
:
- samba.conf
D /run/samba 0755 root root
Voyez man 5 tmpfiles.d
pour en savoir plus.
Les unités
Une unité, ou fichier de configuration «unit » définit les propriétés de chaque service, socket, point de montage, point de montage automatique, périphérique, fichier d'échange « swap », partition, niveau d'exécution (défini désormais en tant que cible (« target »), système de fichiers, etc. géré par systemd
. La syntaxe est celle de la spécification XDG, similaire à celle qu'on trouve dans les fichiers *.desktop
.
Voyez man 5 systemd.unit
pour en savoir plus.
Utilisation de systemctl
systemd
s'administre et se pilote principalement avec l'outil systemctl
.
Voyez man 1 systemctl
Lister les unités en exécution, au choix:
systemctl
systemctl list-units
Lister les unités qui ont échoué :
systemctl --failed
Les fichiers de chaque unité se trouvent sous /usr/lib/systemd/system/
et /etc/systemd/system/
(ce dernier est également prioritaire). On peut en avoir la liste ainsi :
systemctl list-unit-files
Les unités peuvent concerner des services (*.service
), des points de montage (*.mount
), des périphériques (*.device
) ou des sockets (*.socket
).
On doit invoquer avec systemctl
le nom complet de chaque unité, avec son suffixe, par exemple sshd.socket
bien que certains raccourcis soient disponibles :
- si on ne spécifie aucun suffixe,
systemctl
suppose que le suffixe sera.service
:netcfg
correspond ànetcfg.service
- les points de montage sont convertis à la volée :
/home
équivaut àhome.mount
(ouf !) - les périphériques sont également convertis :
/dev/sda2
sera vu commedev-sda2.device
(et on l'en remercie)
Voyez man systemd.unit
pour en savoir plus.
On démarre une unité, le démarrage étant *immédiat*, comme suit:
systemctl start unité
Et on la stoppe ainsi :
systemctl stop unité
Pour la redémarrer :
systemctl restart unité
On force une unité à relire sa configuration avec reload
:
systemctl reload unité
Pour consulter l'état de l'unité et savoir si elle est toujours exécutée :
systemctl status unité
Vérifier si une unité est activée ou pas:
systemctl is-enabled unité
Activer une unité pour qu'elle se lance au démarrage :
systemctl enable unité
Désactiver une unité pour l'empêcher de se lancer au démarrage :
systemctl disable unité
Afficher le manuel associé à une unité (le fichier de l'unité doit avoir été prévu à cet usage):
systemctl help unité
Redémarrer systemd
afin de charger une nouvelle configuration, de nouvelles unités, etc. :
systemctl daemon-reload
Redémarrer le système :
systemctl reboot
Arrêter l'ordinateur :
systemctl poweroff
Mettre le système en veille:
systemctl suspend
Mettre le système en veille prolongée (ou « hibernation ») :
systemctl hibernate
systemd et les bureaux
Pour activer la connexion graphique, on doit activer le service de son gestionnaire de connexion favori, ici KDM :
systemctl enable kdm
Les dépendances
systemd
gère les dépendances entre unités. Cela permet en pratique de contrôler l'ordre d'exécution des unités.
Par exemple, si l'unité de sshd
requiert que l'unité réseau network
soit démarrée avant elle, alors l'unité sshd.service
contiendra une ligne Requires=network.service
et une ligne After=network.service
à la section [Unit]
.
Si cette dépendance est optionnelle, les lignes à la section [Unit] seront plutôt Wants=network.service
et After=network.service
. Si la ligne After=
ne figure pas dans le fichier, alors les deux services seront lancés simultanément.
Voyez man systemd.service
pour en savoir plus.
Les cibles (targets)
systemd
utilise des « cibles » ou « targets » pour implémenter, à sa façon, le fonctionnement des niveaux d'exécution traditionnels (« runlevels »). Chaque cible a un nom propre et plusieurs cibles peuvent tout à fait s'exécuter en même temps, certaines cibles pouvant hériter des services démarrés pour une autre cible.
Voir les cibles couramment exécutées :
systemctl list-units --type=target
Voici un tableau de correspondance avec l'ancien système :
Niveau d'exécution | Cible systemd | Notes |
0 | runlevel0.target, poweroff.target | Arrêt de l'ordinateur |
1 | runlevel1.target, rescue.target | mode mono-utilisateur |
2, 4 | runlevel2.target, runlevel4.target, multi-user.target | Mode multi-utilisateur, identique au niveau 3. |
3 | runlevel3.target, multi-user.target | Mode multi-utilisateur en mode texte |
5 | runlevel5.target, graphical.target | Mode multi-utilisateur en mode graphique |
6 | runlevel6.target, reboot.target | Redémarrage de l'ordinateur |
emergency | emergency.target | Mode de secours |
La cible par défaut est default.target
, correspondant également à graphical.target
via un « alias » (l'ancien niveau 4 de 0linux). multi-user.target
et graphical.target
ont tous deux cet alias.
Pour changer la cible par défaut au démarrage :
Avec systemctl
:
systemctl enable multi-user.target
Ou bien en ajoutant directement à la fin de la ligne boot:
lors de l'amorçage de l'ordinateur :
systemd.unit=multi-user.target
Journalisation
systemd
a son propre journal système :
journalctl
Montrer tous les messages noyau et système depuis le début du démarrage :
journalctl -b
Suivre directement les nouveaux message système :
journalctl -f
Voir tous les messages envoyés par un exécutable donné :
journalctl /usr/lib/systemd/systemd
Voir tous les messages envoyés par un processus donné :
journalctl _PID=1
Voir tous les messages affichés par une unité précise :
journalctl -u netcfg
Voyez man journalctl
et man journald.conf
pour en savoir plus.