Différences entre versions de « Systemctl »

De The Linux Craftsman
Aller à la navigation Aller à la recherche
Ligne 57 : Ligne 57 :
 
|-
 
|-
 
||chkconfig $daemon
 
||chkconfig $daemon
||systemctl is-enable $daemon.service
+
||systemctl is-enabled $daemon.service
 
||Permet de voir si $daemon est actif au démarrage du système
 
||Permet de voir si $daemon est actif au démarrage du système
 
|-
 
|-
 
||chkconfig $daemon --list
 
||chkconfig $daemon --list
||systemctl is-enable $daemon.service
+
||systemctl list-units --type=service --all
||Permet de voir si $daemon est actif au démarrage du système
+
||Permet de voir la liste des services et s'ils sont actifs ou non au démarrage du système
 
|-
 
|-
 
|align="center"|X
 
|align="center"|X
Ligne 73 : Ligne 73 :
 
|}
 
|}
 
Il est possible de ne pas ajouter le ''.service'', ''systemctl'' comprendra très bien qu'il s'agit d'un service !
 
Il est possible de ne pas ajouter le ''.service'', ''systemctl'' comprendra très bien qu'il s'agit d'un service !
 +
 
= Systemctl =
 
= Systemctl =
 
Nous allons passer en revue les ''unités'' que nous pouvons manipuler avec ''systemctl'' !
 
Nous allons passer en revue les ''unités'' que nous pouvons manipuler avec ''systemctl'' !

Version du 28 décembre 2017 à 08:25

Introduction

Déni, Colère, Expression, Dépression, Acceptation

Nous étions habitués aux commandes service, chkconfig ou encore init mais maintenant c'est de l'histoire ancienne puisque SysVInit à été remplacé par SystemD, le nouveau gestionnaire de démarrage écrit par RedHat.

On peut se demander pourquoi on change un système qui fonctionne ?

La raison est simple : SysVInit est lent, mal architecturé, possède des faiblesses. C'en était trop pour certain et c'est pourquoi, d'une architecture modulaire (chacun sa tâche), nous sommes passé à une architecture centralisée (une seule commande). Ce nouveau moteur est écrit en C et permet un démarrage parallélisé des processus plutôt qu'en série. Les développeur d'Ubuntu avaient commencé le travail en écrivant UStart mais n'étaient pas allé jusqu'au bout des choses !

Ci-dessous un dessin expliquant comment se déroule le démarrage du système :

Comparing services start.png

Explication de texte

On voit clairement le gain de temps au démarrage du système ! Une question vient à l'esprit, comment est-ce possible ? La réponse se trouve dans le type de socket utilisées pour la communication entres les services : on est passé de socket AF_INET, orienté réseaux, à des socket AF_UNIX, orientée système.

Le premier type de socket, AF_INET, permet des réseau entre les services surtout utilisée dans les systèmes distribués et plus vraiment d'actualité sur un système centralisé. Ce qui explique cette migration vers des sockets AF_UNIX, qui sont des sockets système, c'est à dire un fichier.

Les sockets AF_UNIX ne nécessitent pas la présence d'un programme pour démarrer et sont donc créées par le système d'exploitation au démarrage. Les services démarrent en parallèle et se branchent à la socket quand ils sont prêt.

Maintenant, que faire ?

Ci-dessous un tableau qui fait le lien entre les anciennes et les nouvelles commandes :

SysVInit SystemD Description
service $daemon start systemctl start $daemon.service Permet de démarrer $daemon
service $daemon stop systemctl stop daemon.service Permet de stopper $daemon
service $daemon restart systemctl restart $daemon.service Permet de redémarrer $daemon
service $daemon reload systemctl reload $daemon.service Permet de recharger la configuration de $daemon
X systemctl reload-or-restart $daemon Permet de recharger ou redémarrer $daemon
service $daemon status systemctl status $daemon Affiche des informations sur le service $daemon
chkconfig $daemon on systemctl enable $daemon.service Permet d'enregistrer $daemon au démarrage du système
chkconfig $daemon off systemctl disable $daemon.service Permet d'effacer $daemon du démarrage du système
chkconfig $daemon systemctl is-enabled $daemon.service Permet de voir si $daemon est actif au démarrage du système
chkconfig $daemon --list systemctl list-units --type=service --all Permet de voir la liste des services et s'ils sont actifs ou non au démarrage du système
X systemctl is-failed $daemon.service Retourne la valeur active si le service fonctionne sinon failed
X systemctl list-units [--all] [--state=inactive] [--type=service] Liste toutes les unités gérées par systemctl

