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 comme dev-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.