本文翻译自我的英文博客,最新修订内容可随时参考:关于Systemd
Linux 系统使用 init
管理启动进程的历史已久(例如通过 sudo /etc/init.d/apache2 start
或 service apache2 start
启动服务),但传统 init
采用串行启动方式,效率较低。为解决这一问题,systemd
应运而生(名称中的 d
是 daemon
的缩写,表明其守护进程管理器的定位)。如今,systemd
已取代 initd
,成为主流 Linux 发行版的默认主进程(PID 1)。
一、核心组件与基本命令
1. systemctl
:系统控制核心工具
sudo systemctl reboot # 重启系统
sudo systemctl poweroff # 关机
sudo systemctl suspend # 挂起(睡眠)
2. 系统信息查询
hostnamectl
:查看主机信息(架构、硬件、内核、操作系统等)hostnamectl # 等价于 uname -a
timedatectl
:管理时区设置timedatectl set-timezone Asia/Shanghai # 设置时区为上海
loginctl
:管理用户会话loginctl list-sessions # 列出所有登录会话 loginctl list-users # 列出所有用户
二、Unit(单元):systemd 的管理核心
systemd
通过 Unit 管理系统资源,共有 12 种单元类型,常见类型包括:
- Service Unit:服务单元(如
httpd.service
) - Target Unit:目标单元(用于分组管理,如
multi-user.target
) - Socket Unit:套接字单元(如
ssh.socket
) - Timer Unit:定时器单元(类似 cron 任务)
1. 单元状态管理
systemctl status bluetooth.service # 查看服务状态
systemctl start/stop/restart httpd.service # 启停/重启服务
systemctl enable/disable httpd.service # 设置开机自启/禁用
systemctl reload httpd.service # 重新加载服务配置(不重启进程)
2. 单元配置文件
- 存储路径:
- 系统默认配置:
/usr/lib/systemd/system/
- 用户自定义配置:
/etc/systemd/system/
(优先级高于系统默认)
- 系统默认配置:
- 符号链接机制:
systemctl enable clamd@scan.service # 启用服务时创建符号链接 # 等价于手动创建链接 sudo ln -s '/usr/lib/systemd/system/clamd@scan.service' '/etc/systemd/system/multi-user.target.wants/clamd@scan.service'
- 单元状态:
enabled
:已启用(开机自启)disabled
:已禁用static
:静态单元(仅作为依赖,不能直接启动)masked
:被屏蔽(禁止启动)
3. 自定义单元配置
修改单元文件后需重新加载配置:
systemctl daemon-reload # 重新加载 systemd 配置
systemctl restart httpd.service # 重启服务使配置生效
三、Target(目标):单元分组管理
Target 本质是一组单元的集合,用于实现特定系统状态(如多用户模式、图形界面模式)。常见 Target 包括:
default.target
:默认目标(通常指向graphical.target
或multi-user.target
)multi-user.target
:多用户文本模式(无图形界面)graphical.target
:图形界面模式rescue.target
:救援模式(单用户修复环境)
切换 Target:
sudo systemctl isolate multi-user.target # 切换至多用户模式
sudo systemctl reboot --target=rescue.target # 重启并进入救援模式
四、日志管理:journalctl
systemd
通过 journalctl
统一管理系统日志(包括内核日志和服务日志),日志配置文件为 /etc/systemd/journald.conf
。
常用命令
journalctl -k # 查看内核日志
journalctl --since "2023-10-01" # 查看从指定日期开始的日志
journalctl -f # 实时追踪日志(类似 tail -f)
journalctl _PID=1 # 查看 PID 为 1 的进程(systemd 自身)日志
journalctl -u httpd.service # 查看指定服务的日志
五、systemd 与传统 init 的关键区别
特性 | systemd | 传统 init(如 SysVinit) |
---|---|---|
启动方式 | 并行启动多个服务,提升启动速度 | 串行启动,效率较低 |
进程管理 | 基于 PID 1 统一管理所有进程 | 依赖 init 进程逐个管理 |
单元类型 | 支持服务、套接字、定时器等 12 种单元 | 仅支持服务和运行级别(runlevel) |
日志系统 | 集成 journalctl ,统一日志管理 | 依赖第三方工具(如 syslog ) |
配置文件 | 使用 .service 等标准化文件格式 | 脚本存放在 /etc/init.d/ 目录 |
六、最佳实践建议
-
服务管理最佳实践:
- 优先使用
systemctl enable/disable
管理开机自启,避免手动修改符号链接。 - 自定义服务配置时,将文件放置于
/etc/systemd/system/
目录,避免覆盖系统默认文件。
- 优先使用
-
日志分析技巧:
- 结合
journalctl
和systemctl status
定位服务故障(如systemctl status httpd.service
查看状态,journalctl -u httpd.service
查看详细日志)。 - 使用过滤条件快速定位问题:
journalctl "MESSAGE=error" --since today # 查看今日包含"error"的日志
- 结合
-
性能优化:
- 通过
systemd-analyze
分析启动耗时:systemd-analyze blame # 按耗时排序启动单元 systemd-analyze critical-chain # 查看启动依赖链
- 通过
总结
systemd
通过单元化管理、并行启动和统一日志系统,彻底改变了 Linux 系统的初始化方式。掌握 systemctl
、journalctl
等核心工具及单元配置方法,是高效管理 Linux 系统的关键。如需深入学习 systemd 定时器(Timer Unit)或自定义服务开发,欢迎访问博客获取更多资源:关于Systemd。