Il est possible de ne pas ajouter le .service, systemctl comprendra très bien qu'il s'agit d'un service !

Systemctl

Nous allons passer en revue les unités que nous pouvons manipuler avec systemctl !

Gestion des unités

État des unités

systemctl peut afficher des informations sur les unités :

# systemctl list-units

Et on peut appliquer des filtre sur cette commande :

  • --type : pour spécifier le type d'unité
    • mount : les points de montage
    • service : les démons
    • target : les runlevel ou événements
    • scope : les sessions actives
    • device : les périphériques
  • --state
    • loaded : fichier de configuration lu par systemD
    • active : l'unité est active
    • inactive : l'unité des inactive
  • --all : toutes les unités

Par exemple, pour lister les points de montage actif :

# systemctl list-units --type=mount --state=active

Configuration des unités

On peut afficher les fichiers de configuration des unités
# systemctl list-unit-files

Cette commande affiche tous les fichiers, même ceux des unités qui ne sont pas actuellement chargées !

Il est possible de voir la configuration d'une unité
# systemctl cat sshd.service
Il est possible d'éditer la configuration d'une unité en utilisant edit. Cela va créer un répertoire portant le nom de l'unité et se terminant par un .d. Par exemple pour Apache, cela créer un répertoire /etc/systemd/system/httpd.service.d. Les informations présentes dans ce fichier vont venir surcharger les informations déjà présentes dans le fichier original. Pour modifier directement la configuration original, il faut utiliser l'option --full.

Pour effacer une configuration additionnelle (surcharge), il suffit de supprimer le répertoire en .d.

Une fois les modifications faite, il ne faut pas oublier de recharger systemD !

# systemctl edit sshd.service
# systemctl edit sshd.service --full
# systemctl daemon-reload
On peut également voir les dépendances d'une unité
# systemctl list-dependencies sshd.service
On peut également voir l'inverse, c'est à dire quand l'unité est requise. On voit que le service sshd démarre en mode console (multi-user.target) et en mode graphique (graphical.target). Nous aurions, au temps de SysVInit, parlé des runlevel 3 et 5.
# systemctl list-dependencies --reverse sshd.service
sshd.service
● └─multi-user.target
●   └─graphical.target
On peut demander les propriétés d'une unité



Il est même possible de demander une propriété en particulier

# systemctl show sshd.service
# systemctl show sshd.service -p WantedBy
WantedBy=multi-user.target
Il est possible de masquer des unités, c'est à dire d'empêcher le démarrage manuel et automatique de l'unité. Il suffit alors de la démasquer pour pouvoir l'utiliser à nouveau
# systemctl mask httpd.service
Created symlink from /etc/systemd/system/httpd.service to /dev/null.
# systemctl start httpd.service
Failed to start httpd.service: Unit is masked.
# systemctl unmask httpd.service
Removed symlink /etc/systemd/system/httpd.service.
# systemctl start httpd.service

Les cibles

Gestion des disques

systemctl est capable de gérer les points de montage et de monter automatiquement un emplacement physique dans un répertoire. Dans cet exemple, le disque sdb à déjà été partitionné et formaté, il ne reste plus qu'à le monter. Traditionnellement nous aurions utilisé la commande mount et modifié le fichier /etc/fstab pour rendre le point de montage persistant.

Maintenant nous allons créer un fichier opt-sdb.mount dans le répertoire /etc/systemd/system/ :

[Unit]
Description=Deuxième disque

[Mount]
What=/dev/sdb1
Where=/opt/sdb
Type=ext4
Options=defaults

[Install]
WantedBy=local-fs.target

Maintenant que le fichier de montage est crée, on peut en informer systemctl :

# systemctl daemon-reload

et démarrer le point de montage :

# systemctl start opt-sdb.mount

Rien ne nous empêche, comme pour les services, de l'enregistrer au démarrage :

# systemctl enable opt-sdb.mount

On peut même contrôler l'état du point de montage :

# systemctl list-units --type=mount | grep opt-sdb
opt-sdb.mount           loaded active mounted Deuxième disque
Warning manual.jpg

Le nom du fichier doit absolument correspondre à la destination du point de montage sous peine d'avoir l'erreur suivante :

systemd[1]: sdb.mount's Where= setting doesn't match.

Par exemple, si votre point de montage est /opt/sdb le fichier doit s'appeler opt-sdb.mount !