web-dev-qa-db-fra.com

Coexistence de scripts SysV, Upstart et systemd init

Sur mon système (16.04), il y a les fichiers /lib/systemd/system/network-manager.service et /etc/init.d/network-manager, par exemple.

Je ne comprends pas comment (et pourquoi) cela fonctionne. Je redémarre toujours Network Manager avec Sudo service network-manager restart. Ce bordel ne devrait-il pas en quelque sorte? Cela semble encore fonctionner.

Pourquoi service --status-all répertorie tous les types de services? 16.04 ne devrait-il pas utiliser systemd au lieu de Upstart?

Quelqu'un s'il vous plaît expliquer comment cette coexistence fonctionne.

14
user2061057

Un seul système init peut être actif à la fois. Le 16.04, c'est systemd.

Un certain nombre de packages sont livrés avec des fichiers pour plusieurs systèmes init. Ils peuvent donc être gérés avec plusieurs systèmes init sur différents systèmes d'exploitation. Sur Ubuntu, des scripts sont parfois installés pour plusieurs systèmes init, même s'ils ne sont pas tous utilisés en même temps.

Les nouveaux systèmes init tentent de maintenir la compatibilité avec les plus anciens. En particulier, systemd essaie de maintenir la compatibilité avec les scripts d'initialisation Upstart et SysV.

Dans le cas du script "init.d" que vous avez mentionné, il s'agit d'un script d'initialisation "SysV" et non d'un script Upstart. De plus, les scripts d'initialisation "SysV" ne seraient démarrés au démarrage que s'ils étaient liés de manière symétrique à un répertoire du type "/etc/rc5.d". Vous constaterez que Network Manager ne dispose pas de lien symbolique.

Pour comprendre comment systemd gère les anciens scripts d’initiation "SysV", voir Comment systemd utilise-t-il /etc/init.d scirpts? .

Maintenant, pour répondre à la question sur le fonctionnement du redémarrage de Network Manager avec "redémarrage du gestionnaire de réseau de service". La commande service est utilisée avec les scripts Upstart et les scripts SysV init, préférant le premier. Network Manager a également un script Upstart installé le 16.04 à /etc/init/network-manager.conf.

Si vous examinez le résultat de Sudo strace service network-manager restart, vous pourrez avoir une idée de ce qui se passe. Premièrement, le résultat indique que systemctl est appelé, ce qui indique que la commande est redirigée vers systemd. Premièrement, peu après son ouverture, /usr/bin/service, vous pouvez le voir commencer à lire dans le fichier en tant que script Shell:

open("/usr/sbin/service", O_RDONLY)     = 3
...
read(10, "#!/bin/sh\n\n#####################"..., 8192) = 8192

Maintenant que nous savons que service est un script Shell, nous pouvons aller en vérifier le code source. Dans le code source, nous constatons que is_systemd est détecté et défini. Pour le cas systemd, vous pouvez voir que la commande est réécrite pour devenir systemctl restart network-manager.

Ainsi, alors que les trois systèmes init coexistent et ont une certaine compatibilité, il existe des niveaux de complexité. Pour minimiser la complexité de la situation, il est préférable d’utiliser les fichiers d’unité systemd et l’outil systemctl pour gérer les services.

16
Mark Stosberg