Koexistenz von SysV-, Upstart- und systemd-Init-Skripten

14

Auf meinem System (16.04) gibt es die Dateien /lib/systemd/system/network-manager.serviceund /etc/init.d/network-managerzum Beispiel.

Ich verstehe nicht, wie (und warum) das funktioniert. Ich starte Network Manager immer von neu sudo service network-manager restart. Sollte das System nicht irgendwie durcheinander bringen? Es scheint immer noch zu funktionieren.

Warum service --status-alllistet man alle Arten von Dienstleistungen auf? Sollte 16.04 nicht systemd anstelle von Upstart verwenden?

Jemand bitte erklären, wie diese Koexistenz funktioniert.

user2061057
quelle

Antworten:

17

Es kann immer nur ein Init-System aktiv sein. Am 16.04 ist das systemd.

Eine Reihe von Paketen wird mit Dateien für mehrere Init-Systeme geliefert, sodass sie mit mehreren Init-Systemen auf verschiedenen Betriebssystemen verwaltet werden können. Unter Ubuntu werden manchmal Skripte für mehrere Init-Systeme installiert, obwohl nicht alle gleichzeitig verwendet werden.

Neuere init-Systeme versuchen, die Kompatibilität mit älteren Systemen zu gewährleisten. Insbesondere versucht systemd, die Kompatibilität mit Upstart- und SysV-Init-Skripten aufrechtzuerhalten.

Bei dem von Ihnen erwähnten "init.d" -Skript handelt es sich um ein "SysV" -Initialisierungsskript, nicht um ein Upstart-Skript. Außerdem würden "SysV" -Init-Skripte nur beim Booten gestartet, wenn sie mit einem Verzeichnis wie "/etc/rc5.d" verknüpft wären. Sie werden feststellen, dass in Network Manager kein Symlink installiert ist.

Um zu verstehen , wie systemdalt „SysV“ Init - Skripte verwaltet, siehe Wie funktioniert systemd Verwendung /etc/init.d scirpts? .

Beantworten Sie nun die Frage, warum es funktioniert, Network Manager mit "service network-manager restart" neu zu starten. Der serviceBefehl wird sowohl mit Upstart-Skripten als auch mit SysV-Init-Skripten verwendet, wobei erstere bevorzugt werden. Network Manager hat auch ein Upstart-Skript am 16.04 um installiert /etc/init/network-manager.conf.

Wenn Sie die Ausgabe von überprüfen sudo strace service network-manager restart, können Sie ein Gefühl dafür bekommen, was passiert. Zunächst zeigt die Ausgabe, dass systemctlaufgerufen wird, und gibt an, dass der Befehl an systemd umgeleitet wird. Kurz nach dem Öffnen /usr/bin/servicesehen Sie zunächst, wie die Datei als Shell-Skript eingelesen wird:

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

Nachdem wir nun wissen, dass servicees sich um ein Shell-Skript handelt, können wir den Quellcode überprüfen. Im Quellcode finden wir, dass is_systemderkannt und gesetzt wird. Für den Fall systemd können Sie sehen, dass der Befehl umgeschrieben wird systemctl restart network-manager.

Während die drei Init-Systeme nebeneinander existieren und eine gewisse Kompatibilität aufweisen, gibt es Komplexitätsebenen. Um die Komplexität des zukünftigen Geschehens zu minimieren, sollten Sie System-Unit-Dateien und das systemctlTool zum Verwalten von Diensten verwenden.

Mark Stosberg
quelle