Ernest

Systemd

Dernière modification : 2014-10-28 20:39:41

Tux tenant une pancarte systemd

Sommaire


Introduction

Systemd est un gestionnaire de services destiné à remplacer System V, le démon init traditionnel. Systemd prend en charge le démarrage des services lors du boot. Il fournit en outre les outils nécessaires pour contrôler, couper ou relancer ces services ainsi qu'un système de logging (The journal). Il a d'ores et déjà été adopté par plusieurs grandes distributions (entre autres RedHat 7, Fedora 11 , Gentoo et Debian Jessie).

Ce document couvre l'utilisation basique de systemd.

[ sommaire ] | [ home ]


S'assurer que ma distribution utilise bien systemd

Ben oui, c'est un peu le premier truc à voir. Si vous n'êtes pas sûr, utilisez la commande dmesg|grep systemd :


[ stephane@paranoia ]~$ dmesg|grep systemd
[ stephane@paranoia ]~$ 

Ici, aucune trace de systemd au démarrage, ce qui n'est pas étonnant puisqu'il s'agit d'une Debian Wheezy qui n'installe pas systemd par défaut (mais il est possible de l'installer d'un coup d'apt-get).


[ stephane@Rantanplan ]~$ dmesg|grep systemd
[    0.901394] systemd-udevd[58]: starting version 208
[    0.901889] random: systemd-udevd urandom read with 3 bits of entropy available
[    1.563501] systemd[1]: systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ)
[    1.576099] systemd[1]: Inserted module 'autofs4'
[    1.576891] systemd[1]: Set hostname to .
[    1.687155] systemd[1]: Cannot add dependency job for unit display-manager.service, ignoring: Unit display-manager.service failed to load: No such file or directory.
[    1.687631] systemd[1]: Starting Forward Password Requests to Wall Directory Watch.
[    1.687726] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
[    1.687747] systemd[1]: Starting Syslog Socket.

