我有两个参考资料,看起来都很可信,但它们提供的信息不同。
在第一个引用中,提到default.target
是执行的初始目标之一。然后(假设我们希望系统启动到 CLI 模式)multi-user.target
将执行 ,接着是basic.target
,最后,我们将到达sysinit.target
。
然而,在第二个参考文献中,该过程的描述顺序却相反!它指出sysinit.target
首先执行,然后执行basic.target
,依此类推。
我很困惑。哪个顺序是正确的?哪个目标/sbin/init
从一开始就开始?
您的第一个参考似乎有些混乱,或者也许它正在描述如何
systemd
开始找出各个单元之间的依赖关系树。查看
man 7 bootup
您的系统;它包括基于 的启动过程的 ASCII 艺术图表systemd
。在现代版本的 中
systemd
,default.target
是引导过程总体目标状态的别名,最常见的定义为在启用 GUI 的系统上,或者如果不需要本地 GUI。一旦达到 并且此时正在运行的任何操作都已完成,引导过程将基本完成。graphical.target
multi-user.target
default.target
systemd
实际上,它由
/etc/systemd/system/default.target
一个符号链接来定义,该符号链接指向设置为默认的实际目标,例如systemctl set-default graphical.target
。在我的桌面上:
在服务器系统上:
man 7 bootup
在任何系统上查看使用systemd
ASCII 艺术图表表示的各种目标及其在启动过程中的作用。因此,当
systemd
启动于/sbin/init
并且没有启动选项来告诉它其他情况时,它的“总体任务”是到达default.target
。首先,它看到默认目标是 的别名,例如graphical.target
。的定义
graphical.target
包括以下内容:因此,它必须首先满足
multi-user.target
,而且启动起来也很好display-manager.service
,但是后者并不是绝对必要的(即,如果失败,不值得关闭所有常规服务并进入救援模式)。提到了
rescue.service
和rescue.target
,但是没有任何内容既不需要也没有想要systemd
它们,所以这次它们将被忽略。该
multi-user.target
定义包括以下内容:再次,事实证明
basic.target
必须先出现,并且rescue.service
和rescue.target
仍然不是必需的也不是想要的,因此可以忽略它们。还有许多正常的系统服务
WantedBy=multi-user.target
,但它们都必须等到basic.target
首先满足,因为任何没有的DefaultDependencies=no
服务都会隐式Requires=sysinit.target
地After=sysinit.target basic.target
应用于它们。因此,
systemd
接下来将考虑basic.target
。其定义包括:现在我们来看看
sysinit.target
。它在依赖性分析顺序中排在最后,但事实证明,它需要是迄今为止考虑的目标单元中执行顺序的第一个,因为迄今为止考虑的所有其他单元都已安排After
它。的定义sysinit.target
包括:实际上,这会导致挂载任何本地文件系统并激活交换。还有一个
local-fs-pre.target
可用于启动软件 RAID、磁盘加密、LVM 或多路径等服务,这些可能是挂载的先决条件。此时,
systemd
找到许多服务单元,这些服务单元WantedBy=sysinit.target
有Before=sysinit.target
或根本没有排序要求,因此可以立即并行执行。一旦所有标记的单元Before=sysinit.target
都已启动(或尝试失败),sysinit.target
就可以将其标记为已完成。然后就可以启动标记为
After=sysinit.target
但Before=basic.target
... 的所有单元了,依此类推,直到满足所有要求basic.target
,这样目标就可以标记为“已激活”。这会打开另一组要启动的单元:该组包括大多数“正常”服务,即所有未DefaultDependencies=no
设置且为 的WantedBy=multi-user.target
服务。