这已经不再是事实了。

这已经不再是事实了。

据我所知,当我们启动 Linux 系统时,运行级别(rcX.d)中提到的服务将会启动。

如果我们使用命令启用任何服务在启动期间启动,systemctl那么该服务是否会添加到默认运行级别?

答案1

事实上不是的,但是你可以运行:

systemctl show -p WantedBy service-name

查找它将在哪个目标中运行,例如:

systemctl show -p WantedBy tlp.service 
WantedBy=multi-user.target

这表明如果我启用tlp它将在我进入时启动multi-user.target

还值得一提的是,运行级别已被弃用,并且 systemd 改用目标:

┌─────────┬───────────────────┐
│Runlevel │ Target            │
├─────────┼───────────────────┤
│0        │ poweroff.target   │
├─────────┼───────────────────┤
│1        │ rescue.target     │
├─────────┼───────────────────┤
│2, 3, 4  │ multi-user.target │
├─────────┼───────────────────┤
│5        │ graphical.target  │
├─────────┼───────────────────┤
│6        │ reboot.target     │
└─────────┴───────────────────┘

答案2

据我所知,当我们启动 Linux 系统时,运行级别(rcX.d)中提到的服务将会启动。

这已经不再是事实了。

init系统systemd本身并不使用运行级别的概念。相反,它引入了“目标”的概念,该概念通过使用依赖机制来对其他单元进行分组。

原来的“默认运行级别”变成了default.target当被激活(启动)时可以通过需求依赖关系“拉入”(激活)其他单元的单元。

systemd 为运行级别概念提供一些兼容层,形式是给予一些目标别名,名称类似runlevelX.target,然后由 等工具使用telinit,但仅此而已。在 systemd 中,服务或任何其他单元不需要属于任何这些伪运行级别。)

启用一项服务(通常)就是在两个单元之间创建人为的依赖关系。

因此,当您启用服务(或任何单元)时,systemd 会查看该单元的[Install]部分并执行其中指定的操作。例如,让我们看看sshd.service我的机器:

# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH Daemon
Wants=sshdgenkeys.service
After=sshdgenkeys.service
After=network.target

[Service]
ExecStart=/usr/bin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always

[Install]
WantedBy=multi-user.target

# This service file runs an SSH daemon that forks for each incoming connection.
# If you prefer to spawn on-demand daemons, use sshd.socket and [email protected].

当您写入时systemctl enable sshd.service,systemd 会查看此单元并根据指令添加Wants=multi-user.target到的依赖项。sshd.serviceWantedBy=multi-user.target

(此依赖关系在物理上存储为从/etc/systemd/system/multi-user.target.wants到 的符号链接/usr/lib/systemd/system/sshd.service。)

因此,当您启动时...

启动时,default.target它会与通过依赖项引入的其他内容一起被激活。这称为“初始事务”,就是这样。

您的可能是(which )default.target的别名,或直接是 。无论哪种方式,都会通过上述依赖项激活并引入。graphical.targetWants=multi-user.targetmulti-user.targetmulti-user.targetsshd.service

相关内容