systemd如何使用/etc/init.d脚本?


120

我只是改用了debian jessie,大多数情况都可以正常运行,包括我的图形显示管理器wdm

问题是,我只是不了解它是如何工作的。显然,我的/etc/init.d/wdm脚本被调用了,因为当我exit在其中放早时,wdm没有启动。但是,当我选择重命名/etc/rc3.d目录(我的默认运行级别以前是3)时,wdm仍然会启动。

我无法找到systemd如何找到该脚本,也无法理解它对所有其他init.d脚本的作用。

  • systemd何时以及如何运行init.d脚本?
  • 从长远来看,我应该摆脱所有init.d脚本吗?

Answers:


166

混乱的答案是一些文档所说的。但这不是systemd实际执行的操作。(这也不是van Smoorenburg rc所做 的。vanSmoorenburgrc绝对忽略insserv初学者的LSB标头,该标头用于计算静态顺序。)Freedesktop文档,例如“不兼容”页面,实际上是错误的。这些和其他要点。(在HOME事实上环境变量往往设置,例如,这完全走到了很长一段时间任何地方无证。现在它记录在手册中,至少,但Freedesktop的WWW页面仍然没有得到纠正。)

systemd的本机服务格式是service unit。systemd的服务管理适当地根据那些内容进行操作,它从可驻留(系统范围).service文件的九个目录之一读取该目录。 /etc/systemd/system/run/systemd/system/usr/local/lib/systemd/system,和/usr/lib/systemd/system那些目录中的四个。

与van Smoorenburg rc脚本的兼容性是通过名为的转换程序实现的systemd-sysv-generator。该程序在/usr/lib/systemd/system-generators/目录中列出,因此在每次引导时由systemd在引导过程的早期自动运行,并在以后每次指示systemd重新加载其配置时再次运行。

该程序是generator的一种辅助工具,其作用是在tmpfs中动态创建服务单元文件,在这9个目录中的另外三个目录(仅供生成器使用)中定位。 如果找不到在其他六个位置已经存在的该名称的本地systemd服务单元,则从中systemd-sysv-generator生成运行van Smoorenburg rc脚本的/etc/init.d服务单元。

系统服务管理仅了解服务单元。编写这些自动(重新)生成的服务单元以调用van Smoorenburg rc脚本。除其他外,它们具有:

[单元]
SourcePath = / etc / init.d / wibble
[服务]
ExecStart = / etc / init.d /摆动启动
ExecStop = / etc / init.d /摆动停止

rc普遍认为,van Smoorenburg 脚本必须具有LSB标头,并且在不遵循/etc/rc?.d/系统施加的优先级的情况下并行运行。在所有方面这都是不正确的。

实际上,它们不需要LSB标头,如果不需要,则systemd-sysv-generator可以识别出更为有限的旧RedHat注释标头(description:pidfile:等等)。而且,在没有LSB头的情况下,它将退回到/etc/rc?.d符号链接服务器场的内容,读取编码为链接名称的优先级,并从它们中构造一个前后顺序,从而对服务进行序列化。LSB报头不仅不是必需的,而且不仅它们自己在对事物进行序列化的顺序之前/之后进行编码,而且在完全不存在的情况下,回退行为实际上是明显的非并行操作。

/etc/rc3.d似乎无关紧要的原因是您可能已通过另一个/etc/rc?.d/目录启用了该脚本。 systemd-sysv-generator转换以任何形式列出的内容/etc/rc2.d//etc/rc3.d//etc/rc4.d/转换成Wanted-By与systemd的本机关系multi-user.target。运行级别在系统世界中已“过时”,您可以将其忘记。

进一步阅读


2
在Debian系统生成目录不生活在/ usr / lib中,但/ lib目录packages.debian.org/sid/amd64/systemd/filelist
Braiam

5
这是一个惊人的答案。干得好先生。
Peelman '17

1
谢谢,谢谢,谢谢你!处理Debian 8和RH / CentOS 7系统的混合问题使SysVInit vs Systemd服务依赖关系管理的管理变得有些头疼,但是对systemd正在做什么的这种解释极大地帮助了我的理解。
Toby

此生成器确实起作用。对于追随者,我还要提到的是,如果您使用的是旧版本,systemd并且/etc/init.d脚本未设置为“启动时启动”,它仍将按预期运行,但不会显示在show-units列表:unix.stackexchange.com/a/518894/8337
rogerdpack

此生成器确实起作用。对于追随者,我还要提到的是,如果您有一个较旧的systemd版本和一个未设置为“启动时启动”的/etc/init.d脚本,它仍将使用systemctl按预期方式启动/停止,但不会显示在show-units列表中:unix.stackexchange.com/questions/517872/…另外请注意,您基本上不再可以通过直接运行/etc/init.d/xx来直接控制这些服务,或者systemd得到...对于正在运行的东西和什么不是:|感到困惑
rogerdpack

17

Systemd 与SysV初始化脚本向后兼容。根据LSB 3.1,初始化脚本必须具有信息注释约定,该注释约定定义了脚本何时必须启动/停止以及脚本启动/停止所需的条件。这是一个例子:

### BEGIN INIT INFO
# Provides: my-service
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop service my-service
# Description: my-service blah blah ...
### END INIT INFO

这是一个注释部分,SysV会忽略它。另一方面,systemd读取该依赖项信息并根据该信息运行那些脚本。

但是有一点,systemd和SysV在初始化脚本方面有所不同。SysV基于文件名中的脚本顺序执行脚本。Systemd没有。如果满足依赖关系,systemd将立即运行脚本,而无需遵守脚本名称的编号。其中一些很可能会因为订购而失败。还有许多其他不兼容性应考虑。


如果存在同一服务的初始化脚本和.service文件,则在满足依赖关系后,systemd将同时执行这两个命令(对于init脚本,则是在LSB头文件中定义的依赖项)。


好的,但是我在/ lib / systemd / system /中也有一堆.service文件。systemd实际执行什么操作?服务文件中(以依序顺序),init.d脚本或两者都指定了什么?
Martin Drautzburg

@MartinDrautzburg我在回答中补充了这一点
混乱

1
作为旁注,Debian刚刚宣布放弃LSB兼容性:article.gmane.org/gmane.linux.debian.devel.lsb/1103
1

systemd是与SysV脚本兼容的任何东西。该语句不仅不正确,而且引用的链接清楚地表明它仅是“大部分兼容的”,并且产生相同结果所需的工作量异常庞大。
朱莉·奥斯汀
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.