systemd 用于定位 System V 脚本的默认路径是什么?

systemd 用于定位 System V 脚本的默认路径是什么?

/etc/init.dsystemd 生成器用于将本机 SysV 脚本转换为单元文件并回退到的默认搜索路径,反之亦然/etc/rc?.d

由此回答通过@JdeBP:

该程序是一个生成器,是一种辅助实用程序,其工作是在 tmpfs 中动态创建服务单元文件,其中包含这九个目录中的另外三个目录(仅由生成器使用)。 如果没有找到其他六个位置中已存在的同名本机 systemd 服务单元,则生成运行 System V脚本systemd-sysv-generator的服务单元。rc/etc/init.d

但,Linux 是如何工作的书中提到了一些不同的东西:

  1. 首先,systemd 激活runlevel<N>.target,其中是运行级别。
  2. 对于 中的每个符号链接/etc/rc<N>.d,systemd 都会识别 中的脚本/etc/init.d
  3. systemd 将脚本名称与服务单元相关联(例如,/etc/init.d/foo将会foo.service)。
  4. systemd 激活服务单元并根据其在 .txt 文件中的名称,使用启动或停止参数运行脚本rc<N>.d
  5. systemd 尝试将脚本中的任何进程与服务单元关联起来。

据我所知,该过程按以下方式进行:systemd 在 中找到 SysV 脚本,/etc/init.d并根据运行级别,systemd 决定根据 中的符号链接名称(K*S*)启动或停止脚本/etc/rc?.d。这是有道理的,因为一旦 SysV 脚本转换为本机 systemd 单元文件,就必须从/etc/rc?.d.例如,我运行的是 Ubuntu 17.04:

$ ls -l /etc/rc5.d
lrwxrwxrwx 1 root root 15 Aug  4 00:10 S01acpid -> ../init.d/acpid
lrwxrwxrwx 1 root root 17 Aug  4 00:10 S01anacron -> ../init.d/anacron
lrwxrwxrwx 1 root root 16 Aug  4 00:10 S01apport -> ../init.d/apport
lrwxrwxrwx 1 root root 22 Aug  4 00:10 S01avahi-daemon -> ../init.d/avahi-daemon
...many more...

我可以看到脚本的所有符号链接都具有相同的执行顺序 01,这是故意这样做的,以便利用 systemd 中的并行性,因此还systemd-sysv-generator用于/etc/rc?.d确定依赖项的顺序(例如,BeforeAfter)。

由于脚本中的 LSB 标头决定了脚本运行的运行级别,因此我更倾向于默认的想法,systemd-sysv-generator/etc/init.d决定在哪个运行级别启动哪些脚本/etc/rc?.d,而不是 ,除非无法从脚本中的 LSB 标头。我的假设正确吗?

systemd-sysv-生成器(8)

LSB headers[2]SysV 中的 init 脚本被解释,并且标头中指定的顺序被转换为生成的单元和其他单元之间的依赖关系。 LSB 设施"$remote_fs", "$network", "$named", "$portmap","$time"受支持并将转换为对特定本机 systemd 目标的依赖项。

但手册页没有提及任何与没有 LSB 标头的情况相关的内容。几乎过于复杂:.

答案1

我将您的问题标记为重复。

在这里阅读 JdeBP 很好的答案:systemd 如何使用 /etc/init.d 脚本?

人们普遍认为,System Vrc脚本必须具有 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-Bymulti-user.target

事实上,搜索路径是什么的问题实际上是由您在问题中引用的内容解决的:

systemd-sysv-generator如果没有找到其他六个位置中已存在的同名本机 systemd 服务单元,则生成运行 System Vrc脚本的服务单元。/etc/init.d

