Comment systemd utilise-t-il /etc/init.d les scripts?

120

Je viens de passer à Debian Jessie, et la plupart des choses fonctionnent bien, y compris mon gestionnaire d'affichage graphique wdm.

Le truc, c'est que je ne comprends tout simplement pas comment cela fonctionne. Évidemment, mon /etc/init.d/wdmscript s'appelle, parce que quand je mets un début exitdedans, wdm n'est pas commencé. Mais lorsque je renomme le répertoire /etc/rc3.d (mon niveau d’exécution par défaut étant 3), wdm est toujours démarré.

Je ne pouvais pas savoir comment systemd trouvait ce script et je ne comprenais pas ce qu'il faisait à tous les autres scripts init.d.

  • Quand et comment systemd lance-t-il les scripts init.d?
  • À long terme, devrais-je me débarrasser de tous les scripts init.d?
Martin Drautzburg
la source

Réponses:

166

La réponse du chaos est ce que disent certains documents. Mais ce n'est pas ce que systemd fait réellement. (Ce n’est pas non plus ce que van Smoorenburg a rcfait. Van Smoorenburg rcn’a certainement pas ignoré les en-têtes LSB, qui insservservaient au départ à calculer les ordres statiques.) La documentation de Freedesktop, telle que la page "Incompatibilités", est en réalité fausse, ces points et d’autres. (La HOMEvariable d'environnement , en fait , est souvent définie, par exemple. Cela a duré entièrement non documenté nulle part depuis longtemps. Il est maintenant documenté dans le manuel, au moins, mais cette page Freedesktop WWW n'a toujours pas été corrigée.)

Le format de service natif pour systemd est l' unité de service . La gestion des services proprement dite de systemd fonctionne uniquement avec ceux-ci, qu'elle lit dans l'un des neuf répertoires où les .servicefichiers (à l'échelle du système) peuvent vivre. /etc/systemd/system, /run/systemd/system, /usr/local/lib/systemd/systemEt /usr/lib/systemd/systemsont quatre de ces répertoires.

La compatibilité avec les rcscripts de van Smoorenburg est obtenue avec un programme de conversion, nommé systemd-sysv-generator. Ce programme est répertorié dans le /usr/lib/systemd/system-generators/répertoire et est donc exécuté automatiquement par systemd au début du processus d’amorçage, à chaque démarrage, puis chaque fois que ce dernier reçoit l’instruction de recharger ultérieurement sa configuration.

Ce programme est un générateur , un type d’utilitaire auxiliaire dont la tâche est de créer des fichiers d’unité de service à la volée, dans un fichier tmpfs où se trouvent trois des neuf répertoires supplémentaires (destinés à être utilisés uniquement par des générateurs). systemd-sysv-generatorgénère les unités de service qui exécutent les rcscripts van Smoorenburg à partir de /etc/init.d, si aucune unité de service systemd native portant ce nom n'existe déjà dans les six autres emplacements.

La gestion des services systemd ne connaît que les unités de service. Ces unités de service (régénérées) automatiquement sont écrites pour appeler les rcscripts de van Smoorenburg . Ils ont, entre autres:

[Unité]
SourcePath = / etc / init.d / wibble
[Un service]
ExecStart = / etc / init.d / wibble start
ExecStop = / etc / init.d / wibble stop

Selon la sagesse reçue, les rcscripts van Smoorenburg doivent avoir un en-tête LSB et s'exécuter en parallèle sans respecter les priorités imposées par le /etc/rc?.d/système. Ceci est incorrect sur tous les points.

En fait, ils ne ont pas besoin d'avoir une tête LSB, et si elles ne systemd-sysv-generatorpeuvent reconnaître les anciens en- têtes commentaire RedHat plus limités ( description:, pidfile:et ainsi de suite). De plus, en l'absence d'un en-tête LSB, il reviendra au contenu des /etc/rc?.dfermes de liens symboliques, lisant les priorités encodées dans les noms de liens et construisant un ordre avant / après, sérialisant les services. Non seulement les en-têtes LSB ne sont pas obligatoires, et non seulement ils codent eux-mêmes les commandes avant / après qui sérialisent les choses dans une certaine mesure, mais le comportement de repli dans leur absence totale est en réalité un fonctionnement nettement non parallélisé.

