Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

systemd

“从设计哲学到内核协同”的 systemd 核心概念 / 基础理论总览,定位是 RHEL / AlmaLinux / Rocky / Debian / Ubuntu 通用,不是命令手册,看完就知道 systemd 在“控制什么、怎么控制、为什么这样设计”。

一、systemd 是什么(先纠正认知)

systemd 不是“启动脚本工具”,而是:Linux 的用户态系统管理框架。

它负责的不是“开机跑几个服务”,而是:

系统状态管理 + 服务生命周期 + 资源控制 + 依赖调度

systemd 的角色

维度 作用
进程管理 替代传统 init
服务编排 依赖、顺序、并行
资源管理 对接 cgroups
状态管理 系统运行状态
日志 journald
设备 udev
网络 networkd(可选)
会话 logind

📌 systemd = 用户态“操作系统控制平面”

二、systemd 的核心设计思想

1️⃣ Everything is a Unit(一切皆 Unit)

systemd 不直接“管理进程”,而是管理 Unit 对象

进程 ← Service Unit
设备 ← Device Unit
挂载点 ← Mount Unit
目标状态 ← Target Unit

2️⃣ 声明式,而不是命令式

传统 init

start A
sleep 5
start B

systemd

[Unit]
After=A.service
Requires=A.service

📌 你描述“关系”,systemd 负责“执行”

3️⃣ 并行启动 + 事件驱动

  • 不再串行
  • 有条件才启动
  • 依赖满足立即运行

4️⃣ 状态机驱动(不是脚本)

每个 unit 都有明确状态:

inactive -> activating -> active -> deactivating -> failed

三、Unit 类型全览(核心)

Unit 类型 作用
service 服务进程
socket 套接字激活
target 运行目标
mount 挂载点
automount 自动挂载
device 设备
path 路径触发
timer 定时器
slice 资源分组
scope 外部进程

四、Service Unit 深度原理(最重要)

1️⃣ service 的本质

systemd 不是“启动程序”,而是“托管进程生命周期”。

2️⃣ 常见 Service 类型

Type 含义
simple 默认,前台进程
exec 类似 simple
forking 传统 daemon
oneshot 一次性任务
notify systemd-ready
dbus D-Bus 激活

📌 Type 决定 systemd 如何判断“服务已启动”

3️⃣ ExecStart 的真实行为

ExecStart=/usr/bin/nginx

systemd 实际做了什么:

fork -> execve
设置 namespace
加入 cgroup
设置 rlimit
设置环境变量
监听退出状态

4️⃣ systemd 托管能力(传统脚本没有)

  • 自动重启(Restart=)
  • 失败回滚
  • 启动超时
  • 进程僵尸回收

五、Target:systemd 的“运行级别”

target = 状态集合,不是顺序脚本

target 传统 runlevel
multi-user.target 3
graphical.target 5
rescue.target 单用户
emergency.target 最小系统
systemctl set-default multi-user.target

📌 target 是“系统状态快照”

六、依赖关系模型(精髓)

1️⃣ 强依赖 vs 弱依赖

指令 含义
Requires 没它就失败
Wants 有最好
After 启动顺序
Before 相反顺序

📌 After ≠ Requires

2️⃣ 启动逻辑示例

Requires=network-online.target
After=network-online.target

表示:

  • 必须有网络
  • 并且等网络 ready

七、cgroups:systemd 的隐藏核心

systemd 是 cgroups v2 的主要控制器

1️⃣ cgroup 层级

/
└─ user.slice
└─ system.slice
   └─ sshd.service

2️⃣ 资源控制能力

CPUQuota=50%
MemoryMax=2G
IOReadBandwidthMax=/dev/sda 10M

📌 systemd 是 容器 / Kubernetes 的祖师爷

八、Socket / Path / Timer 激活(现代能力)

Socket 激活

  • 有连接才启动服务
  • 支持平滑升级

Path 激活

  • 文件变化触发服务

Timer

  • 替代 cron
  • 精准、可靠、可监控

九、journald:日志不是文件

日志 = 结构化事件流

特点

  • 二进制
  • 支持索引
  • 与 unit 绑定
journalctl -u sshd

十、logind:会话与登录控制

管理:

  • SSH
  • TTY
  • 用户 session
  • 电源事件

📌 pam_nologin、登录限制都在这层

十一、systemd vs SysV init(本质区别)

维度 SysV systemd
启动 串行 并行
管理 脚本 状态机
资源 cgroups
日志 文件 journal
依赖 手写 自动

十二、systemd 在系统中的“位置”

内核
 └─ systemd (PID 1)
    ├─ udevd
    ├─ journald
    ├─ logind
    ├─ networkd
    └─ services...

📌 PID 1 的责任是:系统永远不能“死”

十三、常见误区纠正

❌ systemd 启动慢

✅ 实际更快,只是日志可见

❌ systemd 太复杂

✅ 它把“复杂度从脚本搬进系统”

❌ systemd 不稳定

✅ 目前 Linux 最稳定的 init 实现

十四、总结

systemd 是 Linux 的“状态驱动系统管理内核”,通过 Unit 抽象系统对象,用依赖关系和 cgroups 控制系统生命周期。