进一步阅读

进一步阅读

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

答案1

SystemD 运行级别底层

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

附件应该澄清这个问题。

如何更改当前的运行级别?

$ systemctl isolate runlevelX.target

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

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

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

systemctl set-default [target name].target

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

$ systemctl list-units --type=target

答案2

不。正如 systemd 的人自己写了两次一样,一次在他们的telinit手册中,一次在他们的runlevel手册中,运行级别已经“过时”了。您可以忘记运行级别。

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

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

如果一个人是构建 systemd 的系统的用户,就像提问者在“Arch Linux 中所做的那样”为什么 `init 0` 会导致 Arch 安装时出现“多余参数”?”,人们甚至没有获得兼容性垫片,并且诸如此类的命令init 0会导致“本机”systemd 行为,即抱怨命令被错误调用。

进一步阅读

答案3

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

例如:

ls -ll /usr/lib/systemd/system/runlevel*.target

输出:

/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

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

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

如果您有兴趣了解所有可能的目标:

ls /usr/lib/systemd/system/*.target

答案4

引入了systemd目标作为对应方运行级别在 sysV 初始化系统中。 sytemd 开发人员使其几乎与大多数 sysV 脚本兼容。同样的情况也发生在 telinit <runlevel>.这被翻译成 systemd 等价物。

例如telinit 0关闭机器电源。系统有断电目标做同样的事情运行级别0。所以telinit 0是由systemd翻译来激活的断电目标

但 sytemd 和 sysV init 系统存在一些兼容性问题->https://www.freedesktop.org/wiki/Software/systemd/Incompatibility

相关内容