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 command
1 ? ss 0:00 /lib/systemd/systemd
说明 使用 systemd。
如果输出:
pid tty stat time command
1 ? 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。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论