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


15

私のシステム(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を使用するべきではありませんか?

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

回答:


17

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

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

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

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

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

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

の出力を確認すると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つのinitシステムは共存し、ある程度の互換性がありますが、複雑な層があります。今後の出来事の複雑さを最小限に抑えるには、systemdユニットファイルとsystemctlツールを使用してサービスを管理するのが最善です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.