systemd 仍然有运行级别的概念吗?例如,使用没有意义吗telinit <number>
?
答案1
在 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和 a
default.target
之一或两者)、 a或 an 。关闭过程涉及a ,a ,a ,或a 。graphical.target
multi-user.target
rescue.target
emergency.target
shutdown.target
reboot.target
halt.target
poweroff.target
不涉及运行级别目标在引导或关闭中。 - 人们可能认为该
telinit
命令使用兼容性符号链接来映射其命令行参数,但它也没有这样做。程序的源代码中有一个硬连线表telinit
,并且数字2
、3
、4
和5
作为命令的参数被硬连线映射到multi-user.target
和graphical.target
。 systemd-update-utmp
还有一个内部硬连线表。
- 相反,引导过程使用 a (以及 a和 a
- 没有运行级别内容的“初始化表”。 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 行为,即抱怨命令被错误调用。
进一步阅读
- 伦纳特·珀特林等人
runlevel
。 systemd 手册页。 Freedesktop.org。 - 伦纳特·珀特林等人
telinit
。 systemd 手册页。 Freedesktop.org。 - 伦纳特·珀特林等人
bootup
。 systemd 手册页。 Freedesktop.org。 - 伦纳特·珀特林 (2015-02-08)。无处不在:删除 sysv 运行级别到目标映射的可配置性。系统d。 github。
- https://unix.stackexchange.com/a/196014/5132
- https://unix.stackexchange.com/a/196197/5132
- https://unix.stackexchange.com/a/233581/5132
- https://unix.stackexchange.com/a/211927/5132
- https://unix.stackexchange.com/a/392612/5132
- 乔纳森·德博因·波拉德 (2015)。
/etc/inittab
已成为过去。。常见答案。
答案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。