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.
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.
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
Où
- ACTION sera la commande que l'on souhaite appliquer à la dite unité:
- start : démarrer le service
- stop : arrêter le service
- restart : relancer le service
- reload : recharger le service
- status : connaitre l'état du service
- <Nom_du_service> est le nom du service visé.
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.
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.
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.
Dans un terminal saisissez:
sudo cp -r /etc/systemd/system /etc/systemd/system.save$(date +%Y%m%d)
Systemd defini differents types de services :
- Un service de type simple (type par défaut) lance un processus principal. Dans le cas où ce processus offre une fonctionnalité à d'autre processus sur le système, ses canaux de communication doivent être installés avant que le processus principal soit démarré. Ce qui est rendu possible par l'activation des sockets, et autres canaux de communication. Ainsi, systemd peut traiter les autres unités sans se préoccuper de la fin du lancement d'une unité de type "simple".
- Un service de type forking, lance un processus père qui créera un processus fils dans le cadre de son démarrage. Le processus parent est prévu pour s’arrêter une fois le démarrage complet et que tous les canaux de communication sont mis en place. Le processus fils continue à fonctionner en tant que le processus principal du service. systemd poursuit le traitement des autres unités une fois que le processus père se termine. Ce type de service correspond aux services UNIX traditionnels.
- Un service de type oneshot est similaire à un service de type simple. Cependant, systemd attend que le processus se termine avant de continuer ses traitements. Ce type de service est typiquement utilisé comme équivalent aux commandes lancées au démarrage via les scripts d'init system V. Cela permet à systemd de remplacer ce mécanisme. De ce fait, avec systemd des nouveaux services apparaissent, alors qu'ils auraient été simplement des scripts d'init avec SysVinit.
- Un service de type dbus est similaire à un service de type simple. Cependant, le processus du service doit obtenir un nom via D-Bus. systemd pourra alors traiter les autres unités.
- Un service de type notify est similaire à un service de type simple. Cependant, c'est le processus du service qui avertira systemd (via la fonction sd_notfy(3)) qu'il peut traiter les autres unités.
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
ExecStart
permet d'indiquer la commande à exécuter au lancement du service. Ce paramètre est obligatoire pour tout les types de service.ExecStop
permet d'indiquer une commande a exécuter pour arrêter le service. Ce paramètre est facultatif.RemainAfterExit
à la valeur "yes" permet d'indiquer que quand la commande de lancement (ExecStart) est terminée, le service est considéré comme toujours lancé. Ce paramètre est très utile pour les services de type "oneshot" qui exécutent une commande à leur lancement (ExecStart) sans qu'il y ait un processus spécifique qui reste en exécution.
- A son lancement, la commande /usr/libexec/iptables.init start est exécutée. Cette commande va permettre de charger des modules iptables et les règles iptables que le modules netfilter du noyau linux va prendre en compte.
- A son arrêt, la commande /usr/libexec/iptables.init stop est exécutée. Cette commande va permettre de remettre en place la politique de traitements iptables par défaut et de décharger les modules iptables.
- Le service iptables continuera d'apparaitre comme actif après la fin de la commande /usr/libexec/iptables.init start et jusqu’à ce qu'il soit explicitement arrêté.
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
Description
permet de donner une description du service qui apparaîtra lors de l'utilisation de la commandesystemctl status <nom_du_service>
After
permet d'indiquer quel pré-requis est nécessaire pour le fonctionnement du service. Ici, on indique qu'il faut attendre que l'ordinateur ait accès à Internet pour lancer le daemon. à vérifier : Si l'accès à Internet est perdu, le service est arrêté automatiquement.
Type
permet de specifier le type de serviceUser
,Group
etUmask
permet d'identifier qui est le propriaitaire du processus et donc les attributs des fichiers téléchargés. Ici, les fichiers téléchargés seront accessibles en Lecture/Ecriture à l'utilisateurDeluge
et aux membres du groupeDeluge
et invisibles aux autres utilisateurs du système.Restart
permet de relancer le service automatiquement en cas de plantage.WantedBy
permet de spécifier dans quel Target doit être actif le service. Ici, en spécifiantmulti-user.target
, le service est actif dans les Runlevels 2, 3, 4 et 5
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
Wants
permet de spécifier une dépendance. Pour connaître les dépendances d'une unité, tapez dans un terminal:
systemctl list-dependencies [<unit>]
- Ici, le
User
est%i
, soit l'argument qui est passé lors de l'activation du service. Pour créer toute les instances du service pour Toto, Gerard et Milou, il faudra avoir tapé une fois :
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
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
- systemd sur Wikipedia en français
- https://wiki.archlinux.fr/Systemd Systemd sur le wiki de Archlinux
- http://doc.fedora-fr.org/wiki/Systemd Systemd sur le wiki de Fedora
- https://docs.syncthing.net/users/autostart.html#using-systemd Créer un service systemd pour lancer Syncthing au démarrage (en anglais)
- http://dev.deluge-torrent.org/wiki/UserGuide/Service/systemd Créer un service systemd pour lancer Deluge au démarrage (en anglais)
Contributeurs: zarmu,