在我的计算机/lib/systemd/system
目录中,我看到一个文件multiuser.target
- 该文件包含:
[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
该行:Requires: basic.target
我认为这意味着“运行”basic.target
文件。
但是在同一个 /lib/systemd/system
目录中还有一个multi-user.target.wants/
子目录。它包含更多的单元文件:
/lib/systemd/system $tree multi-user.target.wants/
multi-user.target.wants/
├── dbus.service -> ../dbus.service
├── getty.target -> ../getty.target
├── systemd-ask-password-wall.path -> ../systemd-ask-password-wall.path
├── systemd-logind.service -> ../systemd-logind.service
├── systemd-update-utmp-runlevel.service -> ../systemd-update-utmp-runlevel.service
└── systemd-user-sessions.service -> ../systemd-user-sessions.service
这些单元中的哪一个,即文件:basic.target
或子目录中的所有单元在默认引导目标multi-user.wants.target
时运行?multi-user.target
以上是全部吗?如果是这样,顺序是什么?
Before
/After
和Wants
/Requires
/之间有区别Requisite
:第一组表示单元启动的时间,后一组表示依赖关系。通常,两者之间几乎没有区别,但有时它很重要。阅读文档有助于了解更多详细信息,因为我省略了您不经常看到的内容。例如,假设您有一些具有依赖关系的服务:
a.服务
b.服务
c.服务
d.服务
根据您开始的内容,加载的内容(以及顺序)会发生巨大变化:
a
:a
b
:b
c
(或a
+c
):a
同时c
(c
即使a
失败也保持运行)d
(或a
+d
):a
->c
(如果a
成功启动)a
+b
:a
->b
(不管是否a
启动)为什么这么复杂?这是为了加快单元加载。如果服务之间没有
Before
或After
相互引用,那么它们可以同时启动(假设没有其他单元需要它们!).target
文件从哪里来?他们将单元放入功能组中,以便在系统启动(或停止等)时,可以一起启动该阶段所需的单元,并且单元可以指示它们要等待另一个阶段启动. 例如,一个单元可以包含After=network.target
以确保网络在启动之前有机会进行初始化,即使它是作为multi-user.target
.如果您想查看单元相互依赖的顺序,您可以运行
systemctl list-dependencies
(但它不会告诉您它们加载的顺序,因为这在Before
/After
设置之外有点随机。)