Coexistence de scripts d'initialisation SysV, Upstart et systemd

15

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

Je ne comprends pas comment (et pourquoi) cela fonctionne. Je redémarre toujours Network Manager par sudo service network-manager restart. Cela ne devrait-il pas gâcher Systemd d'une manière ou d'une autre? Cela semble toujours fonctionner.

Pourquoi énumère service --status-alltoutes sortes de services? 16.04 ne devrait-il pas utiliser systemd au lieu d'Upstart?

Quelqu'un veuillez expliquer comment fonctionne cette coexistence.

user2061057
la source

Réponses:

17

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

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

Les nouveaux systèmes d'initialisation tentent de maintenir la compatibilité avec les 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", pas d'un script Upstart. De plus, les scripts d'initialisation "SysV" ne seraient lancés au démarrage que s'ils étaient liés à un répertoire comme "/etc/rc5.d". Vous constaterez que Network Manager n'a pas de lien symbolique installé à cet endroit.

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

Maintenant, pour répondre à la question de savoir pourquoi cela fonctionne pour redémarrer Network Manager avec "service network-manager restart". La servicecommande est utilisée avec les scripts Upstart et les scripts d'initialisation SysV, préférant les premiers. Network Manager a également un script Upstart installé le 16.04 à /etc/init/network-manager.conf.

Si vous examinez la sortie de sudo strace service network-manager restart, vous pouvez avoir une idée de ce qui se passe. Tout d'abord, la sortie montre que l' systemctlappel est en cours, indiquant que la commande est redirigée vers systemd. Tout d'abord, peu de temps 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 servicec'est un script shell, nous pouvons aller vérifier le code source de celui-ci. Dans le code source, nous constatons qu'il is_systemdest détecté et défini. Pour le cas systemd, vous pouvez voir que la commande est réécrite pour être systemctl restart network-manager.

Ainsi, bien que les trois systèmes init coexistent et aient une certaine compatibilité, il existe des couches de complexité. Pour minimiser la complexité de ce qui se passe à l'avenir, il est préférable d'utiliser les fichiers d'unité systemd et l' systemctloutil pour gérer les services.

Mark Stosberg
la source