SysV,Upstart和systemd init脚本共存

在我的系统(16.04)上,有文件/lib/systemd/system/network-manager.service/etc/init.d/network-manager

我不明白这是如何工作的(以及为什么)。 我总是通过sudo service network-manager restart重启网络管理sudo service network-manager restart 。 难道不应该以某种方式弄乱系统吗? 它似乎仍然有效。

为什么service --status-all列出了各种服务? 16.04不应该使用systemd而不是Upstart吗?

有人请解释这种共存是如何运作的。

一次只能激活一个init系统。 16.04,这是系统化的。

许多软件包附带了多个init系统的文件,因此可以使用不同操作系统上的多个init系统来管理它们。 在Ubuntu上,有时会安装多个init系统的脚本,即使它们并非全部同时使用。

较新的init系统试图保持与旧版本的兼容性。 特别是,systemd尝试保持与Upstart和SysV init脚本的兼容性。

对于您提到的“init.d”脚本,这是一个“SysV”init脚本,而不是Upstart脚本。 此外,“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之后不久,您可以看到它开始在文件中作为shell脚本读取:

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

现在我们知道service是一个shell脚本,我们可以查看它的源代码。 在源代码中,我们发现is_systemd被检测并设置。 对于systemd情况,您可以看到该命令被重写为systemctl restart network-manager

因此,虽然三个init系统共存并且具有一定的兼容性,但是存在多层复杂性。 为了最大限度地降低未来发生的事情的复杂性,最好使用systemd单元文件和systemctl工具来管理服务。