我刚刚切换到 debian jessie,大多数东西都运行良好,包括我的图形显示管理器wdm
。
问题是,我只是不明白这是如何运作的。显然我的/etc/init.d/wdm
脚本被调用,因为当我提前exit
放在那里时,wdm 没有启动。但是当我选择重命名 /etc/rc3.d
目录时(我的默认运行级别曾经是 3),wdm 仍然启动。
我无法弄清楚 systemd 如何找到这个脚本,并且我不明白它对所有其他 init.d 脚本做了什么。
- systemd 何时以及如何运行 init.d 脚本?
- 从长远来看,我应该删除所有 init.d 脚本吗?
答案1
Chaos 的答案是一些文档所说的。但这并不是 systemd 实际所做的。 (这也不是范斯穆伦伯格rc
所做的。 范斯穆伦堡rc
明确地没有对于初学者来说,忽略用于计算静态排序的 LSB 标头insserv
。)Freedesktop 文档(例如“不兼容性”页面)在这些和其他方面实际上是错误的。 (HOME
环境变量其实是例如,经常设置。很长一段时间以来,这在任何地方都没有记录下来。至少现在它已经记录在手册中,但是 Freedesktop WWW 页面仍然没有得到纠正。)
systemd 的本机服务格式是服务单位。 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 稍后重新加载其配置时都会再次运行。
这个程序是一个发电机,一种辅助实用程序,其工作是在 tmpfs 中动态创建服务单元文件,其中另外三个目录(仅供生成器使用)位于该目录下。 如果在其他六个位置找不到已存在的同名本机 systemd 服务单元,则 生成运行 van Smoorenburg脚本systemd-sysv-generator
的服务单元。rc
/etc/init.d
systemd 服务管理只知道服务单元。这些自动(重新)生成的服务单元被编写为调用 van Smoorenburgrc
脚本。除其他外,他们有:
[单元] SourcePath=/etc/init.d/wibble [服务] ExecStart=/etc/init.d/wibble 启动 ExecStop=/etc/init.d/wibble 停止
公认的观点是 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
中的任何一个中列出的内容转换为与 systemd 的本机关系。运行级别在 systemd 世界中已经“过时”,您可以忘记它们。/etc/rc2.d/
/etc/rc3.d/
/etc/rc4.d/
Wanted-By
multi-user.target
进一步阅读
- systemd-sysv-生成器。 systemd 手册页。 Freedesktop.org。
- “生成进程中的环境变量”。
systemd.exec
。 systemd 手册页。 Freedesktop.org。 - https://unix.stackexchange.com/a/394191/5132
- https://unix.stackexchange.com/a/204075/5132
- https://unix.stackexchange.com/a/196014/5132
- https://unix.stackexchange.com/a/332797/5132
答案2
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 会立即运行脚本,而不考虑脚本名称的编号。其中一些很可能会因为顺序而失败。还有很多其他的不兼容应该考虑这一点。
如果同一个服务有 init 脚本和 .service 文件,一旦满足依赖关系(对于 init 脚本,则在 LSB 标头中定义),systemd 将执行这两个文件。