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/systemd
systemd
。 - 如果
/sbin/init
是/etc/init.d
目录中的二进制文件,说明使用SysVinit
。
方法 2: 检查进程
ps -p 1
- 如果输出:
说明 使用PID TTY STAT TIME COMMAND1 ? Ss 0:00 /lib/systemd/systemd
systemd
。 - 如果输出:
说明 使用PID TTY STAT TIME COMMAND1 ? Ss 0:00 /sbin/init
SysVinit
。
方法 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
。 🚀