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
。 🚀