introduction
Systemd
est un système d'initialisation et un gestionnaire de système qui est en train de devenir le nouveau standard pour les machines Linux. Bien qu'il y ait des opinions considérables sur la question de savoir sisystemd
est une amélioration par rapport aux systèmes init traditionnels deSysV
qu'il remplace, la majorité des distributions prévoient de l'adopter ou l'ont déjà fait.
En raison de son adoption massive, se familiariser avecsystemd
en vaut la peine, car cela facilitera considérablement l'administration des serveurs. Apprendre et utiliser les outils et les démons qui composentsystemd
vous aidera à mieux apprécier la puissance, la flexibilité et les capacités qu'il offre, ou du moins vous aidera à faire votre travail avec un minimum de tracas.
Dans ce guide, nous discuterons de la commandesystemctl
, qui est l'outil de gestion central pour contrôler le système init. Nous verrons comment gérer les services, vérifier les statuts, modifier les statuts du système et utiliser les fichiers de configuration.
Veuillez noter que bien quesystemd
soit devenu le système d’initialisation par défaut pour de nombreuses distributions Linux, il n’est pas implémenté universellement dans toutes les distributions. Au cours de ce didacticiel, si votre terminal génère l'erreurbash: systemctl is not installed
, il est probable que votre ordinateur dispose d'un système d'initialisation différent.
La gestion des services
L'objectif fondamental d'un système init est d'initialiser les composants qui doivent être démarrés après le démarrage du noyau Linux (généralement appelés composants «utilisateur»). Le système init est également utilisé pour gérer les services et les démons du serveur à tout moment de l'exécution du système. Dans cet esprit, nous allons commencer par quelques opérations simples de gestion des services.
Danssystemd
, la cible de la plupart des actions sont les «unités», qui sont des ressources quesystemd
sait gérer. Les unités sont classées selon le type de ressource qu'elles représentent et elles sont définies avec des fichiers appelés fichiers d'unités. Le type de chaque unité peut être déduit du suffixe à la fin du fichier.
Pour les tâches de gestion de service, l'unité cible sera les unités de service, qui ont des fichiers d'unité avec un suffixe de.service
. Cependant, pour la plupart des commandes de gestion de service, vous pouvez en fait omettre le suffixe.service
, carsystemd
est suffisamment intelligent pour savoir que vous souhaitez probablement opérer sur un service lorsque vous utilisez des commandes de gestion de service.
Démarrage et arrêt des services
Pour démarrer un servicesystemd
, en exécutant des instructions dans le fichier d’unité du service, utilisez la commandestart
. Si vous exécutez en tant qu'utilisateur non root, vous devrez utilisersudo
car cela affectera l'état du système d'exploitation:
sudo systemctl start application.service
Comme nous l'avons mentionné ci-dessus,systemd
sait rechercher les fichiers*.service
pour les commandes de gestion de service, donc la commande pourrait tout aussi facilement être saisie comme ceci:
sudo systemctl start application
Bien que vous puissiez utiliser le format ci-dessus pour l'administration générale, pour plus de clarté, nous utiliserons le suffixe.service
pour le reste des commandes afin d'être explicite sur la cible sur laquelle nous opérons.
Pour arrêter un service en cours d'exécution, vous pouvez utiliser la commandestop
à la place:
sudo systemctl stop application.service
Redémarrage et rechargement
Pour redémarrer un service en cours d'exécution, vous pouvez utiliser la commanderestart
:
sudo systemctl restart application.service
Si l'application en question est capable de recharger ses fichiers de configuration (sans redémarrer), vous pouvez émettre la commandereload
pour lancer ce processus:
sudo systemctl reload application.service
Si vous ne savez pas si le service dispose de la fonctionnalité pour recharger sa configuration, vous pouvez émettre la commandereload-or-restart
. Cela rechargera la configuration sur place si elle est disponible. Sinon, le service redémarrera afin que la nouvelle configuration soit prise en compte:
sudo systemctl reload-or-restart application.service
Activation et désactivation des services
Les commandes ci-dessus sont utiles pour démarrer ou arrêter des commandes pendant la session en cours. Pour dire àsystemd
de démarrer automatiquement les services au démarrage, vous devez les activer.
Pour démarrer un service au démarrage, utilisez la commandeenable
:
sudo systemctl enable application.service
Cela créera un lien symbolique à partir de la copie système du fichier de service (généralement en/lib/systemd/system
ou/etc/systemd/system
) vers l'emplacement sur le disque oùsystemd
recherche les fichiers de démarrage automatique (généralement/etc/systemd/system/some_target.target.wants
. Nous verrons quelle est la cible plus tard dans ce guide).
Pour désactiver le service de démarrage automatique, vous pouvez taper:
sudo systemctl disable application.service
Cela supprimera le lien symbolique indiquant que le service doit être démarré automatiquement.
N'oubliez pas que l'activation d'un service ne le démarre pas dans la session en cours. Si vous souhaitez démarrer le service et l'activer au démarrage, vous devrez exécuter les commandesstart
etenable
.
Vérification de l'état des services
Pour vérifier l'état d'un service sur votre système, vous pouvez utiliser la commandestatus
:
systemctl status application.service
Cela vous fournira l'état du service, la hiérarchie du groupe de contrôle et les premières lignes de journal.
Par exemple, lors de la vérification de l'état d'un serveur Nginx, vous pouvez voir une sortie comme celle-ci:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2015-01-27 19:41:23 EST; 22h ago
Main PID: 495 (nginx)
CGroup: /system.slice/nginx.service
├─495 nginx: master process /usr/bin/nginx -g pid /run/nginx.pid; error_log stderr;
└─496 nginx: worker process
Jan 27 19:41:23 desktop systemd[1]: Starting A high performance web server and a reverse proxy server...
Jan 27 19:41:23 desktop systemd[1]: Started A high performance web server and a reverse proxy server.
Cela vous donne un bon aperçu du statut actuel de l'application, vous informant de tout problème et de toute action pouvant être requise.
Il existe également des méthodes pour vérifier des états spécifiques. Par exemple, pour vérifier si une unité est actuellement active (en cours d'exécution), vous pouvez utiliser la commandeis-active
:
systemctl is-active application.service
Cela renverra l'état actuel de l'unité, qui est généralementactive
ouinactive
. Le code de sortie sera «0» s'il est actif, ce qui simplifiera l'analyse du résultat par programme.
Pour voir si l'unité est activée, vous pouvez utiliser la commandeis-enabled
:
systemctl is-enabled application.service
Cela affichera si le service estenabled
oudisabled
et définira à nouveau le code de sortie sur «0» ou «1» selon la réponse à la question de commande.
Une troisième vérification consiste à déterminer si l'unité est en état d'échec. Cela indique qu’un problème est survenu lors du démarrage de l’unité en question:
systemctl is-failed application.service
Cela renverraactive
s'il fonctionne correctement oufailed
si une erreur s'est produite. Si l'unité a été arrêtée intentionnellement, elle peut renvoyerunknown
ouinactive
. Un état de sortie de «0» indique qu'une défaillance est survenue et un état de sortie de «1» indique tout autre état.
Vue d'ensemble de l'état du système
Jusqu'à présent, les commandes ont été utiles pour gérer des services uniques, mais elles ne sont pas très utiles pour explorer l'état actuel du système. Il existe un certain nombre de commandessystemctl
qui fournissent ces informations.
Liste des unités actuelles
Pour voir une liste de toutes les unités actives quesystemd
connaît, nous pouvons utiliser la commandelist-units
:
systemctl list-units
Cela vous montrera une liste de toutes les unités quesystemd
a actuellement actives sur le système. La sortie ressemblera à ceci:
UNIT LOAD ACTIVE SUB DESCRIPTION
atd.service loaded active running ATD daemon
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
dbus.service loaded active running D-Bus System Message Bus
dcron.service loaded active running Periodic Command Scheduler
dkms.service loaded active exited Dynamic Kernel Modules System
[email protected] loaded active running Getty on tty1
. . .
La sortie contient les colonnes suivantes:
-
UNIT: le nom de l'unité
systemd
-
LOAD: indique si la configuration de l’unité a été analysée par
systemd
. La configuration des unités chargées est conservée en mémoire. -
ACTIVE: un état récapitulatif indiquant si l'unité est active. C'est généralement un moyen assez simple de savoir si l'unité a démarré avec succès ou non.
-
SUB: Il s'agit d'un état de niveau inférieur qui indique des informations plus détaillées sur l'unité. Cela varie souvent selon le type, l'état et la méthode réelle d'exécution de l'unité.
-
DESCRIPTION: Une brève description textuelle de ce que l'unité est / fait.
Puisque la commandelist-units
n'affiche que les unités actives par défaut, toutes les entrées ci-dessus afficheront «chargé» dans la colonne CHARGE et «actif» dans la colonne ACTIVE. Cet affichage est en fait le comportement par défaut desystemctl
lorsqu'il est appelé sans commandes supplémentaires, donc vous verrez la même chose si vous appelezsystemctl
sans arguments:
systemctl
Nous pouvons dire àsystemctl
de sortir des informations différentes en ajoutant des indicateurs supplémentaires. Par exemple, pour voir toutes les unités quesystemd
a chargées (ou tenté de charger), qu'elles soient ou non actuellement actives, vous pouvez utiliser l'indicateur--all
, comme ceci:
systemctl list-units --all
Cela affichera toute unité quesystemd
a chargée ou a tenté de charger, quel que soit son état actuel sur le système. Certaines unités deviennent inactives après l'exécution et certaines unités quesystemd
a tenté de charger n'ont peut-être pas été trouvées sur le disque.
Vous pouvez utiliser d'autres indicateurs pour filtrer ces résultats. Par exemple, nous pouvons utiliser l'indicateur--state=
pour indiquer les états LOAD, ACTIVE ou SUB que nous souhaitons voir. Vous devrez conserver l'indicateur--all
pour quesystemctl
autorise l'affichage des unités non actives:
systemctl list-units --all --state=inactive
Un autre filtre courant est le filtre--type=
. Nous pouvons dire àsystemctl
d'afficher uniquement les unités du type qui nous intéresse. Par exemple, pour ne voir que les unités de service actives, nous pouvons utiliser:
systemctl list-units --type=service
Liste de tous les fichiers d'unité
La commandelist-units
affiche uniquement les unités quesystemd
a tenté d'analyser et de charger en mémoire. Puisquesystemd
ne lira que les unités dont il pense avoir besoin, cela n'inclura pas nécessairement toutes les unités disponibles sur le système. Pour voir le fichier d'unité disponible deevery dans les cheminssystemd
, y compris ceux quesystemd
n'a pas tenté de charger, vous pouvez utiliser la commandelist-unit-files
à la place:
systemctl list-unit-files
Les unités sont des représentations de ressources quesystemd
connaît. Puisquesystemd
n'a pas nécessairement lu toutes les définitions d'unité dans cette vue, il ne présente que des informations sur les fichiers eux-mêmes. La sortie comporte deux colonnes: le fichier unité et l'état.
UNIT FILE STATE
proc-sys-fs-binfmt_misc.automount static
dev-hugepages.mount static
dev-mqueue.mount static
proc-fs-nfsd.mount static
proc-sys-fs-binfmt_misc.mount static
sys-fs-fuse-connections.mount static
sys-kernel-config.mount static
sys-kernel-debug.mount static
tmp.mount static
var-lib-nfs-rpc_pipefs.mount static
org.cups.cupsd.path enabled
. . .
L'état sera généralement «activé», «désactivé», «statique» ou «masqué». Dans ce contexte, statique signifie que le fichier d'unité ne contient pas de section «installer», utilisée pour activer une unité. En tant que tels, ces unités ne peuvent pas être activées. Cela signifie généralement que l'unité exécute une action unique ou n'est utilisée que comme dépendance d'une autre unité et ne doit pas être exécutée seule.
Nous allons couvrir ce que “masqué” signifie momentanément.
Gestion des unités
Jusqu'à présent, nous avons travaillé avec des services et affiché des informations sur les fichiers unitaires et unitaires quesystemd
connaît. Cependant, nous pouvons trouver des informations plus spécifiques sur les unités en utilisant des commandes supplémentaires.
Affichage d'un fichier d'unité
Pour afficher le fichier d'unité quesystemd
a chargé dans son système, vous pouvez utiliser la commandecat
(elle a été ajoutée dans la version 209 desystemd
). Par exemple, pour voir le fichier d'unité du démon de planification deatd
, nous pourrions taper:
systemctl cat atd.service
[Unit]
Description=ATD daemon
[Service]
Type=forking
ExecStart=/usr/bin/atd
[Install]
WantedBy=multi-user.target
La sortie est le fichier d'unité connu du processussystemd
en cours d'exécution. Cela peut être important si vous avez récemment modifié des fichiers unité ou si vous substituez certaines options à un fragment de fichier unité (nous en parlerons plus tard).
Affichage des dépendances
Pour voir l’arborescence des dépendances d’une unité, vous pouvez utiliser la commandelist-dependencies
:
systemctl list-dependencies sshd.service
Ceci affichera une hiérarchie mappant les dépendances à traiter pour démarrer l'unité en question. Les dépendances, dans ce contexte, incluent les unités qui sont requises ou recherchées par les unités situées au-dessus de celle-ci.
sshd.service
├─system.slice
└─basic.target
├─microcode.service
├─rhel-autorelabel-mark.service
├─rhel-autorelabel.service
├─rhel-configure.service
├─rhel-dmesg.service
├─rhel-loadmodules.service
├─paths.target
├─slices.target
. . .
Les dépendances récursives ne sont affichées que pour les unités.target
, qui indiquent les états du système. Pour lister de manière récursive toutes les dépendances, incluez l'indicateur--all
.
Pour afficher les dépendances inversées (unités qui dépendent de l'unité spécifiée), vous pouvez ajouter l'indicateur--reverse
à la commande. Les autres indicateurs utiles sont les indicateurs--before
et--after
, qui peuvent être utilisés pour afficher les unités qui dépendent de l'unité spécifiée commençant avant et après elles, respectivement.
Vérification des propriétés de l'unité
Pour voir les propriétés de bas niveau d'une unité, vous pouvez utiliser la commandeshow
. Cela affichera une liste de propriétés définies pour l'unité spécifiée en utilisant un formatkey=value
:
systemctl show sshd.service
Id=sshd.service
Names=sshd.service
Requires=basic.target
Wants=system.slice
WantedBy=multi-user.target
Conflicts=shutdown.target
Before=shutdown.target multi-user.target
After=syslog.target network.target auditd.service systemd-journald.socket basic.target system.slice
Description=OpenSSH server daemon
. . .
Si vous souhaitez afficher une seule propriété, vous pouvez passer l'indicateur-p
avec le nom de la propriété. Par exemple, pour voir les conflits de l'unitésshd.service
, vous pouvez taper:
systemctl show sshd.service -p Conflicts
Conflicts=shutdown.target
Unités de masquage et de démasquage
Nous avons vu dans la section gestion des services comment arrêter ou désactiver un service, maissystemd
a également la possibilité de marquer une unité commecompletely non démarrable, automatiquement ou manuellement, en la liant à/dev/null
. Cela s'appelle le masquage de l'unité, et est possible avec la commandemask
:
sudo systemctl mask nginx.service
Cela empêchera le service Nginx d'être démarré, automatiquement ou manuellement, tant qu'il est masqué.
Si vous cochez leslist-unit-files
, vous verrez que le service est maintenant répertorié comme masqué:
systemctl list-unit-files
. . .
kmod-static-nodes.service static
ldconfig.service static
mandb.service static
messagebus.service static
nginx.service masked
quotaon.service static
rc-local.service static
rdisc.service disabled
rescue.service static
. . .
Si vous essayez de démarrer le service, vous verrez un message comme celui-ci:
sudo systemctl start nginx.service
Failed to start nginx.service: Unit nginx.service is masked.
Pour démasquer une unité et la rendre à nouveau disponible, utilisez simplement la commandeunmask
:
sudo systemctl unmask nginx.service
Cela ramènera l'unité à son état précédent, lui permettant d'être démarré ou activé.
Modification des fichiers d'unité
Bien que le format spécifique des fichiers d'unité n'entre pas dans le cadre de ce didacticiel,systemctl
fournit des mécanismes intégrés pour éditer et modifier les fichiers d'unité si vous devez effectuer des ajustements. Cette fonctionnalité a été ajoutée dans la version 218 desystemd
.
La commandeedit
, par défaut, ouvrira un extrait de fichier d'unité pour l'unité en question:
sudo systemctl edit nginx.service
Ce sera un fichier vierge pouvant être utilisé pour remplacer ou ajouter des directives à la définition de l'unité. Un répertoire sera créé dans le répertoire/etc/systemd/system
qui contient le nom de l'unité avec.d
ajouté. Par exemple, pour lesnginx.service
, un répertoire appelénginx.service.d
sera créé.
Dans ce répertoire, un extrait de code sera créé appeléoverride.conf
. Lorsque l'unité est chargée,systemd
fusionnera, en mémoire, l'extrait de remplacement avec le fichier d'unité complet. Les directives de l’extrait de code auront la priorité sur celles trouvées dans le fichier d’unités original.
Si vous souhaitez éditer le fichier d'unité complet au lieu de créer un extrait de code, vous pouvez passer l'indicateur--full
:
sudo systemctl edit --full nginx.service
Ceci chargera le fichier d'unité actuel dans l'éditeur, où il pourra être modifié. À la fermeture de l’éditeur, le fichier modifié sera écrit dans/etc/systemd/system
, qui prévaudra sur la définition de l’unité du système (généralement trouvée quelque part dans/lib/systemd/system
).
Pour supprimer les ajouts que vous avez faits, supprimez le répertoire de configuration.d
de l’unité ou le fichier de service modifié de/etc/systemd/system
. Par exemple, pour supprimer un extrait, nous pourrions taper:
sudo rm -r /etc/systemd/system/nginx.service.d
Pour supprimer un fichier unité complètement modifié, nous tapons:
sudo rm /etc/systemd/system/nginx.service
Après avoir supprimé le fichier ou le répertoire, vous devez recharger le processussystemd
afin qu'il ne tente plus de référencer ces fichiers et revienne à l'utilisation des copies système. Vous pouvez le faire en tapant:
sudo systemctl daemon-reload
Réglage de l'état du système (niveau d'exécution) avec des cibles
Les cibles sont des fichiers d'unité spéciaux décrivant un état du système ou un point de synchronisation. Comme les autres unités, les fichiers qui définissent les cibles peuvent être identifiés par leur suffixe, qui dans ce cas est.target
. Les cibles ne font pas beaucoup elles-mêmes, mais sont utilisées pour regrouper d'autres unités.
Ceci peut être utilisé pour amener le système dans certains états, un peu comme les autres systèmes init utilisent des niveaux d'exécution. Ils servent de référence lorsque certaines fonctions sont disponibles, ce qui vous permet de spécifier l'état souhaité au lieu des unités individuelles nécessaires pour produire cet état.
Par exemple, il y a unswap.target
qui est utilisé pour indiquer que le swap est prêt à être utilisé. Les unités qui font partie de ce processus peuvent se synchroniser avec cette cible en indiquant dans leur configuration qu'elles sontWantedBy=
ouRequiredBy=
lesswap.target
. Les unités qui nécessitent la disponibilité du swap peuvent spécifier cette condition à l'aide des spécificationsWants=
,Requires=
etAfter=
pour indiquer la nature de leur relation.
Obtenir et définir la cible par défaut
Le processussystemd
a une cible par défaut qu'il utilise lors du démarrage du système. La satisfaction de la cascade de dépendances à partir de cette cible unique amènera le système à l'état souhaité. Pour trouver la cible par défaut pour votre système, tapez:
systemctl get-default
multi-user.target
Si vous souhaitez définir une cible par défaut différente, vous pouvez utiliser lesset-default
. Par exemple, si vous avez un bureau graphique installé et que vous souhaitez que le système démarre par défaut, vous pouvez modifier votre cible par défaut en conséquence:
sudo systemctl set-default graphical.target
Liste des cibles disponibles
Vous pouvez obtenir une liste des cibles disponibles sur votre système en tapant:
systemctl list-unit-files --type=target
Contrairement aux niveaux d'exécution, plusieurs cibles peuvent être actives en même temps. Une cible active indique quesystemd
a tenté de démarrer toutes les unités liées à la cible et n'a pas essayé de les détruire à nouveau. Pour voir toutes les cibles actives, tapez:
systemctl list-units --type=target
Isoler les cibles
Il est possible de démarrer toutes les unités associées à une cible et d’arrêter toutes les unités qui ne font pas partie de l’arbre de dépendance. La commande dont nous avons besoin pour ce faire est appelée, de manière appropriée,isolate
. Ceci est similaire à la modification du niveau d'exécution dans d'autres systèmes init.
Par exemple, si vous travaillez dans un environnement graphique avecgraphical.target
actif, vous pouvez arrêter le système graphique et mettre le système dans un état de ligne de commande multi-utilisateur en isolant lesmulti-user.target
. Puisquegraphical.target
dépend demulti-user.target
mais pas l'inverse, toutes les unités graphiques seront arrêtées.
Vous voudrez peut-être examiner les dépendances de la cible que vous isolez avant d'effectuer cette procédure pour vous assurer que vous n'interrompez pas les services essentiels:
systemctl list-dependencies multi-user.target
Lorsque vous êtes satisfait des unités qui seront maintenues en vie, vous pouvez isoler la cible en tapant:
sudo systemctl isolate multi-user.target
Utilisation de raccourcis pour des événements importants
Des cibles sont définies pour des événements importants tels que la mise hors tension ou le redémarrage. Cependant,systemctl
a également des raccourcis qui ajoutent un peu de fonctionnalités supplémentaires.
Par exemple, pour mettre le système en mode de secours (mono-utilisateur), vous pouvez simplement utiliser la commanderescue
au lieu deisolate rescue.target
:
sudo systemctl rescue
Cela fournira la fonctionnalité supplémentaire d'alerter tous les utilisateurs connectés sur l'événement.
Pour arrêter le système, vous pouvez utiliser la commandehalt
:
sudo systemctl halt
Pour lancer un arrêt complet, vous pouvez utiliser la commandepoweroff
:
sudo systemctl poweroff
Un redémarrage peut être lancé avec la commandereboot
:
sudo systemctl reboot
Tous ces messages alertent les utilisateurs connectés que l'événement se produit, ce qui ne fera pas qu'exécuter ou isoler la cible. Notez que la plupart des machines lieront les commandes plus courtes et plus conventionnelles pour ces opérations afin qu'elles fonctionnent correctement avecsystemd
.
Par exemple, pour redémarrer le système, vous pouvez généralement taper:
sudo reboot
Conclusion
À présent, vous devriez être familiarisé avec certaines des fonctionnalités de base de la commandesystemctl
qui vous permettent d'interagir avec et de contrôler votre instancesystemd
. L'utilitairesystemctl
sera votre principal point d'interaction pour la gestion des services et de l'état du système.
Alors quesystemctl
fonctionne principalement avec le processus de basesystemd
, il existe d'autres composants de l'écosystèmesystemd
qui sont contrôlés par d'autres services publics. D'autres fonctionnalités, telles que la gestion des journaux et les sessions utilisateur, sont gérées par des démons et des utilitaires de gestion distincts (journald
/journalctl
etlogind
/loginctl
respectivement). Prendre le temps de se familiariser avec ces autres outils et démons facilitera la gestion.