好的,这是一个非常核心的 systemd
概念。简单来说,.target 定义 “状态”或“阶段”,而 .service 定义 “要执行的具体任务”。
它们的关系可以类比为:
- .target(目标):像一个项目的 里程碑 或 阶段目标(例如:“设计完成”、“代码编写完成”、“测试通过”)。
- .service(服务):像为了达到某个里程碑所需要完成的 具体任务(例如:“设计师绘制UI”、“程序员编写功能模块”、“测试员执行测试用例”)。
详细解释
1. .service (服务单元)
- 是什么:这是
systemd
中最常见的单元类型,它用于管理和控制一个后台守护进程(daemon)或一个只执行一次的命令。 - 做什么:它定义了 如何启动、停止、重载一个具体的软件服务。
- 示例:
nginx.service
: 控制 Nginx Web 服务器。ssh.service
: 控制 OpenSSH 远程登录服务。docker.service
: 控制 Docker 引擎。
2. .target (目标单元)
- 是什么:这是一个 逻辑分组单位,它本身不执行任何操作。它的作用是将多个其他单元(主要是
.service
,也可以是其他.target
)组合在一起,形成一个有意义的启动状态或阶段。 - 做什么:它定义了系统应该达到的某种 状态。当启动一个
.target
时,systemd
会确保所有属于这个组的单元都被启动,从而让系统进入该状态。 - 示例:
multi-user.target
: 代表多用户命令行状态(没有图形界面)。graphical.target
: 代表图形界面状态(它通常依赖并包含multi-user.target
)。network-online.target
: 代表网络已就绪并可用的状态。reboot.target
: 代表重启系统的状态。
核心关系:依赖与组合
.target
和 .service
的关系主要通过依赖关系来建立。
a) .target
要求/包含 .service
这是最主要的关系。一个 .target
文件通过 Wants
, Requires
, After
等指令来指定它需要哪些服务。
例如,查看 graphical.target
:
systemctl cat graphical.target
你可能会看到它包含了:
Wants=display-manager.service
After=multi-user.target display-manager.service
...
这表示:“为了达到 graphical.target
这个图形状态,我‘想要’(Wants
) display-manager.service
(显示管理器,如 GDM, SDDM)这个服务运行起来,并且我必须在其之后(After
)完成。”
b) .service
想要进入 .target
反过来,一个 .service
文件会通过 WantedBy
, RequiredBy
等指令声明自己属于哪个目标。
例如,查看一个普通的服务(如 nginx.service
):
systemctl cat nginx.service
你通常会看到:
[Install]
WantedBy=multi-user.target
这表示:“当系统通过 systemctl enable nginx.service
启用我时,请为我创建一个符号链接,让我成为 multi-user.target.wants/
目录的一部分。这样,每当 multi-user.target
被启动时,我就会自动被启动。”
🌟 “启动级别”的现代化替代
在旧的 SysVinit 系统中,有“运行级别”(runlevel)的概念(如级别3是多用户文本模式,级别5是图形模式)。.target
就是运行级别的现代化替代:
SysVinit Runlevel | systemd Target | Description |
---|---|---|
0 |
poweroff.target |
关机 |
1 , s , single |
rescue.target |
单用户救援模式 |
2 , 4 |
(无直接等价, custom) | 多用户(未标准化) |
- | - | - |
- | - | - |
- | - | - |
你可以使用以下命令在两者之间切换视图:
# 查看当前目标
systemctl get-default
# 设置默认进入的目标
sudo systemctl set-default multi-user.target
#切换到图形界面目标(无需重启)
sudo systemctl isolate graphical.target
📊总结表格
特性 | .service (服务单元) | .target (目标单元) |
---|---|---|
本质 | 一个具体的进程或任务 | 一个逻辑上的组或系统状态 |
作用 | 控制如何启动/停止一个程序 | 将多个单元组合成一个一致的状态 |
类比 | 员工的具体工作任务 | 项目的里程碑或阶段目标 |
依赖关系方向 | 被 target 包含【主要】 | 包含 service和其他target【主要】 |
“想要被”某个 target启动【安装时】 | “要求”某个 service运行【运行时】 |
理解这种关系是掌握 systemd
和服务管理的关键。.target
提供了结构和组织,而.service
则提供了实际要执行的内容。
内容由零声教学AI助手提供,问题来源于学员提问