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
。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论