systemd 还知道运行级别吗?

drp*_*eas 20 systemd runlevel

systemd 还有运行级别的概念吗?例如,使用没有意义telinit <number>吗?

Tyl*_*nis 16

SystemD 运行级底层

在 SystemD(aemon) 中,运行级别公开为“目标”。这个概念仍然存在,但为您的要求产生所需结果的工作流程是不同的。

附件应澄清这个问题。

如何更改当前运行级别?

$ systemctl isolate runlevelX.target
Run Code Online (Sandbox Code Playgroud)

如何更改下次启动的默认运行级别?

# Create a symlink
$ ln -sf /usr/lib/systemd/system/multi-user.target /etc/systemd/system/default.target
Run Code Online (Sandbox Code Playgroud)
  • ln -sf TARGET DESTINATION
  • -s 创建符号链接
  • -f 删除现有的目标文件

或者(如@centimane 建议的那样)只需使用“blessed”systemd命令:

systemctl set-default [target name].target
Run Code Online (Sandbox Code Playgroud)

如何识别当前的运行级别?

$ systemctl list-units --type=target
Run Code Online (Sandbox Code Playgroud)

  • 如果您的 systemd 包是使用 SysV 兼容支持构建的,它将包含一个指向 systemd 二进制文件的 telinit 符号链接,当它被称为 telinit 时,会将运行级别 0-6 映射到 systemd 目标 - 检查 telinit(8) 以获取这些映射的列表. (2认同)
  • 要更改默认目标,您应该使用 `systemctl set-default [target name].target` 而不是手动创建链接。 (2认同)

Jde*_*eBP 14

不。由于 systemd 人员自己写了两次,一次在他们的telinit手册中,一次在他们的runlevel手册中,运行级别是“过时的”。您可以忘记运行级别。

这些东西实际上根本不存在于 systemd 中,除了一些兼容性垫片。

  • 目标名称有一些符号链接,但 systemd 从未真正使用过这些目标。
    • 而是,引导过程使用 a default.target(以及 agraphical.target和 a之一或两者multi-user.target)、 arescue.target或 an emergency.target。关闭过程涉及 a shutdown.target、 a reboot.target、 ahalt.target或 a poweroff.target。 bootstrap 或 shutdown都不涉及运行级目标
    • telinit人们可能认为该命令使用兼容性符号链接来映射其命令行参数,但它也没有这样做。telinit程序的源代码中有一个硬连线表,数字2, 3, 4, 和5作为命令的参数被硬连线映射到multi-user.targetgraphical.target
    • systemd-update-utmp 还有一个内部硬接线表。
  • 没有运行级别内容的“初始化表”。systemd 仅与 van Smoorenburg 兼容,与 van Smoorenburgrc不兼容init
  • systemd 本身没有维护“当前运行级别”值。相反,几乎全部未记录的systemd-update-utmp命令,在激活的项内部操作的状态rescue.targetmulti-user.targetgraphical.target
  • systemd-sysv-generator,systemd 的向后兼容性服务单元生成器,将/etc/rc[234].d目录合并Wanted-Bymulti-user.target与生成的服务单元的唯一关系。在生成的服务单元中没有对运行级别的实际引用。(多年前曾经有过,但 systemd 人员发现这出错了,因为他们没有在其他任何地方被引用。)

如果一个人是在问他的Arch Linux的是建立一个systemd系统的用户“为什么`初始化0`导致‘过剩参数’上拱安装? ”,一个甚至没有获得兼容性垫片,和这样的命令作为init 0结果,在“本机” systemd行为,这是抱怨命令已被不正确地调用。

进一步阅读


drp*_*eas 5

非常感谢。所以,如果我理解正确:

例如:

ls -ll /usr/lib/systemd/system/runlevel*.target
Run Code Online (Sandbox Code Playgroud)

输出:

/usr/lib/systemd/system/runlevel0.target -> poweroff.target
/usr/lib/systemd/system/runlevel1.target -> rescue.target
/usr/lib/systemd/system/runlevel2.target -> multi-user.target
/usr/lib/systemd/system/runlevel3.target -> multi-user.target
/usr/lib/systemd/system/runlevel4.target -> multi-user.target
/usr/lib/systemd/system/runlevel5.target -> graphical.target
/usr/lib/systemd/system/runlevel6.target -> reboot.target
Run Code Online (Sandbox Code Playgroud)

因此,正如您所看到的,运行级别的概念确实存在,但由于 runlevel.target 文件实际上并不是“真实”文件,而是指向新的、现代的、命名更好的文件方案的软链接,因此它已经过时了。 systemd 喜欢称它们为“目标”。

所以,如果你想做某事telinit 5,就像这样:systemctl isolate runlevel5.target 这与:(systemctl isolate graphical.target我认为推荐)相同。

以防万一您有兴趣了解所有可能的目标:

ls /usr/lib/systemd/system/*.target
Run Code Online (Sandbox Code Playgroud)