@@ -124,7 +124,65 @@ Systemd 中的 unit 有很多状态,大致可以归为以下几类:
124124: 指定启动顺序,即相关的 unit 需要在前者启动完成,进入 active 状态后才会尝试启动。这两个字段在 ` [Unit] ` section 中指定。
125125 与 Wants/Requires 不同,Before/After 只是指定启动顺序,不影响依赖关系。
126126
127- 需要注意的是,依赖关系和启动顺序是互相独立的。如果只写 ` Requires= ` 或 ` Wants= ` ,没有写 ` Before= ` 或 ` After= ` ,那么 systemd 会启动依赖与被依赖的单元,但是不保证它们的启动顺序。
127+ 需要注意的是,依赖关系和启动顺序是互相独立的。如果只写 ` Requires= ` 或 ` Wants= ` ,没有写 ` Before= ` 或 ` After= ` ,那么 systemd 会启动依赖与被依赖的单元,但是不保证它们的启动顺序;反过来,如果只写 ` Before= ` 或 ` After= ` ,那么 systemd 不保证这些服务会被启动。
128+
129+ !!! tip "获取某个 unit 的顺序与依赖关系"
130+
131+ 使用 `systemctl show [unit]` 可以查看某个 unit 的所有属性,包括上面提到的依赖关系和启动顺序。例如:
132+
133+ ```console
134+ $ systemctl show gdm.service
135+ Id=gdm.service
136+ Names=gdm.service display-manager.service
137+ Requires=system.slice sysinit.target dbus.socket
138+ WantedBy=graphical.target
139+ [email protected] shutdown.target plymouth-quit.service 140+ Before=graphical.target shutdown.target
141+ After=fwupd.service rc-local.service systemd-journald.socket sysinit.target basic.target system.slice plymouth-quit.service systemd-user-sessions.service plymouth-start.service dbus.socket [email protected] 142+ (以下省略)
143+ ```
144+
145+ 此外使用 `systemctl list-dependencies [unit]` 可以以树状结构显示某个 unit 的依赖关系:
146+
147+ ```console
148+ $ systemctl list-dependencies gdm.service
149+ gdm.service
150+ ● ├─dbus.socket
151+ ● ├─system.slice
152+ ● └─sysinit.target
153+ ● ├─dev-hugepages.mount
154+ ● ├─dev-mqueue.mount
155+ ● ├─kmod-static-nodes.service
156+ ● ├─ldconfig.service
157+ ● ├─proc-sys-fs-binfmt_misc.automount
158+ ● ├─sys-fs-fuse-connections.mount
159+ ● ├─sys-kernel-config.mount
160+ ● ├─sys-kernel-debug.mount
161+ ● ├─sys-kernel-tracing.mount
162+ ● ├─systemd-ask-password-console.path
163+ ● ├─systemd-binfmt.service
164+ (以下省略)
165+ ```
166+
167+ !!! tip "分析系统启动时间"
168+
169+ 相比传统的 init,systemd 的一大卖点就是通过分析顺序与依赖,并行启动服务,从而缩短系统启动时间。可以使用 `systemd-analyze` 来绘制启动时间线:
170+
171+ ```console
172+ systemd-analyze plot > boot.svg
173+ ```
174+
175+ 每个服务的启动时间可以使用 `blame` 子命令查看:
176+
177+ ```console
178+ systemd-analyze blame
179+ ```
180+
181+ 不过,`systemd-analyze blame` 显示的最耗时的服务可能并不会实际影响启动。如果需要快速查看对启动时间影响最大的服务,可以查看关键路径:
182+
183+ ```console
184+ systemd-analyze critical-chain
185+ ```
128186
129187#### 模板 {#unit-template}
130188
0 commit comments