Systemd 真正做了什么?一探启动管理的现代机制
引言
Systemd 已成为 Linux 系统管理的基石,但其功能远不止启动服务。本文将解析其核心组件与设计理念。
1. Systemd 的核心组件
1.1 单元文件(Unit Files)
- 服务单元(.service) :定义服务启动参数(如
nginx.service
)。 - 目标单元(.target) :表示系统状态(如
multi-user.target
)。 - 挂载点(.mount) :管理文件系统挂载。
1.2 服务依赖关系
通过 Requires
、Wants
、After
等字段定义依赖关系,实现并行启动:
[Unit]
Description=My Service
After=network.target
[Service]
ExecStart=/usr/bin/myapp
2. 启动流程解析
2.1 初始化阶段
- initrd :加载内核模块,挂载根文件系统。
- systemd 启动 :解析
/etc/systemd/system/default.target
,并行启动依赖服务。
2.2 服务生命周期
- 启动(Start) :执行
ExecStart
。 - 重启(Restart) :根据
Restart=
策略自动重启。 - 停止(Stop) :执行
ExecStop
。
3. 进程管理与 cgroups
3.1 cgroups 集成
Systemd 利用 cgroups 管理进程资源:
# 查看进程资源限制
systemctl status myservice.service
3.2 日志与状态查询
- 日志集成 :通过
journalctl
统一日志管理。 - 状态查询 :
systemctl list-units --type=service
4. 与传统 init 的对比
特性 | Systemd | SysVinit |
---|---|---|
并行启动 | 支持 | 串行 |
服务依赖 | 图形化依赖管理 | 脚本顺序依赖 |
进程管理 | 集成 cgroups | 仅基础 PID 管理 |
总结
Systemd 通过单元文件、cgroups 和并行启动,重新定义了 Linux 的系统管理。其设计哲学强调模块化、资源控制和高效性,是现代 Linux 系统的核心。