Table des matières

, ,

Systemd

Systemd est le gestionnaire de système qui remplace upstart et son prédécesseur (les scripts system V) depuis Ubuntu 16.04 LTS Xenial. Le nom de ce programme vient de « system daemon » : le daemon du système
C'est une pièce maîtresse de l'architecture GNU/Linux. En effet, c'est le premier programme lancé par le noyau (il a donc le PID N°1) et il se charge de lancer tous les programmes suivants en ordre jusqu'à obtenir un système opérationnel pour l'utilisateur, selon le mode déterminé (single user, multi-user, graphique). C'est également à lui qu'incombe la tache de redémarrer ou arrêter votre ordinateur proprement.

À la la lecture de l’introduction, il apparaît très clairement que toute modification malencontreuse de l'architecture des services lancés par Systemd peut avoir des conséquences dramatiques sur le fonctionnement de votre ordinateur.
Il faut être très prudent lorsque l'on touche à la configuration de systemd.
Une mauvaise manipulation peut rendre votre système instable, jusqu'à le rendre totalement inutilisable.
Des anciennes versions de Ubuntu propose dans les dépôts le paquet systemd et il est donc possible de l'installer en remplacement de Upstart. Néanmoins, cette manipulation est complexe et extrêmement risquée. Pour cette raison, cette procédure ne sera pas décrite ici.

Il a été développé dans le but de mieux appréhender la gestion d'un système multitâches, notamment en matière de dépendance entre les différents services lancés au démarrage avec pour objectif principal l'optimisation des performances système.
Son rôle est plus étendu que Upstart, il gère également le montage des différents systèmes de fichier et introduit un nouveau système de log appelé "The Journal".

Il introduit la notion d'unité. Une unité représente un fichier de configuration. Entre autres, une unité peut être un service (*.service), un target (*.target), un montage (*.mount), un socket (*.socket)…
C'est donc un sujet très vaste et nous allons donc nous concentrer dans ce wiki sur les aspects basiques des services, des targets et du journal.

Les services

Un service ou daemon est un programme qui tourne en arrière plan et s'active sous certaine condition. Par exemple, le service hddtemp surveille la température de vos disques dur et déclanche une alerte si elle dépasse un certain seuil.

Gestion basique des services

L'outil de gestion des services (et des autres unités d'ailleurs) dans systemd s'appelle systemctl.
Il est généralement utilisé dans un terminal:

systemctl ACTION <Nom_du_service>.service

Quelle que soit l'action menée sur un service, au prochain démarrage de la machine celui-ci devrait retrouver le status qui lui a été défini par défaut.

Il n'est pas nécessaire d'utiliser sudo devant ces commandes. Systemctl vous demandera votre mot de passe root en cas de besoin (presque à chaque fois, donc)

Exemples

systemctl status ssh.service

donnera l'état du service ssh, son PID et les dernières lignes de son fichier de log.

systemctl stop ufw.service

arrêtera le service ufw, Uncomplicated Firewall,

systemctl restart lightdm.service

relancera le serveur graphique.

Afin de conserver une compatibilité avec les anciens scripts system V, des liens vers les commandes principales de systemctl sont installés par défaut. Il s'agit de start, stop, restart et status.
Par exemple sudo restart lightdm est équivalent à systelctl restart lightdm.service.
L'outil service est également branché sur systemctl. service automount restart est équivalent à systelctl restart automount.service

Lister les services démarrés

Pour obtenir la liste triée des services accompagnés de leur état, saisissez dans un terminal :

systemctl list-unit-files | grep service | sort 

Vous pouvez également obtenir la liste des services lancés au démarrage, triés selon leur temps d’exécution :

systemd-analyze blame

Cela peut-être pratique pour trouver le service qui ralenti votre démarrage.

Modifier l'exécution d'un service

Pour desactiver un service, il faut taper :

systemctl disable <Nom_du_service>.service

Ainsi, au prochain redemarrage du système, le service correspondant ne sera plus lancé.

Pour activer un service ou relire sont fichier de configuration, il faut taper:

systemctl enable <Nom_du_service>.service

Néanmoins si vous souhaitez modifier l'état d'un service selon certaines conditions, vous devrez modifier ou créer le fichier /etc/systemd/system/<nom_du_service>.service. Les fichiers de configuration par défaut se trouvent dans /lib/systemd/system/

Exemples

Si vous souhaitez désactiver la synchronisation des fichiers syncthing de l'utilisateur toto, dans un terminal saisissez:

systemctl disable syncthing@toto.service

Pour réactiver le service, il faudra faire la manipulation inverse:

systemctl enable syncthing@toto.service

Logiciel graphique

Il existe un utilitaire graphique qui se nomme systemadm pour gérer systemd.
Installez les paquets systemd-ui

Personnaliser un fichier de configuration Systemd

Comme Upstart, systemd utilise des fichiers de configuration correspondant aux différents services à manipuler.
Ces fichiers de configuration se trouvent dans /etc/systemd/system/ et permettent d'indiquer les conditions d'activation ou désactivation d'un service, leur propriétaire, etc.

