Autant que je sache au démarrage du système Linux, les services mentionnés dans les niveaux d'exécution (rcX.d
) seraient lancés.
Si nous permettons à un service de démarrer au démarrage à l'aide de la commande systemctl
, ce service sera-t-il ajouté au niveau d'exécution par défaut?
En fait non, ce n'est pas le cas mais vous pouvez exécuter:
systemctl show -p WantedBy service-name
pour trouver dans quelle cible il sera exécuté, par exemple:
systemctl show -p WantedBy tlp.service
WantedBy=multi-user.target
ce qui indique que si j'active tlp
name__, il sera lancé lorsque j'entrerai dans multi-user.target
.
Il convient également de mentionner que les niveaux d’exécution sont obsolètes et que systemd utilise à la place la cible:
┌─────────┬───────────────────┐
│Runlevel │ Target │
├─────────┼───────────────────┤
│0 │ poweroff.target │
├─────────┼───────────────────┤
│1 │ rescue.target │
├─────────┼───────────────────┤
│2, 3, 4 │ multi-user.target │
├─────────┼───────────────────┤
│5 │ graphical.target │
├─────────┼───────────────────┤
│6 │ reboot.target │
└─────────┴───────────────────┘
Autant que je sache au démarrage du système Linux, les services mentionnés dans les niveaux d'exécution (rcX.d) seraient démarrés.
Le système systemd
init n'utilise pas de manière native le concept de niveaux d'exécution. Au lieu de cela, il introduit un concept de "cibles" qui regroupe d’autres unités en utilisant le mécanisme des dépendances.
Ce qui était un "niveau d'exécution par défaut" devient l'unité default.target
qui, lorsqu'elle est activée, peut "extraire" (activer) d'autres unités via des dépendances d'exigences.
(systemd
ne fournit une couche de compatibilité pour le concept d'exécution, en donnant à certaines cibles des alias avec des noms tels que runlevelX.target
, qui sont ensuite utilisés par les outils tels que telinit
, mais c'est à peu près cela. Dans Systemd , un service ou toute autre unité n'est pas tenu d'appartenir à l'un de ces pseudo-niveaux d'exécution.)
Ainsi, lorsque vous activez un service (ou une unité), systemd examine la section [Install]
de cette unité et effectue les actions spécifiées dans celle-ci. Par exemple, examinons sshd.service
sur ma machine:
# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH Daemon
Wants=sshdgenkeys.service
After=sshdgenkeys.service
After=network.target
[Service]
ExecStart=/usr/bin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
[Install]
WantedBy=multi-user.target
# This service file runs an SSH daemon that forks for each incoming connection.
# If you prefer to spawn on-demand daemons, use sshd.socket and [email protected].
Lorsque vous écrivez systemctl enable sshd.service
, systemd examine cette unité et ajoute une dépendance Wants=
de multi-user.target
à sshd.service
conformément à la directive WantedBy=multi-user.target
.
(Cette dépendance est physiquement stockée sous forme de lien symbolique de /etc/systemd/system/multi-user.target.wants
à /usr/lib/systemd/system/sshd.service
.)
Lorsque vous démarrez, default.target
est activé, ainsi que tout le reste, via les dépendances. C'est ce qu'on appelle "la transaction initiale", et c'est tout.
Votre default.target
est probablement un alias de graphical.target
(quel Wants=multi-user.target
) ou de multi-user.target
directement. Quoi qu'il en soit, multi-user.target
est activé et extrait sshd.service
via la dépendance mentionnée ci-dessus.