it-swarm.com.de

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

Auf meinem System (16.04) befinden sich beispielsweise die Dateien /lib/systemd/system/network-manager.service und /etc/init.d/network-manager.

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

Warum listet service --status-all alle Arten von Diensten auf? Sollte 16.04 nicht systemd anstelle von Upstart verwenden?

Jemand bitte erklären, wie diese Koexistenz funktioniert.

14
user2061057

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 aufrechtzuerhalten. 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 systemd alte "SysV" -Init-Skripte verwaltet, lesen Sie Wie verwendet das System /etc/init.d scirpts? .

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

Wenn Sie die Ausgabe von Sudo strace service network-manager restart überprüfen, können Sie ein Gefühl dafür bekommen, was passiert. Erstens zeigt die Ausgabe, dass systemctl aufgerufen wird, was anzeigt, dass der Befehl an systemd umgeleitet wird. Erstens, kurz nachdem es /usr/bin/service geöffnet hat, können Sie sehen, dass es beginnt, die Datei als Shell-Skript einzulesen:

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

Jetzt, da wir wissen, dass service ein Shell-Skript ist, können wir den Quellcode überprüfen. Im Quellcode finden wir, dass is_systemd erkannt und gesetzt wird. Im Fall systemd sehen Sie, dass der Befehl in systemctl restart network-manager umgeschrieben wird.

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

16
Mark Stosberg