La raison pour laquelle cela /etc/rc3.dn'a pas semblé avoir de l'importance, c'est que ce script avait probablement été activé via un autre /etc/rc?.d/répertoire. systemd-sysv-generatortraduit être répertorié dans aucun des /etc/rc2.d/, /etc/rc3.d/et /etc/rc4.d/dans une Wanted-Byrelation native à systemd multi-user.target. Les niveaux d'exécution sont "obsolètes" dans le monde systemd et vous pouvez les oublier.

Lectures complémentaires

JdeBP
la source
2
Dans Debian, le répertoire générateurs de systèmes ne réside pas dans / usr / lib, mais dans / lib packages.debian.org/sid/amd64/systemd/filelist
Braiam
5
C'est une réponse étonnante. Bravo monsieur.
peelman
1
Merci, merci, merci pour cela! Faire face à une combinaison de systèmes Debian 8 et RH / CentOS 7 a rendu la gestion de la gestion des dépendances de services SysVInit vs Systemd un peu compliquée, mais cette explication de ce que fait Systemd m'a beaucoup aidé à comprendre.
Toby
Ce générateur fonctionne. Je voudrais également mentionner, pour les adeptes, que si vous avez une version plus ancienne de systemdet que le script /etc/init.d n’est pas configuré pour "démarrer au démarrage", il fonctionnera toujours comme prévu, mais ne sera pas affiché dans le répertoire. Listes des salons
rogerdpack
Ce générateur fonctionne. Je voudrais également mentionner, pour les adeptes, que si vous avez une ancienne version de systemd et un script /etc/init.d qui n'est pas configuré pour "démarrer au démarrage", il démarrera / s'arrêtera comme prévu à l'aide de systemctl mais sera gagné. ne s'affiche pas dans les listes de show-units: unix.stackexchange.com/questions/517872/… et notez aussi que vous "ne pouvez" pas contrôler ces services en lançant /etc/init.d/xx directement ou que systemd obtient ... confus quant à ce qui fonctionne et ce qui ne l'est pas: |
rogerdpack
17

Systemd est rétrocompatible avec les scripts d'initialisation SysV. Selon LSB 3.1, le script d'initialisation doit avoir des conventions de commentaires informatives , définissant à quel moment le script doit être démarré / arrêté et ce qui est requis pour que le script puisse être démarré / arrêté. Ceci est un exemple:

### BEGIN INIT INFO
# Provides: my-service
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop service my-service
# Description: my-service blah blah ...
### END INIT INFO

Il s'agit d'une section commentée ignorée par SysV. D'autre part, systemd lit ces informations de dépendance et exécute ces scripts en fonction de cela.

Mais il y a un point où systemd et SysV diffèrent en termes de scripts d'initialisation. SysV exécute les scripts dans un ordre séquentiel basé sur leur numéro dans le nom du fichier. Systemd ne le fait pas. Si les dépendances sont remplies, systemd exécute les scripts immédiatement, sans respecter la numérotation des noms de script. Certains d'entre eux vont probablement échouer à cause de la commande. Il y a beaucoup d'autres incompatibilités à prendre en compte.


S'il existe des scripts d'initialisation et des fichiers .service pour le même service, systemd les exécutera dès que les dépendances seront satisfaites (dans le cas du script d'initialisation, celles définies dans l'en-tête LSB).

le chaos
la source
D'accord, mais j'ai aussi tout un tas de fichiers .service dans / lib / systemd / system /. Qu'est-ce que systemd exécute réellement? Qu'est-ce qui est spécifié dans les fichiers de service (dans l'ordre de dépendance), les scripts init.d ou les deux?
Martin Drautzburg
@MartinDrautzburg J'ai ajouté cela à la réponse
chaos
1
En tant que sidenote, Debian vient d' annoncer la compatibilité de vider LSB: article.gmane.org/gmane.linux.debian.devel.lsb/1103
Jan
systemd est tout mais compatible avec les scripts SysV. Non seulement cette déclaration est-elle incorrecte, mais le lien référencé indique clairement qu'elle n'est que "principalement compatible" et que l'effort nécessaire pour obtenir les mêmes résultats est incroyablement énorme.
Julie à Austin le