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

Mar*_*urg 153 init-script systemd init sysvinit

我刚切换到 debian jessie,大多数东西都运行正常,包括我的图形显示管理器wdm

问题是,我只是不明白这是如何工作的。显然我的/etc/init.d/wdm脚本被调用了,因为当我exit在那里提前放置时,wdm 没有启动。但是当我或者重命名 /etc/rc3.d目录时(我的默认运行级别曾经是 3),然后 wdm 仍然启动。

我不知道 systemd 如何找到这个脚本,我不明白它对所有其他 init.d 脚本做了什么。

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

Jde*_*eBP 200

混乱的答案是一些文件所说的。但这不是 systemd 实际所做的。(这也不是 van Smoorenburgrc所做的。 对于初学者来说,van Smoorenburgrc绝对没有忽略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 Smoorenburgrc脚本的兼容性是通过名为systemd-sysv-generator. 该程序在/usr/lib/systemd/system-generators/目录中列出,因此在每次引导时在引导过程的早期由 systemd 自动运行,并且在每次 systemd 被指示稍后重新加载其配置时都会再次运行。

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

systemd 服务管理只知道服务单元。编写这些自动(重新)生成的服务单元以调用 van Smoorenburgrc脚本。除其他外,他们有:

[单元]
SourcePath=/etc/init.d/wibble
[服务]
ExecStart=/etc/init.d/wibble start
ExecStop=/etc/init.d/wibble stop

公认的观点是,van Smoorenburgrc脚本必须有一个 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。运行级别在 systemd 世界中是“过时的”,您可以忘记它们。

进一步阅读

  • 这是一个直截了当的惊人答案。先生干得好。 (6认同)
  • 在 Debian 中,system-generators 目录不在 /usr/lib,而是 /lib https://packages.debian.org/sid/amd64/systemd/filelist (2认同)

cha*_*aos 20

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

### 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
Run Code Online (Sandbox Code Playgroud)

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

但是有一点,systemd 和 SysV 在初始化脚本方面有所不同。SysV 根据脚本在文件名中的编号按顺序执行脚本。Systemd 没有。如果满足依赖关系,systemd 会立即运行脚本,而不考虑脚本名称的编号。其中一些很可能会因为排序而失败。还有很多其他的不兼容问题需要考虑。


如果同一服务有 init 脚本和 .service 文件,systemd 将在满足依赖关系后立即执行这两个文件(在 init 脚本的情况下,在 LSB 标头中定义的那些)。

  • systemd 与 SysV 脚本完全不兼容。该声明不仅不正确,而且引用的链接清楚地表明它只是“大部分兼容”,并且产生相同结果所需的工作量非常巨大。 (2认同)
  • 我发现如果 /etc/init.d 中的文件是符号链接,则扫描旧版 init.d 脚本的 systemd 生成器“systemd-sysv-generator”将跳过它。init.d 中的 gerrit 文件是 /home/gerrit2/gerrit/bin/gerrit.sh 的符号链接,我用以下命令修复了它: cd /etc/init.d; sudo 取消链接 gerrit;sudo cp /home/gerrit2/gerrit/bin/gerrit.sh gerrit (2认同)

归档时间:

查看次数:

194526 次

最近记录:

5 年,5 月 前