据我所知,当我们启动 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.service
WantedBy=multi-user.target
(此依赖关系在物理上存储为从/etc/systemd/system/multi-user.target.wants
到 的符号链接/usr/lib/systemd/system/sshd.service
。)
因此,当您启动时...
启动时,default.target
它会与通过依赖项引入的其他内容一起被激活。这称为“初始事务”,就是这样。
您的可能是(which )default.target
的别名,或直接是 。无论哪种方式,都会通过上述依赖项激活并引入。graphical.target
Wants=multi-user.target
multi-user.target
multi-user.target
sshd.service