systemd
“从设计哲学到内核协同”的 systemd 核心概念 / 基础理论总览,定位是 RHEL / AlmaLinux / Rocky / Debian / Ubuntu 通用,不是命令手册,看完就知道 systemd 在“控制什么、怎么控制、为什么这样设计”。
systemd 不是“启动脚本工具”,而是:Linux 的用户态系统管理框架。
它负责的不是“开机跑几个服务”,而是:
系统状态管理 + 服务生命周期 + 资源控制 + 依赖调度
| 维度 | 作用 |
|---|---|
| 进程管理 | 替代传统 init |
| 服务编排 | 依赖、顺序、并行 |
| 资源管理 | 对接 cgroups |
| 状态管理 | 系统运行状态 |
| 日志 | journald |
| 设备 | udev |
| 网络 | networkd(可选) |
| 会话 | logind |
📌 systemd = 用户态“操作系统控制平面”
systemd 不直接“管理进程”,而是管理 Unit 对象。
进程 ← Service Unit
设备 ← Device Unit
挂载点 ← Mount Unit
目标状态 ← Target Unit
传统 init
start A
sleep 5
start B
systemd
[Unit]
After=A.service
Requires=A.service
📌 你描述“关系”,systemd 负责“执行”
- 不再串行
- 有条件才启动
- 依赖满足立即运行
每个 unit 都有明确状态:
inactive -> activating -> active -> deactivating -> failed
| Unit 类型 | 作用 |
|---|---|
| service | 服务进程 |
| socket | 套接字激活 |
| target | 运行目标 |
| mount | 挂载点 |
| automount | 自动挂载 |
| device | 设备 |
| path | 路径触发 |
| timer | 定时器 |
| slice | 资源分组 |
| scope | 外部进程 |
systemd 不是“启动程序”,而是“托管进程生命周期”。
| Type | 含义 |
|---|---|
| simple | 默认,前台进程 |
| exec | 类似 simple |
| forking | 传统 daemon |
| oneshot | 一次性任务 |
| notify | systemd-ready |
| dbus | D-Bus 激活 |
📌 Type 决定 systemd 如何判断“服务已启动”
ExecStart=/usr/bin/nginx
systemd 实际做了什么:
fork -> execve
设置 namespace
加入 cgroup
设置 rlimit
设置环境变量
监听退出状态
- 自动重启(Restart=)
- 失败回滚
- 启动超时
- 进程僵尸回收
target = 状态集合,不是顺序脚本
| target | 传统 runlevel |
|---|---|
| multi-user.target | 3 |
| graphical.target | 5 |
| rescue.target | 单用户 |
| emergency.target | 最小系统 |
systemctl set-default multi-user.target
📌 target 是“系统状态快照”
| 指令 | 含义 |
|---|---|
| Requires | 没它就失败 |
| Wants | 有最好 |
| After | 启动顺序 |
| Before | 相反顺序 |
📌 After ≠ Requires
Requires=network-online.target
After=network-online.target
表示:
- 必须有网络
- 并且等网络 ready
systemd 是 cgroups v2 的主要控制器
/
└─ user.slice
└─ system.slice
└─ sshd.service
CPUQuota=50%
MemoryMax=2G
IOReadBandwidthMax=/dev/sda 10M
📌 systemd 是 容器 / Kubernetes 的祖师爷
- 有连接才启动服务
- 支持平滑升级
- 文件变化触发服务
- 替代 cron
- 精准、可靠、可监控
日志 = 结构化事件流
特点
- 二进制
- 支持索引
- 与 unit 绑定
journalctl -u sshd
管理:
- SSH
- TTY
- 用户 session
- 电源事件
📌 pam_nologin、登录限制都在这层
| 维度 | SysV | systemd |
|---|---|---|
| 启动 | 串行 | 并行 |
| 管理 | 脚本 | 状态机 |
| 资源 | 无 | cgroups |
| 日志 | 文件 | journal |
| 依赖 | 手写 | 自动 |
内核
└─ systemd (PID 1)
├─ udevd
├─ journald
├─ logind
├─ networkd
└─ services...
📌 PID 1 的责任是:系统永远不能“死”
✅ 实际更快,只是日志可见
✅ 它把“复杂度从脚本搬进系统”
✅ 目前 Linux 最稳定的 init 实现
systemd 是 Linux 的“状态驱动系统管理内核”,通过 Unit 抽象系统对象,用依赖关系和 cgroups 控制系统生命周期。