Notions essentielles sur Linux SysV init et Systemd
System V init et Systemd sont deux logiciels importants sous Linux. Ils lancent les programmes système essentiels au démarrage et garantissent leur exécution permanente. Nous vous donnons ici les informations essentielles pour une administration simplifiée et vous indiquons comment trouver des documentations spécifiques pour aller plus loin.
Introduction
L'une des responsabilités de « System V init » (SysV init) et de « Systemd » est d'initialiser le système d'exploitation. L'initialisation du système d'exploitation consiste à démarrer les programmes/services essentiels du système ou activés par les utilisateurs, pendant le processus de démarrage et à s'assurer qu'ils sont toujours en cours d'exécution.
Ils fournissent également des outils en espace utilisateur pour gérer ces services (arrêter, redémarrer, obtenir le statut...). 'SysV init' est ancien (1983). 'Systemd' est nouveau, est doté de nombreuses fonctionnalités nouvelles et intéressantes, est très bien documenté et est adopté petit à petit par de nombreuses distributions Linux en remplacement de 'SysV init'.
Systemd
Pour en savoir plus sur Systemd, consultez le manuel avec la commande « man systemd ». Pour la version Web, consultez Manuel en ligne de Systemd.
Systemd s'exécute en tant qu'instance « système » ou « utilisateur », selon la valeur de son « PID » actuel. Il s'exécute en tant qu'instance « système » si le « PID » est égal à « 1 », sinon en tant qu'instance « utilisateur ».
Lorsqu'il est exécuté en tant qu'instance « système », le gestionnaire de services recherchera son fichier de configuration dans les répertoires suivants :
/etc/systemd//lib/systemd//run/systemd/
Les fichiers de configuration suivants seront interprétés :
-
Pour l'instance « système » :
/etc/systemd/system.conf/etc/systemd/system.conf.d/*.conf/lib/systemd/system.conf.d/*.conf/run/systemd/ystem.conf.d/*.conf
-
Pour l'instance « utilisateur » :
/etc/systemd/user.conf/etc/systemd/user.conf.d/*.conf/lib/systemd/user.conf.d/*.conf/run/systemd/user.conf.d/*.conf
Pour les fichiers de configuration contenus dans les répertoires d'insertion « .conf.d », ceux contenus dans « /etc » auront priorité sur ceux contenus dans « /run » qui auront à leur tour priorité sur ceux contenus dans « /lib ». Cela signifie que, si le même fichier de configuration (même nom de fichier) est présent dans tous les répertoires d'insertion, celui contenu dans « /etc » remplacera les autres.
Aperçu des unités (units)
Systemd utilise une abstraction appelée « unité » pour gérer les programmes/services. Les « fichiers d'unité » sont utilisés pour configurer les programmes/services gérés par systemd.
Un fichier unité est un fichier de style ini en texte brut qui encode des informations sur un service, un socket, un périphérique, un point de montage, un point de montage automatique, un fichier d'échange ou une partition, une cible de démarrage (target), un chemin de système de fichiers surveillé, un timer contrôlé et supervisé par systemd, une tranche (slice) de gestion des ressources ou un groupe de processus créés en externe.
Systemd possède donc différents types d'unités (11 au moment de la rédaction) comme nous pouvons le voir dans la définition précédente d'un « fichier d'unité ». Vous trouverez ci-dessous quelques descriptions de certains d'entre eux, tirées du manuel de systemd :
- service: démarrer et contrôler les démons et les processus qui les composent
- target: utile pour regrouper des unités ou fournir des points de synchronisation bien connus lors du démarrage
- socket: encapsuler les sockets IPC ou réseau locaux dans le système, utile pour l'activation basée sur les sockets
- mount: contrôler les points de montage dans le système de fichiers
- automount: fournit des capacités de montage automatique, pour le montage à la demande de systèmes de fichiers ainsi que pour le démarrage parallélisé
- device: expose les périphériques du noyau dans systemd et peut être utilisé pour implémenter l'activation basée sur le périphérique
- timer: utile pour déclencher l'activation d'autres unités en fonction des minuteries (programmation des exécutions)
Grâce à ces types d'unités, nous avons eu un petit aperçu de ce dont systemd est capable. Utilisez la commande suivante pour obtenir des détails sur un type d'unité particulier :
man systemd.UNIT-TYPE # with UNIT-TYPE=service,target,socket...
Nomenclature des fichiers d'unité et répertoires
La convention de dénomination des fichiers d'unité systemd est la suivante :
my_chosen_unit_name.UNIT-TYPE
avec 'UNIT-TYPE' correspondant à l'un des types d'unités de systemd. Voici quelques exemples :
nginx.servicevpn.socket
Voici quelques répertoires dans lesquels les fichiers d'unité seront recherchés :
/etc/systemd/system: répertoire principal pour les fichiers d'unité. Les unités des paquets installés seront liées (lien symbolique) ici à partir de '/usr/lib/systemd/system' et '/usr/local/lib/systemd/system'/run/systemd/system: configurations des unités d'exécution. Effacé après redémarrage./usr/lib/systemd/system: les fichiers unité de certains packages installés iront là (sources des fichiers liés dans '/etc/systemd/system')/usr/local/lib/systemd/system: les fichiers unité de certains packages installés iront là (sources des fichiers liés dans '/etc/systemd/system')
Les répertoires répertoriés précédemment sont destinés à l'instance systemd exécutée en mode « système ». Pour l'équivalent en mode « utilisateur », remplacez simplement « system » par « user ». Pour voir tous les chemins de chargement des unités, exécutez les commandes suivantes :
# system mode
systemd-analyze --system unit-paths
# user mode
systemd-analyze --user unit-paths
Administration des unités
La commande « systemctl » est utilisée pour l'administration des unités. L'administration des unités comprend :
- démarrer, arrêter, recharger, obtenir le statut
- lister, afficher le contenu, afficher les dépendances, modifier
- Afficher, définir les propriétés de l'unité
- Afficher, définir le niveau d'exécution (target) actuel et par défaut
- Créer des unités
Un fichier de configuration « drop-in » est un fichier à l'intérieur d'un répertoire dont le nom se termine par « .d », afin d'étendre un fichier de configuration de démon systemd ou des fichiers de configuration d'unités. Ex : « systemd-timesyncd.service.d/disable-with-time-daemon.conf » étendra le fichier de configuration d'unité « systemd-timesyncd.service »
Démarrer, arrêter, recharger, redémarrer, état, lister
# start, stop, reload, restart, status
systemctl start/stop/reload/restart/status UNIT-NAME[.UNIT-TYPE]
# List units
systemctl list-units
# List units of type 'service'
systemctl -t service list-units
Afficher le contenu, modifier, répertorier les dépendances
# Show configuration files of a specific unit.
# Will show all loaded configuration files content
# including those inside drop-in (.d) directories
systemctl cat UNIT-NAME
# Edit unit. A new drop-in file will be created and
# the existing UNIT configuration will be extended
systemctl edit EXISTING-UNIT-NAME
# Open original unit config file for editing
# instead of creating a drop-in file
systemctl edit --full UNIT-NAME
# Create a new unit configuration file. --force will
# open a new file for editing if the unit doesn't exist
systemctl edit --force NEW-UNIT-NAME
# Edit unit temporarily. Changes will be made
# temporarily in /run and lost after reboot
systemctl edit --runtime UNIT-NAME
# List dependencies of a specific unit
systemctl list-dependencies UNIT-NAME
Activer et désactiver les unités
# Disable => not loaded at boot
systemctl disable UNIT-NAME
# Enable => loaded at boot
systemctl enable UNIT-NAME
# Verify
systemctl is-enabled UNIT-NAME
Lister les propriétés de l'unité, remplacer les propriétés de l'unité
# Show all properties of a specific unit
systemctl show UNIT-NAME
# Show a specific property of a unit
systemctl show -p PROPERTY-NAME UNIT-NAME
# List of all available porperties for a unit type
systemctl show SOME-UNIT-TYPE
# Get unit resources control properties only
# Properties to limit cpu and ram of a specific unit for instance
man systemd.resource-control
# Set, update a unit property value
systemctl set-property PROPERTY-NAME=VALUE [PROPERTY-NAME-N=VALUE-N]
Afficher, définir le niveau d'exécution (target) actuel et par défaut
# For available targets and their descriptions
man systemd.special
# Get the default target the system will boot into
systemctl get-default
# Set the default target for the system to boot into
systemctl set-default TARGET
# Immediately change the current target to graphical (runlevel 5)
systemctl isolate graphical.target
Créer des unités
Pour plus de détails sur ce fichier de configuration de type d'unité spécifique et toutes les directives de configuration disponibles pour les unités systemd, utilisez :
# Configuration of a specific unit type
man systemd.UNIT-TYPE
# Units configuration directives
man systemd.directives
Recharger le démon systemd après la modification des fichiers d'unité
systemctl daemon-reload
Rétro compatibilité de Systemd avec les scripts d'initialisation SysV
Voir « man systemd-sysv-generator » et « man systemd-generator » pour plus de détails.
Le répertoire des scripts d'initialisation SysV : '/etc/init.d', sera analysé par systemd au démarrage ou après un rechargement de systemd. Les scripts trouvés seront convertis en unités de service systemd. Systemd respectera les priorités de démarrage et les niveaux d'exécution de démarrage/arrêt des scripts d'initialisation SysV lors de leur conversion en unités de service systemd, en ajoutant des dépendances et des cibles 'WantedBy' aux fichiers de configuration des unités.
Systemd utilise des « générateurs » (petits exécutables) situés dans le répertoire « system-generator », dans les répertoires de base des configurations de Systemd ('/run/systemd', '/lib/systemd', '/etc/systemd', etc.). La directive « SourcePath= » sera incluse dans les fichiers d'unité générés pour spécifier le script d'initialisation SysV source à partir duquel la configuration de l'unité systemd est générée.
Administration du journal Systemd
Le journal Systemd contient des données de journalisation reçues de sources telles que kmsg (pour les messages du journal du noyau), syslog, l'API ou le protocole du journal natif, stdin et stderr des unités de service Systemd, etc.
Afficher l'utilisation du disque de tous les fichiers journaux
journalctl --disk-usage
Réduire l’utilisation du disque journal en dessous de la taille spécifiée
$ journalctl --vacuum-size=BYTES
# BYTES could be for instance:
# 1000000000 or 1000000K or 1000M or 1G
# Example
$ journalctl --disk-usage
Archived and active journals take up 136.0M in the file system.
$ journalctl --vacuum-size=100M
Vacuuming done, freed 0B of archived journals from /run/log/journal.
Vacuuming done, freed 0B of archived journals from /var/log/journal.
Vacuuming done, freed 0B of archived journals from /var/log/journal/ab68fa6922910fdc74007141e78c1993.
$ journalctl --disk-usage
Archived and active journals take up 136.0M in the file system.
# No cleanup made because the size of the archived journal are not enough to satisfy the request
# We can also include currently active journal files by using the --rotate option in order to archive
# them before performing the cleanup
# Rotate currently active journals and do cleanup after
$ journalctl --vacuum-size=100M --rotate
Vacuuming done, freed 0B of archived journals from /var/log/journal.
Vacuuming done, freed 0B of archived journals from /run/log/journal.
Deleted archived journal /var/log/journal/ab68fa6922910fdc74007141e78c1993/user-1003@90c851b0208a4330a7b7f8c824105cdb-00000000002cde8d-00060ef8c085a4b2.journal (104.0M).
Vacuuming done, freed 104.0M of archived journals from /var/log/journal/ab68fa6922910fdc74007141e78c1993.
$ journalctl --disk-usage
Archived and active journals take up 72.0M in the file system.
Conserver uniquement le nombre spécifié de fichiers journaux
$ journalctl --vacuum-files=INT
# Example
$ journalctl --vacuum-files=1
Vacuuming done, freed 0B of archived journals from /var/log/journal/ab68fa6922910fdc74007141e78c1993.
Vacuuming done, freed 0B of archived journals from /var/log/journal.
Vacuuming done, freed 0B of archived journals from /run/log/journal.
Supprimer les fichiers journaux plus anciens que la date spécifiée
$ journalctl --vacuum-time=TIME
# TIME could be for instance:
# 2days or 2d, 2months or 2m, 40minutes or 40m...
# Detailed info about TIME format can be found using 'man systemd.time'
# Example
$ journalctl --vacuum-time=7d
Vacuuming done, freed 0B of archived journals from /var/log/journal.
Vacuuming done, freed 0B of archived journals from /run/log/journal.
Vacuuming done, freed 0B of archived journals from /var/log/journal/ab68fa6922910fdc74007141e78c1993.
Quelques pages de manuel utiles sur systemd
systemd.special: unités spéciales de systemd (niveaux d'exécution disponibles et leurs explications)systemd.UNIT-TYPE: documentation d'un type d'unité systemd particuliersystemd.directives: index de toutes les directives de configuration des fichiers unitaires systemd disponibles et où nous pouvons trouver des explications à leur sujetsystemd.index: index de toutes les pages de manuel du projet systemdsystemd.exec: directives de configuration de l'environnement d'exécution des processus des unités systemd (privilèges, politique OutOfMemory (OOM), limites, planification, sandboxing, filtrage, variables d'environnement, journalisation, etc.)
SysV init
Présentation des répertoires des scripts du service d'initialisation SysV
/etc/init.d: répertoire où résident les scripts d'initialisation de sysV
debian:~$ ll /etc/init.d/
total 160
-rwxr-xr-x 1 root root 5336 févr. 1 2016 alsa-utils
-rwxr-xr-x 1 root root 2014 mai 29 2017 anacron
-rwxr-xr-x 1 root root 3617 avril 12 2017 auditd
-rwxr-xr-x 1 root root 2401 janv. 23 2017 avahi-daemon
-rwxr-xr-x 1 root root 2948 sept. 13 2017 bluetooth
(...)
/etc/rcX.d(distributions basées sur Debian) ou/etc/rc.d/rcX.d(distributions basées sur RedHat) :- contient des liens symboliques vers les scripts d'initialisation dans '/etc/init.d'
- les noms des liens symboliques commencent par « S » ou « K » suivi d'un numéro de priorité à deux chiffres et du nom du script d'initialisation
- « S » signifie exécuter le script. « K » signifie ne pas exécuter ou arrêter le script
- le numéro de priorité indique l'ordre dans lequel les scripts d'initialisation seront exécutés au démarrage. Les scripts avec le même numéro de priorité seront exécutés en parallèle. Ceux avec le numéro le plus bas avant ceux avec le numéro le plus élevé ('S01bobo' avant 'S04baba' par exemple).
- Le « X » dans le nom de fichier du répertoire « rcX.d » représente un numéro de niveau d'exécution. Il existe un répertoire pour chaque niveau d'exécution défini par la spécification « LSB (Linux Standard Base) ». Par conséquent, les liens symboliques dans « rcX.d » ne seront utilisés que pour le niveau d'exécution « X » spécifié.
debian:~$ ll /etc/rc
rc0.d/ rc1.d/ rc2.d/ rc3.d/ rc4.d/ rc5.d/ rc6.d/ rcS.d/
# The following init script links will
# only be ran at boot in runlevel 5
debian:~$ ll /etc/rc5.d/
total 0
lrwxrwxrwx 1 root root 17 déc. 22 2018 S01anacron -> ../init.d/anacron
lrwxrwxrwx 1 root root 16 août 7 2020 S01auditd -> ../init.d/auditd
lrwxrwxrwx 1 root root 22 déc. 22 2018 S01avahi-daemon -> ../init.d/avahi-daemon
lrwxrwxrwx 1 root root 19 déc. 22 2018 S01bluetooth -> ../init.d/bluetooth
lrwxrwxrwx 1 root root 24 août 4 2019 S01cgroupfs-mount -> ../init.d/cgroupfs-mount
(...)
Afficher, définir le niveau d'exécution du système (runlevel)
- Pour obtenir le niveau d'exécution actuel du système, la commande « runlevel » peut être utilisée
- Le niveau d'exécution de démarrage par défaut du système peut être défini dans le fichier « /etc/inittab »
- Pour modifier le niveau d'exécution alors que le système est déjà opérationnel, la commande « init »
peut être utilisée
Administration des scripts du service d'initialisation SysV
- L'utilitaire « service » peut être utilisé pour démarrer, arrêter, redémarrer, recharger ou obtenir l'état d'un service d'initialisation SysV
- L'utilitaire 'update-rc.d' peut être utilisé pour faire démarrer (ou non) un script d'initialisation SysV au démarrage, au niveau d'exécution par défaut ou à un niveau d'exécution spécifique pour les distributions basées sur Debian
- L'utilitaire « chkconfig » peut être utilisé pour faire démarrer (ou non) un script d'initialisation SysV au démarrage, au niveau d'exécution par défaut ou à un niveau d'exécution spécifique pour les distributions basées sur Red Hat
# Enable/Disable a SysV init service on every runlevel
chkconfig <service-name> off/on
# Enable/Disable a SysV init service at a specific runlevel
chkconfig <service-name> --level <runlevel-number> off/on
# List SysV init services managed by chkconfig
# and their statuses (on, off) on each runlevel
chkconfig --list
# Make chkconfig manage a specific SysV init service
chkconfig --add <service-name>