更详细地说:

  • 对于脚本本身:
    • systemd-sysv-generator查找名为 的环境变量SYSTEMD_SYSVINIT_PATH
    • 扫描每个目录以查找设置了所有者执行权限位的常规文件,路径中较早的目录会覆盖较晚的目录(在搜索路径中只有一个目录的默认情况下,这种机制并未真正执行),并且存在具有相同名称的服务单元禁止生成这些随机数。
  • 对于“符号链接农场”:
    • 有一个类似的环境变量名为SYSTEMD_SYSVRCND_PATH.
    • 扫描每个目录中名为 的子目录rc[2345].d,这些子目录是反过来S扫描以和 两位十进制数字开头且长度至少为 4 个字符的目录条目。目录条目不会取消引用。

请注意systemd-sysv-generator……

  • ……不看起来K*东西上;
  • ……不检查符号链接场实际上充满了符号链接(它们可以是字符特殊文件或 FIFO,用于它所关心的所有内容,因为它仅有的看着名字.);和
  • ……不处理来自 LSB 注释(即Default-Start:Default-Stop:注释)的运行级别信息。

请记住,关于第三点,在 vanilla van Smoorenburg 中,rc来自 LSB 注释的运行级别信息并不直接控制引导/关闭行为。这是符号链接场目录的职责。用 systemd 术语描述 van Smoorenburg rc:符号链接农场就是服务使能够控制,确定哪些服务在引导时自动启动;而Default-Start:Default-Stop:评论是(非常近似)服务预设控制,即转换成启用控件。

答案2

我只是对此进行了一些试运行以了解更多信息,有点像卡皮答案的后续。

据我所知,systemd-sysv-generator它会执行以下操作:如果 /etc/init.d 中有一个脚本,它会检查/etc/rc?.d/并查看它是否是“任何运行级别”的一部分。如果是,它将其添加到 systemd 层次结构中的该运行级别。它还从 init.d 文件中的 LSB 标头获取描述信息。它还添加来自 LSB 的任何层次结构信息

# Required-Start: bar

键入行。

从那里开始事情变得更奇怪了。如果你运行systemctl enable my_service它基本上“farms out”到 chkconfig 来调整 /etc/rc?.d 目录,然后运行systemctl daemon-reload它来吸收新信息。然而,它的运行方式如下/sbin/chkconfig my_service on(注意尾随on),指示它在运行级别 2-5 上打开它,并且忽略init.d 文件中任意位置指定的级别。但是,如果您像这样手动运行 chkconfig,chkconfig --add my_service那么它会遵循脚本中指定的级别。

同样奇怪的是:如果 init.d 文件中没有指定运行级别并且尚未符号链接任何 /etc/rc?.d文件夹,然后systemd-sysv-generator假设您希望它在运行级别 4 和 5 中启动。
另外,即使您的默认启动运行级别是 3,这也是与...一样4和5。所以基本上它似乎假设你想要启动它,无论如何,尽管它没有在任何rc?.d目录中进行符号链接。

另请注意,如果某个服务被“禁用”,在旧版本的 systemd 上它不会显示在典型列表

另外值得注意的是,有两种方法可以指定运行级别,chkconfig 和 systemctl 似乎“更喜欢 LSB 而不是“旧风格”

chkconfig 手册页说:

Each service which should be manageable by chkconfig needs two or more commented lines added to its init.d script. 
...
# chkconfig: 2345 20 80
# description: Saves and restores system entropy pool for \
#              higher quality random number generation.
chkconfig also supports LSB-style init stanzas, and will apply them in preference to "chkconfig:" lines where available. A LSB stanza looks like:

### BEGIN INIT INFO
# Provides: foo
# Required-Start: bar
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Foo init script
### END INIT INFO

所以总的来说,这本书的顺序似乎不太正确。它systemd-sysv-generator在启动阶段很早就运行,并设置服务(如上所述),并且如果认为它们应该自动运行,还可以在“运行级别等效”目标中启用它们。然后启动继续,并按正常顺序启动所有服务systemd

etc/init.d and /etc/rc?.d因此,为了回答这个问题,它使用了每次systemd加载或重新加载的组合。以古怪的方式。

相关内容