systemd 为何是革命性的
一个"让开机更快"的项目,为什么值得被称为 Linux 系统管理史上最深的一次范式转移。
引子:一个被低估的问题
2010 年,Lennart Poettering 发表了一篇长文《Rethinking PID 1》。标题很朴素——"重新思考 1 号进程"。但它提出的问题,触及了 Unix 世界一个被忽视三十年的死角:
为什么"启动一台机器"这件事,至今还靠手写 Shell 脚本、靠文件名里的两位数字排序、靠管理员脑中的依赖图?
在此之前,Linux 的启动方式几乎没变过。SysVinit 从 1980 年代沿用至今,核心思路是"按编号顺序跑脚本"。Upstart 试图改进,用"事件驱动"替代串行,但没解决根本问题。
systemd 的答案,是把"启动"从命令式的步骤描述,变成声明式的状态推导。这一转变,就是它革命性的全部来源。
但说它"革命性",需要论证。下面从五个层次展开:抽象层、进程模型、并行范式、统一野心、以及它揭示的时代转向。
第一层革命:从"怎么做"到"是什么"
这是最根本的一层。
SysVinit 是命令式的。 一个服务脚本里写着 start() { ... }、stop() { ... },具体怎么做,全在里面。你要启动 nginx,脚本里就是 nginx -c /etc/nginx/nginx.conf;你要等网络,脚本里就是 sleep 5。
问题是:这套脚本描述的是"动作",不是"目标"。 系统不知道"网络就绪"是什么状态,只知道"我执行了一个 sleep"。如果网络比 5 秒慢,服务就失败;如果网络 1 秒就好了,就白等 4 秒。
systemd 是声明式的。 你只描述"这个服务叫什么、依赖谁、在哪个 target 下启动、崩溃了怎么办":
[Unit]
Description=OpenSSH Daemon
After=network.target
[Service]
ExecStart=/usr/bin/sshd -D
Restart=on-failure
没有 sleep,没有"等网络"的显式动作。 systemd 会自己算:After=network.target 意味着"网络就绪后才启动",而"网络就绪"是一个由 systemd 追踪的状态,不是一段猜出来的等待时间。
这个转变的深刻之处在于:它把"顺序"从人工约定变成了系统推导。
在 SysVinit 里,两个服务的依赖顺序,是靠"我知道 A 的编号是 20、B 是 21"这种隐性知识维持的。换个管理员、加个新服务,这套隐式约定就可能被打破。
在 systemd 里,依赖是显式声明 + 系统校验的:它构建一张有向图,做一致性检查,发现循环依赖就报错,绝不会出现"启动到一半卡死"的半吊子状态。
这是从"约定"到"契约"的升级。
第二层革命:用 cgroup 重新定义"什么是服务"
这一层比第一层更技术,但影响更深远。
传统 init 对"服务"的定义是模糊的。 它启动一个进程,然后……就"忘了"。这个进程后来 fork 出多少子进程、哪些还活着、哪些变成了僵尸——init 一概不知。
后果是什么?
- 你
stop一个服务,可能只杀了主进程,留下一堆孤儿 - 你想知道"这个服务占了多少 CPU",得自己去
ps里翻 - 服务崩溃后,无法干净地重启(因为不知道要清理什么)
systemd 的解法:用 Linux 的 cgroup(控制组)来定义"服务"。
服务启动后,它和所有子孙进程被关进同一个 cgroup。systemd 通过这个控制组:
- 精确知道哪些进程属于哪个服务(不靠猜 PID、不靠父进程链)
- 停止时"连锅端"——对整个 cgroup 下手,绝无残留
- 按服务做资源限制(CPU、内存、IO)——因为 cgroup 本来就是干这个的
- 按服务做会计——知道每个服务消耗了多少资源
这个设计的意义,远超"进程管理"。
它让"服务"从一个模糊的概念("那个我启动的进程"),变成了一个内核级的一等公民("那个 cgroup")。从此,服务可以被精确地追踪、限制、隔离、审计。
这为后来的一切铺了路:容器(nspawn)、沙箱(sandboxing)、资源隔离、审计——全都建立在"服务 = cgroup"这个定义之上。
没有这层,systemd 就只是个"更快的 init"。有了这层,它才成了"系统运行时底座"。
第三层革命:socket 激活与"零依赖"并行
这一层是 systemd 最"反直觉"的创新。
传统启动的痛点:服务之间有依赖,所以必须串行。A 要先于 B,B 要先于 C,于是启动时间 = A + B + C。
systemd 的解法:让依赖消失。
怎么做?靠 socket 激活:
启动时 → systemd 替服务创建好监听套接字(服务还没起)
↓
客户端连接 → 数据进内核缓冲队列
↓
systemd 按需拉起服务 → 把已就绪的套接字"递"给它
关键洞察:如果套接字已经存在,那么"服务是否已启动"就不重要了——客户端连上去,连接会被内核接受,数据排队等着。服务什么时候起来,客户端不感知。
于是:
- 服务之间不需要显式配置依赖(插座早就插好了)
- 所有服务可以并行启动(谁先谁后无所谓)
- 按需唤醒(不常用的服务一直不启动,连上了才醒)
这是"消除依赖"而不是"管理依赖"——比单纯优化启动顺序高一个维度。
Poettering 自己承认,这个想法来自 macOS 的 launchd。 但 systemd 把它推向了极致:不只是"少数服务用 socket 激活",而是把它作为默认的启动范式。
这也解释了为什么 systemd 的启动能那么快——不是因为它优化了串行,而是因为它把"串行"这件事从根上取消了。
第四层革命:统一 Linux 的"操作系统层"
前三层是技术革命。第四层是治理革命。
在 systemd 之前,Linux 的各发行版在"系统管理"这件事上,各搞一套:
- 服务管理:Red Hat 用 SysVinit,Debian 用 SysVinit(但脚本风格不同),Ubuntu 用 Upstart
- 日志:各用各的 syslog 配置
- 网络:各用各的配置方式
- 定时任务:cron,但配置分散
结果是:同一个软件,在不同发行版上的部署方式完全不同。运维人员要学 N 套。
systemd 想做的,是用一套统一的语义收拾这种混沌:
- 一套 unit 语义(所有发行版的服务描述格式相同)
- 一套日志(journald,结构化、可查询)
- 一套网络配置(networkd)
- 一套定时任务(timer,取代 cron 的一部分职能)
Poettering 自己说:Linux 不是 Unix。Unix 是"内核和用户态在一个统一仓库里",而 Linux 是"一切都是分开的、归属权分散的(aka:混沌)"。systemd 让 Linux "仍然是一团乱,只是稍微少乱了一点"。
这层革命的争议最大——因为它不是"技术选择",而是"生态治理"。
支持者说:统一是进步,混沌是负担。
反对者说:你凭什么替我决定?这是"单一文化"(monoculture),是 Red Hat 一家说了算。
这场争论,本质上是 Unix 世界"多样性 vs 统一性"的古老张力,在 systemd 上的一次总爆发。
第五层革命:它揭示的时代转向
前面四层,讲的都是 systemd"做了什么"。第五层,讲的是它"意味着什么"。
systemd 的崛起,恰好和 Linux 的"角色转变"同步。
2009 年 systemd 诞生时,Linux 正在经历一场身份变化:
- 从"服务器/桌面"到"云 + 容器 + 嵌入式"
- 从"手工运维"到"自动化编排"
- 从"单机"到"大规模分布式"
在这个转变中,"启动管理"的含义变了:
- 它不再只是"开机跑几个服务"
- 而是"让系统达到并维持一个声明的状态"
systemd 的声明式哲学、cgroup 追踪、socket 激活——恰好都是"状态编排"所需的能力。
所以 systemd 后来的演进方向(安全、不可变、镜像化、容器、Varlink)不是"越界",而是"沿着同一条逻辑继续走":
- 声明式 → 声明"系统完整性"(dm-verity、TPM)
- cgroup 追踪 → 容器与沙箱
- socket 激活 → 按需与解耦
- 统一语义 → 统一的系统镜像格式(UKI、sysext)
换句话说:systemd 不是一个"更好的 init",它是"Linux 系统层的现代化"。
结语:革命性的本质
回到最初的问题:systemd 为何是革命性的?
不是因为"它让开机更快"——那只是表象。
它革命性的本质,是把"操作系统管理"这件事,从一门手艺,变成了一门工程。
- 手艺:靠经验、靠约定、靠"我知道这个脚本的顺序"
- 工程:靠声明、靠推导、靠"系统自己算该怎么做"
这个转变,在软件史上发生过很多次:
- Make → CMake(从写步骤到声明依赖)
- Shell 部署 → Ansible(从命令到状态)
- 手工运维 → Kubernetes(从操作到期望状态)
systemd 是"系统启动与运行管理"这个领域里的同一次转变。
它当然不完美——它胖、它管得宽、它只爱 Linux、它让红帽权重上升。但它解决的那些问题(并行、追踪、统一、可靠、安全),在此前的 Linux 里真的没人解决得好。
这才是它革命性的全部来源:它承认了"纯粹、极简、各管各的"在复杂系统面前会失灵,转而选择"统一、声明式、内置安全"的实用主义答案。
而历史站在了它这边——今天,几乎每一台 Linux 机器,开机第一件事,都是启动 systemd。
(本文基于 systemd 官方文档、Poettering 的《Rethinking PID 1》与 FOSDEM 2025 演讲、Debian 技术委员会决议等公开资料整理。)