web-dev-qa-db-ja.com

SysV、Upstart、systemd initスクリプトの共存

私のシステム(16.04)には、たとえば、ファイル/lib/systemd/system/network-manager.serviceおよび/etc/init.d/network-managerがあります。

これがどのように(そしてなぜ)機能するのか理解できません。 Network Managerは常にSudo service network-manager restartで再起動します。これはどういうわけかsystemdを台無しにすべきではありませんか?まだ機能しているようです。

service --status-allがすべての種類のサービスをリストするのはなぜですか? 16.04はUpstartの代わりにsystemdを使用すべきではありませんか?

誰かがこの共存の仕組みを説明してください。

14
user2061057

一度にアクティブにできるinitシステムは1つだけです。 16.04では、systemdです。

多くのパッケージには、複数のinitシステム用のファイルが付属しているため、異なるOS上の複数のinitシステムで管理できます。 Ubuntuでは、複数のinitシステム用のスクリプトがインストールされることがありますが、それらはすべて同時に使用されるわけではありません。

新しいinitシステムは、古いシステムとの互換性を維持しようとします。特に、systemdは、UpstartおよびSysV initスクリプトの両方との互換性を維持しようとします。

あなたが言及した「init.d」スクリプトの場合、それはUpstartスクリプトではなく「SysV」initスクリプトです。また、「SysV」initスクリプトは、「/ etc/rc5.d」などのディレクトリにシンボリックリンクされている場合にのみ、起動時に開始されます。 Network Managerにはシンボリックリンクがインストールされていないことがわかります。

systemdが古い「SysV」initスクリプトをどのように管理するかを理解するには、 systemdが/etc/init.d scirptsをどのように使用するか を参照してください。

次に、「service network-manager restart」でNetwork Managerを再起動する理由についての質問に答えます。 serviceコマンドは、UpstartスクリプトとSysV initスクリプトの両方で使用され、前者を優先します。 Network Managerには、16.04の/etc/init/network-manager.confにインストールされたUpstartスクリプトもあります。

Sudo strace service network-manager restartの出力を確認すると、何が起こっているのかを把握できます。最初に、出力はsystemctlが呼び出されていることを示し、コマンドがsystemdにリダイレクトされていることを示します。まず、/usr/bin/serviceを開いた直後に、ファイルをシェルスクリプトとして読み取り始めることがわかります。

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

serviceはシェルスクリプトであることがわかったので、そのソースコードを確認できます。ソースコードでは、is_systemdが検出および設定されていることがわかります。 systemdの場合、コマンドがsystemctl restart network-managerに書き換えられることがわかります。

したがって、3つの初期化システムは共存し、ある程度の互換性がありますが、複雑な層があります。今後の出来事の複雑さを最小限に抑えるには、systemdユニットファイルとsystemctlツールを使用してサービスを管理するのが最善です。

16
Mark Stosberg