1. 什么是 systemd 和 SysVinit?
systemd 和 SysVinit 都是 Linux 的初始化系统(init system),用于管理系统启动、服务、进程和日志。
| 比较项 | SysVinit | systemd |
|---|---|---|
| 启动方式 | 逐步启动(串行) | 并行启动(并行) |
| 服务管理 | 基于 init 脚本 | 基于 unit 文件 |
| 依赖管理 | 依赖手动定义 | 自动处理依赖关系 |
| 启动速度 | 慢 | 快(并行优化) |
| 日志管理 | /var/log/messages | journalctl |
是否支持 cgroups | 否 | 是 |
| 默认用于 | 旧版 Linux(CentOS 6、Ubuntu 14) | 现代 Linux(CentOS 7+、Ubuntu 16+) |
2. SysVinit 详解
SysVinit(System V init)是早期 Unix 系统的 init 进程,负责系统引导和服务管理。
(1) SysVinit 的工作方式
- 读取
/etc/inittab确定 运行级别(Runlevel) - 在
/etc/rc.d/目录下执行 启动脚本 - 按 顺序(串行) 依次启动服务(启动较慢)
(2) SysVinit 运行级别
| 运行级别 | 作用 |
|---|---|
0 | 关机 |
1 | 单用户模式 |
3 | 纯命令行模式 |
5 | 图形界面模式 |
6 | 重新启动 |
(3) SysVinit 启动服务的方式
SysVinit使用/etc/init.d/脚本 作为服务管理方式:
/etc/init.d/nginx start
/etc/init.d/nginx stop
/etc/init.d/nginx restart
- 也可以用
service命令:
service nginx status
service nginx restart
chkconfig用于管理开机自启:
chkconfig nginx on # 开机自启
chkconfig --list nginx # 查看是否开机自启
(4) SysVinit 存在的问题
- 服务启动是串行的,启动速度慢
- 无法追踪进程状态
- 日志管理依赖
/var/log/messages,查询不方便 - 服务依赖关系需要手动处理
3. systemd 详解
systemd 是现代 Linux 的 init 进程,取代 SysVinit,提供更快的启动速度和更强的服务管理能力。
(1) systemd 的特点
✅ 并行(Parallel)启动:多个服务同时启动,加快系统引导速度。
✅ 自动处理依赖关系:无需手动配置 chkconfig。
✅ 使用 unit 文件代替 init 脚本:更结构化、更易维护。
✅ 内置 journalctl 日志管理:更方便查询日志。
✅ 支持 cgroups 进程控制:管理进程生命周期。
(2) systemd 启动服务
systemctl是systemd提供的服务管理工具:
systemctl start nginx # 启动服务
systemctl stop nginx # 停止服务
systemctl restart nginx # 重启服务
systemctl status nginx # 查看服务状态
- 设置开机自启:
systemctl enable nginx # 开机启动
systemctl disable nginx # 取消开机启动
- 列出所有运行的服务
systemctl list-units --type=service
(3) systemd unit 文件
systemd使用/etc/systemd/system/目录下的.service文件管理服务,例如:
[Unit]
Description=NGINX Web Server
After=network.target[Service]
ExecStart=/usr/sbin/nginx -g "daemon off;"
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=process
Restart=always[Install]
WantedBy=multi-user.target
systemd读取unit文件后,可以用systemctl直接管理服务:
systemctl daemon-reload # 重新加载配置
systemctl restart nginx # 重启服务
(4) systemd 日志管理
systemd使用journalctl记录所有系统日志:
journalctl -u nginx # 查看 Nginx 相关日志
journalctl -f # 实时查看日志(类似 `tail -f`)
journalctl --since "1 hour ago" # 查看最近 1 小时的日志
4. systemd 与 SysVinit 的区别
| 功能 | SysVinit | systemd |
|---|---|---|
| 启动方式 | 串行启动 | 并行启动 |
| 管理方式 | init.d 脚本 | systemctl |
| 依赖管理 | 手动配置 | 自动处理 |
| 启动速度 | 慢 | 快 |
| 日志管理 | /var/log/messages | journalctl |
是否支持 cgroups | 否 | 是 |
| 重启单个服务 | service nginx restart | systemctl restart nginx |
| 查看服务状态 | service nginx status | systemctl status nginx |
5. 如何判断系统使用 SysVinit 还是 systemd?
方法 1: 检查 /sbin/init
ls -l /sbin/init
- 如果输出:
说明 使用lrwxrwxrwx 1 root root 22 Mar 12 2025 /sbin/init -> /lib/systemd/systemdsystemd。 - 如果
/sbin/init是/etc/init.d目录中的二进制文件,说明使用SysVinit。
方法 2: 检查进程
ps -p 1
- 如果输出:
说明 使用PID TTY STAT TIME COMMAND1 ? Ss 0:00 /lib/systemd/systemdsystemd。 - 如果输出:
说明 使用PID TTY STAT TIME COMMAND1 ? Ss 0:00 /sbin/initSysVinit。
方法 3: 直接运行 systemctl
systemctl --version
- 如果返回
systemd版本号(如systemd 249),说明 使用systemd。 - 如果
systemctl命令不存在,说明 使用SysVinit。
6. 哪些 Linux 版本使用 systemd?
| 发行版 | 使用的 init 系统 |
|---|---|
| CentOS 6 及更早版本 | SysVinit |
| CentOS 7 及更新版本 | systemd |
| Ubuntu 14.04 及更早版本 | SysVinit |
| Ubuntu 16.04+ | systemd |
| Debian 7 及更早版本 | SysVinit |
| Debian 8+ | systemd |
Last
SysVinit是 传统的 Linux 启动管理系统,使用init.d脚本,启动慢,依赖手动管理。systemd是 现代 Linux 的标准init系统,支持 并行启动、自动管理依赖,大幅提升 启动速度。systemctl取代了service和chkconfig,提供更强的管理能力。journalctl替代了传统/var/log/messages日志管理。
如果你的系统是 CentOS 7+ 或 Ubuntu 16+,你应该使用 systemd 而不是 SysVinit。 🚀