SysV,Upstart和systemd初始化脚本共存


15

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

我不明白这是如何(以及为什么)的。我总是通过重新启动Network Manager sudo service network-manager restart。这不应该以某种方式搞乱系统吗?它似乎仍然有效。

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

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

Answers:


17

一次只能有一个init系统处于活动状态。在16.04,这是systemd。

许多软件包附带了用于多个init系统的文件,因此可以使用不同OS上的多个init系统来管理它们。在Ubuntu上,有时会安装多个init系统的脚本,即使不是同时使用它们也是如此。

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

对于您提到的“ init.d”脚本,这是“ SysV”初始化脚本,而不是Upstart脚本。同样,“ SysV”初始化脚本只有在符号链接到“ /etc/rc5.d”之类的目录时,才会在引导时启动。您会发现Network Manager 那里没有安装符号链接。

要了解如何systemd管理旧的“ SysV”初始化脚本,请参见systemd如何使用/etc/init.d脚本?

现在,回答有关为什么它可以通过“ 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是一个shell脚本,我们可以检查它的源代码。在源代码中,我们发现is_systemd已检测到并设置了该代码。对于systemd情况,您可以看到该命令被重写为systemctl restart network-manager

因此,虽然这三个init系统共存并具有一定的兼容性,但仍然存在一些复杂性。为了使将来发生的事情的复杂性最小化,最好使用systemd单位文件和该systemctl工具来管理服务。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.