Systemd

Systemd est l’outil de gestion du démarrage et des services qui remplace SysVinit (ou Upstart) dans la plupart des distributions Linux.

Les commandes de base

  • systemctl : voir l’état des différents services (systemd et sysVinit)
  • systemctl status : Liste les services démarrés
  • systemctl start apache2.service : pour démarrer un service
  • systemctl stop apache2.service : pour stopper un service
  • systemctl restart apache2.service : pour redémarrer un service
  • systemctl disable apache2.service : pour désactiver le service au démarrage
  • systemctl enable apache2.service : pour activer le service au démarrage

Création des scripts de démarrage des services

Les scripts de démarrage d’un service ont cette forme avec systemd :

[Unit]
Description=Daemon to detect crashing apps
After=syslog.target

[Service]
ExecStart=/usr/sbin/abrtd
Type=forking

[Install]
WantedBy=multi-user.target

Le champ Unit sert à définir le service, mais pas uniquement (systemd peut également gérer des points de montage, des devices et d’autres composants). Unit est le terme générique pour ces composants.

La requête After ne force pas le démarrage de syslog. En effet, abrtd (un démon de Fedora) peut fonctionner sans le syslog. En revanche, cette ligne précise que si les deux sont exécutés, alors syslog s’exécute en premier.

Pour la partie Service, on peut également ajouter une requête ExecStop.

Si on crée un script pour lancer des services au démarrage, il faut le place dans le dossier /etc/systemd/system puis demander à systemd de recharger la liste des démons via : systemctl daemon-reload. Ensuite seulement, il sera possible de l’activer au démarrage.

Masquer des services

Il est également possible de masquer un service. Le service ainsi masqué ne sera pas lancé au démarrage (équivalent de disable), mais il ne pourra plus être démarré, même manuellement. Pour cela, il suffit d’utiliser la commande suivante: systemctl mask apache2.service

Cette commande crée un lien symbolique (au nom du service) vers /dev/null et le place dans /etc/systemd/system. C’est l’équivalent de : ln -s /dev/null /etc/systemd/system/apache2.service. Les fichiers présents dans le dossier /etc/systemd/system sont exécutés en priorité et empêchent donc les fichiers du dossier /lib/systemd/system de se lancer. Par défaut, les services ne sont pas représentés dans le dossier /etc/systemd/system et c’est donc bin le fichier du dossier /lib/systemd/system qui s’exécute.

Pour rendre visible un script qui a été précédemment masqué, il faut utiliser la commande systemctl unmask apache2.service, qui supprime le lien symbolique.

Gestion des processus

Avec systemd, tous les processus fils d’un service font partis d’un Control Group commun (cgroup). Celà permet de pouvoir killer tous les processus d’un même cgroup et éviter d’avoir des processus zombies.

Pour voir les cgroups : ps axwf -eo pid,user,cgroup,args (ou systemd-cgls)

Pour killer des services, on utilise la commande : systemctl kill apache2.service.

Il est également possible de passer en argument le signal à envoyer au service : system kill -s SIGKILL apache2.service (pour avoir l’équivalent d’un kill -9). En utilisant l’option -s on peut choisir ou non de préciser le préfixe SIG (-s SIGKILL est identique -s KILL, -s SIGHUP est identique à -s HUP…)

Avec la commande systemctl kill il est enfin possible de définir quels processus membres du cgroup devront être tués : systemctl kill -s HUP --kill-who=main apache2.service (pour tuer le processus apache père) ou systemctl kill -s KILL --kill-who=all apache2.service (à vérifier pour l’option all ;-))

Gestion des Targets

Les targets sont les équivalents sous systemd des runlevels.

Les 5 principales targets sont :

  • poweroff
  • rescue
  • multi-user
  • graphical
  • reboot

Pour changer de target, on utilise la commande systemctl isolate multi-user.target.

Pour connaitre la target par défaut, il faut saisir la commande systemctl get-default et la commande systemctl set-default graphical.target sert à modifier la target utilisée par défaut.