Ce dossier étant essentiel au bon fonctionnement de votre système, il est conseillé d'en faire une sauvegarde avant toute modification de fichier.
Dans un terminal saisissez:
sudo cp -r /etc/systemd/system /etc/systemd/system.save$(date +%Y%m%d)

Systemd defini differents types de services :

Exemple de service de type "oneshot"

Un exemple est le service iptables. Voici un extrait de son fichier de configuration :

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/libexec/iptables.init start
ExecStop=/usr/libexec/iptables.init stop


Exemple de service de type "simple"

Un exemple est le service deluged qui permet de lancer le service correspondant à la version deamon du client bit-torrent deluge.

/etc/systemd/system/deluged.service
[Unit]
Description=Deluge Bittorrent Client Daemon
After=network-online.target
 
[Service]
Type=simple
 
User=deluge
Group=deluge
UMask=007
 
ExecStart=/usr/bin/deluged -d
 
Restart=on-failure
 
# Configures the time to wait before service is stopped forcefully.
TimeoutStopSec=300
 
[Install]
WantedBy=multi-user.target


Exemple de service modèle

Il est possible de creer plusieurs services à partir d'un même modèle. Par exemple, la gestion des consoles est gérée par un seul modèle getty@.service qui est décliné en getty@tty1.service, getty@tty2.service, etc pour chacune des consoles tty de votre machine. On peut aussi imaginer des services où chaque instance correspond à un utilisateur de la machine. Par exemple, on peut lancer le service syncthing@.service pour synchroniser en parallèle avec syncthing les fichiers de Toto, Gerard et Milou :

syncthing@.service
[Unit]
Description=Syncthing - Open Source Continuous File Synchronization for %I
Documentation=man:syncthing(1)
After=network.target
Wants=syncthing-inotify@.service
 
[Service]
User=%i
ExecStart=/usr/bin/syncthing -no-browser -no-restart -logflags=0
Restart=on-failure
SuccessExitStatus=3 4
RestartForceExitStatus=3 4
UMask=0002
 
[Install]
WantedBy=multi-user.target
systemctl list-dependencies [<unit>] 
systemctl enable syncthing@Toto.service
systemctl enable syncthing@Gerard.service
systemctl enable syncthing@Milou.service

Les targets

Systemd introduit la notion de target au sein de ses unités. Une target permet de regrouper dans un seul paquet plusieurs autres unités et de retrouver la notion de runlevel (des scripts system V).

Tableau de correspondance

Runlevel Systemd Target Notes
0 runlevel0.target, poweroff.target Arrête le système
1 runlevel1.target, rescue.target Mode single user
3 runlevel3.target, multi-user.target Mode multi-utilisateur, non graphique
2, 4 runlevel2.target, runlevel4.target, multi-user.target Mode défini par l'utilisateur, identique au 3 par défaut.
5 runlevel5.target, graphical.target Mode graphique multi-utilisateur
6 runlevel6.target, reboot.target Redémarre
emergency emergency.target Shell d'urgence

Gérer l'état de votre ordinateur

Pour changer de target, on utilise la commande isolate de systemctl. Par exemple, pour passer en mode multi-utilisateur non graphique, il faut taper dans un terminal:

systemctl isolate multi-user.target

ou son équivalent selon le tableau ci-dessus :

systemctl isolate runlevel3.target

ou son equivalent dans le system V

telinit 3

C'est donc systemd qui gère le démarrage, l’arrêt ou encore le redémarrage de l'ordinateur. En fait, lorsque vous tapez dans un terminal :

sudo reboot

Vous appelez la commande:

sudo systemctl reboot

Vous pouvez utilisez d'autre commande pour gérer l'état de votre ordinateur (dans l'ordre, éteindre / mettre en veille / hiberner) :

systemctl poweroff
systemctl suspend
systemctl hibernate

Enfin, vous pouvez définir le target par défaut au démarrage en tapant :

systemctl set-default -f multi-user.target

Votre ordinateur démarrera désormais en mode multi-utilisateur sans mode graphique.

Infos sur les targets

Pour connaitre la liste des targets configurés sur votre ordinateur, tapez dans un terminal :

systemctl list-unit-files | grep target 

Pour savoir quelles unités sont regroupés au sein d'une target, tapez :

systemctl show -p Wants -p Requires <target>

Les journaux

systemd possède son propre mécanisme de journalisation, appelé "The Journal".

Pour accéder au log, tapez dans un terminal :

journalctl

Pour une gestion plus fine, vous pouvez consulter les messages d'un seul service par son nom, son PID ou même son exécutable :

journalctl -u wicd
journalctl _PID=1
journalctl /usr/sbin/dhcpcd
Lorsque vous consultez le status d'un service avec la commande systemctl status <nom_du_service>, systemd vous affiches quelques lignes des logs les plus recents

journalctl permet aussi de filtrer par le niveau de log (tel que défini par syslog). Pour n'afficher que les erreurs :

journalctl -p err

Il existe un logiciel graphique nommé Gnome-logs pour lire les fichiers de log generés par systemd. Installez les paquets gnome-logs

Ressources


Contributeurs: zarmu,