Ici en revanche, il est partout (et encore, j'ai retiré une longue partie de la liste). Là non plus, ce n'est pas étonnant vu qu'il s'agit d'une Debian Jessie qui installe systemd par défaut.

[ sommaire ] | [ home ]


Surveiller, (re)lancer et arrêter les units

Surveiller les units

L'utilitaire proposé par systemd pour gérer les services s'appelle systemctl (system control). Notons que dans le jargon systemd, on ne parle pas de services mais de units. A vrai dire, systemd va bien plus loin et le terme "units" recouvre les services, les sockets, les targets (on y reviendra), les points de montage, et plein d'autres trucs encore. Certains y voient une forme d'impérialisme de systemd qui va à l'encontre du KISS (Keep It Simple, Stupid) cher aux développeurs du monde des unices.

La commande systemctl permet de contrôler l'état de toutes ces "units". Pour commencer, lançons-la sans aucun paramètre :

[ stephane@rantanplan ]~$ systemctl

UNIT                                                      LOAD   ACTIVE SUB       DESCRIPTION
sys-devices-platform-serial8250-tty-ttyS3.device          loaded active plugged   /sys/devices/platform/serial8250/tty/ttyS3
sys-module-fuse.device                                    loaded active plugged   /sys/module/fuse
sys-subsystem-net-devices-eth0.device                     loaded active plugged   88E8055 PCI-E Gigabit Ethernet Controller
sys-subsystem-net-devices-wlan0.device                    loaded active plugged   AR928X Wireless Network Adapter (PCI-Express)
-.mount                                                   loaded active mounted   /
dev-hugepages.mount                                       loaded active mounted   Huge Pages File System
dev-mqueue.mount                                          loaded active mounted   POSIX Message Queue File System
home.mount                                                loaded active mounted   /home
proc-sys-fs-binfmt_misc.mount                             loaded active mounted   Arbitrary Executable File Formats File System
run-lock.mount                                            loaded active mounted   Lock Directory
run-rpc_pipefs.mount                                      loaded active mounted   /run/rpc_pipefs
run-user.mount                                            loaded active mounted   User Runtime Directory
sys-fs-fuse-connections.mount                             loaded active mounted   FUSE Control File System
sys-kernel-debug.mount                                    loaded active mounted   Debug File System
cups.path                                                 loaded active waiting   CUPS Printer Service Spool
systemd-ask-password-console.path                         loaded active waiting   Dispatch Password Requests to Console Directory Watch
systemd-ask-password-wall.path                            loaded active waiting   Forward Password Requests to Wall Directory Watch
session-1.scope                                           loaded active running   Session 1 of user stephane
acpi-support.service                                      loaded active exited    LSB: Start some power management scripts
apache2.service                                           loaded active running   LSB: Apache2 web server
atd.service                                               loaded active running   Deferred execution scheduler
avahi-daemon.service                                      loaded active running   Avahi mDNS/DNS-SD Stack
binfmt-support.service                                    loaded active exited    Enable support for additional executable binary formats
bluetooth.service                                         loaded active running   Bluetooth service
console-setup.service                                     loaded active exited    LSB: Set console font and keymap
cron.service                                              loaded active running   Regular background program processing daemon
cups-browsed.service                                      loaded active running   Make remote CUPS printers available locally
cups.service                                              loaded active running   CUPS Printing Service

On peut également obtenir la liste des services du système avec la commande systemctl list-units --type service, commande certes plus longue mais qui va nous offrir des options intéressantes par la suite (donc nous y reviendrons).

La liste est vraisemblablement bien plus longue chez vous, j'ai volontairement restreint le nombre de lignes. Voyons tout cela dans le détail ...

La colonne UNIT donne le nom des units (on remarque la présence d'Apache que j'ai mis en gras). La colonne LOAD indique si l'unit s'est chargé correctement (auquel cas il est indiqué "loaded"). La colonne ACTIVE permet de savoir si l'unit tourne actuellement (auquel cas il est indiqué "active"). La colonne SUB donne une information plus précise sur l'état de l'unit : les partitions sont "mounted" (comme par exemple /home, que j'ai mis en gras), Apache lui est en "running", tout comme Cups (gestionnaire d'impression). La dernière colonne, DESCRIPTION, précise la fonction de l'unit.

Vous avez peut être remarqué que *tous* les units sont actifs dans la liste. Pour lister également ceux qui ne le sont pas, il faut utiliser la commande systemctl --all

Il est possible d'obtenir des informations plus précises concernant un unit en particulier :


[ stephane@Lisa ]~$ systemctl status apache2
apache2.service - LSB: Apache2 web server
   Loaded: loaded (/etc/init.d/apache2)
   Active: active (running) since lun. 2014-10-27 05:58:37 CET; 2h 16min ago
  Process: 2329 ExecReload=/etc/init.d/apache2 reload (code=exited, status=0/SUCCESS)
  Process: 511 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/apache2.service
           ├─ 707 /usr/sbin/apache2 -k start
           ├─2370 /usr/sbin/apache2 -k start
           ├─2371 /usr/sbin/apache2 -k start
           ├─2372 /usr/sbin/apache2 -k start
           ├─2373 /usr/sbin/apache2 -k start
           └─2374 /usr/sbin/apache2 -k start

Ici, on apprend depuis combien de temps l'unit tourne, les PID et comment il a été lancé : on voit d'ailleurs que par défaut, sur Jessie (qui est, au moment où je rédige ceci, la Debian testing), Apache est lancé par des scripts init. Il semble donc que Jessie fonctionne pour le moment avec un système hybride System V / systemd ... De fait, voici ce qu'on peut lire dans la documentation Debian de systemd (/usr/share/doc/systemd/README.Debian): "systemd can be installed alongside sysvinit and will not change the behaviour of the system out of the box. This is intentional."

Voyons comment cela se passe sous une distribution incluant systemd depuis 2011, Fedora :


[root@poison]# systemctl status httpd
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
   Active: active (running) since mar. 2014-10-28 16:06:27 CET; 21min ago
 Main PID: 1935 (httpd)
   Status: "Total requests: 4; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─1935 /usr/sbin/httpd -DFOREGROUND
           ├─1939 /usr/sbin/httpd -DFOREGROUND
           ├─1940 /usr/sbin/httpd -DFOREGROUND
           ├─1941 /usr/sbin/httpd -DFOREGROUND
           ├─1942 /usr/sbin/httpd -DFOREGROUND
           ├─1943 /usr/sbin/httpd -DFOREGROUND
           └─2163 /usr/sbin/httpd -DFOREGROUND

oct. 28 16:06:27 localhost.localdomain systemd[1]: Started The Apache HTTP Se...
Hint: Some lines were ellipsized, use -l to show in full.

Cette fois, la ligne Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) montre que le service Apache (sur Fedora, il s'appelle httpd) est géré par systemd et réside donc logiquement dans /usr/lib/systemd/system

(re)lancer les units

La commande systemctl permet également de lancer / relancer les services (qui sont des units), par exemple pour relancer Apache. Les commandes sont les suivantes (en root) :


[root@poison]# systemctl start apache2
[root@poison]# systemctl restart apache2

Ces commandes vont lancer Apache 2 puis le relancer.

Arrêter les units

Pour arrêter les services, utilisez (en root) la commande systemctl stop.


[root@poison]# systemctl stop apache2

Et bien sûr, pour contrôler le résultat de cette commande, vous pouvez utiliser la commande systemctl --all | grep apache :


[root@poison]# systemctl --all | grep apache
apache2.service                                loaded    inactive dead      LSB: Apache2 web server

Mais les fonctionnalités de systemd ne s'arrêtent pas à la gestion de services. En effet, les "units" recouvrent un ensemble bien plus large.

[ sommaire ] | [ home ]


Activer / Désactiver les services de manière permanente

Nous pouvons donc désormais ponctuellement interrompre un service ou le (re)lancer. Mais comment faire en sorte que ce service se lance à chaque démarrage ou, au contraire, qu'il ne se relance pas au prochain démarrage ?

En fait, l'opération est très simple. Pour activer un service de manière permanente, on utilise la commande systemctl enable httpd. Ainsi, sur notre Fedora, après l'installation d'Apache, ce dernier ne se lance pas au boot. Nous utilisons pour cela la commande systemctl enable httpd. Regardez la réponse du système :


[root@poison]# systemctl enable httpd
ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'

Fedora a créé un lien symbolique vers le service. Après un reboot,la commande systemctl status httpd nous confirme que désormais, Apache sera bien démarré à chaque boot.


[root@poison]# systemctl status httpd
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
   Active: active (running) since mar. 2014-10-28 19:50:39 CET; 1min 0s ago
 Main PID: 629 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─629 /usr/sbin/httpd -DFOREGROUND
           ├─652 /usr/sbin/httpd -DFOREGROUND
           ├─653 /usr/sbin/httpd -DFOREGROUND
           ├─654 /usr/sbin/httpd -DFOREGROUND
           ├─656 /usr/sbin/httpd -DFOREGROUND
           └─657 /usr/sbin/httpd -DFOREGROUND

oct. 28 19:50:39 localhost.localdomain httpd[629]: AH00557: httpd: apr_sockad...
oct. 28 19:50:39 localhost.localdomain httpd[629]: AH00558: httpd: Could not ...
oct. 28 19:50:39 localhost.localdomain systemd[1]: Started The Apache HTTP Se...
Hint: Some lines were ellipsized, use -l to show in full.

De la même manière, nous pouvons désactiver de manière permanente un service (ici Apache, soit httpd) avec la commande systemctl disable httpd


[root@poison]# systemctl disable httpd
rm '/etc/systemd/system/multi-user.target.wants/httpd.service'

Et cette fois, nous voyons que Fedora supprime le lien symbolique créé tout à l'heure. Naturellement, après le reboot, nous constatons qu'Apache ne s'est pas lancé. Très simple :-)

Les targets, ou "les runlevels strike back !"

System V repose sur la notion de runlevels. Ce sont des niveaux d'exécution qui déterminent de quelle manière on lance et éteint le système. Chaque runlevel désigne à un état particulier : le runlevel 0 correspond à l'extinction de l'ordinateur. Le runlevel 1 est mono-utilisateur (on le lance en général pour des opérations de maintenance). Le runlevel 2 peut être multi-utilisateurs sans support réseau, le run-level 3 correspond à un système complètement fonctionnel mais sans serveur X tandis que le runlevel 5 aura les mêmes fonctionnalités avec l'environnement graphique en plus. Le runlevel 6, lui, est utilisé pour le reboot.

Parmi les éléments pris en charge par systemd, nous avons cité les "targets". Et bien les targets sont l'équivalent des runlevels sous System V. On peut les voir très simplement avec la commande systemctl list-units --type target. Voici ce que nous obtenons sur Debian Jessie :


[ stephane@Rantanplan ]~$ systemctl list-units --type target
UNIT                     LOAD   ACTIVE SUB    DESCRIPTION
basic.target             loaded active active Basic System
cryptsetup.target        loaded active active Encrypted Volumes
getty.target             loaded active active Login Prompts
graphical.target         loaded active active Graphical Interface
local-fs-pre.target      loaded active active Local File Systems (Pre)
local-fs.target          loaded active active Local File Systems
multi-user.target        loaded active active Multi-User System
network-online.target    loaded active active Network is Online
network.target           loaded active active Network
paths.target             loaded active active Paths
remote-fs-pre.target     loaded active active Remote File Systems (Pre)
remote-fs.target         loaded active active Remote File Systems
rpcbind.target           loaded active active RPC Port Mapper
slices.target            loaded active active Slices
sockets.target           loaded active active Sockets
sound.target             loaded active active Sound Card
swap.target              loaded active active Swap
sysinit.target           loaded active active System Initialization
syslog.target            loaded active active Syslog
timers.target            loaded active active Timers
x-display-manager.target loaded active active X11 Display Manager

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

21 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

Et de fait, nous pouvons reconnaître certains intitulés. Ainsi "multi-user.target" nous rappelle le runlevel 3 de System V. Pour connaitre la target par défaut de votre système (comment il démarre), nous pouvons utiliser la commande systemctl get-default. Voici ce que cela nous donne sur notre Fedora :


[stephane@poison]~$ systemctl get-default
graphical.target

On voit donc ici que notre machine démarre en mode graphique (comme de nombreuses distributions aujourd'hui). Bien sûr, il est possible de voir toutes les targets, y compris celles qui ne sont pas actives pour le moment, avec la commande systemctl list-units --type target --all.

Changer la target par défaut

Immédiatement, une question se pose : comment changer le niveau d'exécution, le runlevel, c'est-à-dire la target ? Et bien voyons cela ensemble. Admettons que ma distribution démarre en mode graphique (graphical.target) et que je veuille qu'elle démarre seulement en système multi-utilisateurs (sans X). On utilise pour cela la commande systemctl set-default multi-user.target, comme ici sur notre Fedora :


[root@Poison stephane]# systemctl set-default multi-user.target
rm '/etc/systemd/system/default.target'
ln -s '/usr/lib/systemd/system/multi-user.target' '/etc/systemd/system/default.target'

Le système nous dit quelles opérations ont été effectuées : d'abord, le fichier default.target a été supprimé, puis une nouvelle version a été créée avec un lien symbolique de /usr/lib/systemd/system/multi-user.target vers /etc/systemd/system/default.target

.

Au redémarrage de la machine, nous sommes accueillis par le prompt en mode texte. La modification a donc bien été prise en compte. Après nous être loggué en root, nous tapons la commande systemctl set-default graphical.target, ce qui va nous ramener à l'état antérieur. De fait, après un reboot, notre Fedora est bel et bien en mode graphique.

[ sommaire ] | [ home ]


Récapitulatif des commandes utiles

Commandes Opérations
$ dmesg|grep systemd Vérifier que systemd est installé
$ systemctl Obtenir le status de tous les services
$ systemctl status apache2 Obtenir le status détaillé d'un service en particulier
# systemctl start (ou restart) apache2 Lancer/ Relancer le service apache2
# systemctl stop apache2 Arrêter le service apache2
$ systemctl list-units --type service Voir la liste de tous les services actuellement actifs sur le système
systemctl --all | grep apache Voir un service en particulier dans la liste
systemctl enable httpd Activer un service de manière permanente
systemctl disable httpd Désactiver un service de manière permanente
systemctl list-units --type target Obtenir la liste d'un type d'units en particulier (ici, les targets)
systemctl get-default Connaître la target par défaut du système (c-à-d le runlevel)
systemctl set-default multi-user.target Définir la target par défaut, c-à-d le type de démarrage de la machine

[ sommaire ] | [ home ]



Conclusion

Depuis sa sortie, systemd a provoqué de très vives réactions. Certains l'adorent, d'autres ne peuvent pas le supporter. La communauté Debian s'est déchirée (et se déchire encore à l'heure où je rédige ce tutoriel) autour de la question. Certains soulignent ses indéniables qualités techniques, d'autres, au contraire, le considèrent comme une rupture avec la philosophie GNU/Linux et le principe KISS. Mais il semble bien que tout le monde s'accorde pour y voir un système qui va s'imposer de plus en plus à l'avenir et auquel, quoi que l'on pense, il faut s'adapter. C'est tout le sens de ce tuto qui, loin de prendre position, s'est contenté d'effleurer la surface de systemd en présentant ses fonctions les plus basiques.

[ sommaire ] | [ home ]