systemd 是 Linux 启动后 PID 1 的核心进程,基于声明式配置实现并行启动、D-Bus 通信、cgroup 资源隔离与 socket 激活;Unit 文件分Unit[Install]三段,需明确定义依赖、运行行为与启用目标。

systemd 是 Linux 系统启动后运行的第一个进程(PID 1),它不只是传统意义上的 init 程序,更是整套服务生命周期、资源控制与状态管理的中枢。理解它的架构和 Unit 文件编写逻辑,是可靠部署自定义服务、排查启动异常、优化系统行为的基础。
systemd 的核心架构特点
它不靠逐行执行脚本,而是基于声明式配置驱动整个系统:
-
并行激活机制:无依赖关系的 Unit 可同时启动,大幅缩短系统初始化时间;依赖关系由
After、Requires等字段明确定义,systemd 自动构建启动顺序图 -
D-Bus 统一通信总线:所有管理操作(如
systemctl start)本质是向 systemd 进程发送 D-Bus 消息,CLI 工具只是客户端,便于集成与自动化 - 内核级进程追踪与资源隔离:通过 cgroup v2 和内核的 fork/exec 事件监听,精准识别主进程、子进程归属,避免“进程丢失”或资源失控
- 按需激活(Socket Activation):.socket 单元监听端口,首次连接时才拉起对应 .service,节省资源且提升响应弹性(如 sshd.socket → sshd.service)
Unit 类型与常见用途
每个 Unit 对应一类系统资源,由后缀名区分,配置文件存放在不同优先级目录:
-
.service:最常用,封装守护进程或一次性任务(如
nginx.service) -
.socket:配合 .service 实现延迟启动,支持 TCP/UDP/Unix 域套接字(如
docker.socket) -
.target:逻辑分组单元,替代传统 runlevel(如
multi-user.target表示非图形多用户状态) -
.timer:替代 cron 的高精度定时器,支持日历语法与随机延迟(如
logrotate.timer) -
.slice:纯资源容器,不运行程序,仅用于 cgroup 分组配额(如
user-1000.slice限制某用户全部进程资源)
配置文件搜索优先级:/etc/systemd/system/ > /run/systemd/system/ > /usr/lib/systemd/system/。同名文件以高优先级路径为准。
Service 单元文件三段式结构详解
一个合法的 .service 文件必须包含 [Unit]、[Service]、[Install] 三个节,缺一不可:
-
[Unit]:描述性与依赖性配置
Description=必填,用于日志、状态显示和调试After=和Before=控制启动顺序(不隐含依赖)Requires=表示强依赖——被依赖 Unit 启动失败,本服务也失败Wants=表示弱依赖——被依赖 Unit 启动失败不影响本服务Conflicts=明确互斥关系(如Conflicts=apache2.service) -
[Service]:运行时行为定义
Type=决定 systemd 如何判断服务是否就绪:
•simple(默认):ExecStart 启动的进程即主进程,退出即服务终止
•forking:进程 fork 后父进程退出,子进程继续运行(需配合PIDFile=)
•oneshot:执行完命令即退出,常配合RemainAfterExit=yes表示“已生效但无常驻进程”ExecStart=必填,指定启动命令(绝对路径)Restart=和RestartSec=控制异常退出后的恢复策略(如on-failure)User=和Group=指定运行身份,避免 root 权限滥用 -
[Install]:启用/禁用绑定逻辑
WantedBy=必填,定义该服务被哪个 target “需要”(如multi-user.target)
启用后会在对应 target 的.wants/目录下创建软链接,使systemctl enable生效
编写与部署一个最小可用 service 示例
以记录启动时间的简单服务为例:
步骤如下:- 创建文件:
sudo nano /etc/systemd/system/boot-log.service - 写入内容:
[Unit] Description=Log boot timestamp After=local-fs.target [Service] Type=oneshot ExecStart=/bin/sh -c 'echo "Boot at $(date)" >> /var/log/boot-time.log' RemainAfterExit=yes [Install] WantedBy=multi-user.target
- 重载配置:
sudo systemctl daemon-reload - 启用并启动:
sudo systemctl enable --now boot-log.service - 验证:
sudo systemctl status boot-log.service或查看日志sudo journalctl -u boot-log.service


















