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 systemd
gè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 service
commande 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' systemctl
appel 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 service
c'est un script shell, nous pouvons aller vérifier le code source de celui-ci. Dans le code source, nous constatons qu'il is_systemd
est 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' systemctl
outil pour gérer les services.