Linux中的systemd與SysVinit使用
1. 什么是 systemd 和 SysVinit?
systemd 和 SysVinit 都是 Linux 的初始化系統(tǒng)(init system),用于管理系統(tǒng)啟動(dòng)、服務(wù)、進(jìn)程和日志。
| 比較項(xiàng) | SysVinit | systemd |
|---|---|---|
| 啟動(dòng)方式 | 逐步啟動(dòng)(串行) | 并行啟動(dòng)(并行) |
| 服務(wù)管理 | 基于 init 腳本 | 基于 unit 文件 |
| 依賴管理 | 依賴手動(dòng)定義 | 自動(dòng)處理依賴關(guān)系 |
| 啟動(dòng)速度 | 慢 | 快(并行優(yōu)化) |
| 日志管理 | /var/log/messages | journalctl |
| 是否支持 cgroups | 否 | 是 |
| 默認(rèn)用于 | 舊版 Linux(CentOS 6、Ubuntu 14) | 現(xiàn)代 Linux(CentOS 7+、Ubuntu 16+) |
2. SysVinit 詳解
SysVinit(System V init)是早期 Unix 系統(tǒng)的 init 進(jìn)程,負(fù)責(zé)系統(tǒng)引導(dǎo)和服務(wù)管理。
(1) SysVinit 的工作方式
- 讀取
/etc/inittab確定 運(yùn)行級(jí)別(Runlevel) - 在
/etc/rc.d/目錄下執(zhí)行 啟動(dòng)腳本 - 按 順序(串行) 依次啟動(dòng)服務(wù)(啟動(dòng)較慢)
(2) SysVinit 運(yùn)行級(jí)別
| 運(yùn)行級(jí)別 | 作用 |
|---|---|
| 0 | 關(guān)機(jī) |
| 1 | 單用戶模式 |
| 3 | 純命令行模式 |
| 5 | 圖形界面模式 |
| 6 | 重新啟動(dòng) |
(3) SysVinit 啟動(dòng)服務(wù)的方式
SysVinit使用/etc/init.d/腳本 作為服務(wù)管理方式:
/etc/init.d/nginx start /etc/init.d/nginx stop /etc/init.d/nginx restart
- 也可以用
service命令:
service nginx status service nginx restart
chkconfig用于管理開機(jī)自啟:
chkconfig nginx on # 開機(jī)自啟 chkconfig --list nginx # 查看是否開機(jī)自啟
(4) SysVinit 存在的問題
- 服務(wù)啟動(dòng)是串行的,啟動(dòng)速度慢
- 無法追蹤進(jìn)程狀態(tài)
- 日志管理依賴
/var/log/messages,查詢不方便 - 服務(wù)依賴關(guān)系需要手動(dòng)處理
3. systemd 詳解
systemd 是現(xiàn)代 Linux 的 init 進(jìn)程,取代 SysVinit,提供更快的啟動(dòng)速度和更強(qiáng)的服務(wù)管理能力。
(1) systemd 的特點(diǎn)
- ? 并行(Parallel)啟動(dòng):多個(gè)服務(wù)同時(shí)啟動(dòng),加快系統(tǒng)引導(dǎo)速度。
- ? 自動(dòng)處理依賴關(guān)系:無需手動(dòng)配置
chkconfig。 - ? 使用
unit文件代替init腳本:更結(jié)構(gòu)化、更易維護(hù)。 - ? 內(nèi)置
journalctl日志管理:更方便查詢?nèi)罩尽?/li> - ? 支持
cgroups進(jìn)程控制:管理進(jìn)程生命周期。
(2) systemd 啟動(dòng)服務(wù)
systemctl是systemd提供的服務(wù)管理工具:
systemctl start nginx # 啟動(dòng)服務(wù) systemctl stop nginx # 停止服務(wù) systemctl restart nginx # 重啟服務(wù) systemctl status nginx # 查看服務(wù)狀態(tài)
- 設(shè)置開機(jī)自啟:
systemctl enable nginx # 開機(jī)啟動(dòng) systemctl disable nginx # 取消開機(jī)啟動(dòng)
- 列出所有運(yùn)行的服務(wù)
systemctl list-units --type=service
(3) systemd unit 文件
systemd使用/etc/systemd/system/目錄下的.service文件管理服務(wù),例如:
[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直接管理服務(wù):
systemctl daemon-reload # 重新加載配置 systemctl restart nginx # 重啟服務(wù)
(4) systemd 日志管理
systemd使用journalctl記錄所有系統(tǒng)日志:
journalctl -u nginx # 查看 Nginx 相關(guān)日志 journalctl -f # 實(shí)時(shí)查看日志(類似 `tail -f`) journalctl --since "1 hour ago" # 查看最近 1 小時(shí)的日志
4. systemd 與 SysVinit 的區(qū)別
| 功能 | SysVinit | systemd |
|---|---|---|
| 啟動(dòng)方式 | 串行啟動(dòng) | 并行啟動(dòng) |
| 管理方式 | init.d 腳本 | systemctl |
| 依賴管理 | 手動(dòng)配置 | 自動(dòng)處理 |
| 啟動(dòng)速度 | 慢 | 快 |
| 日志管理 | /var/log/messages | journalctl |
| 是否支持 cgroups | 否 | 是 |
| 重啟單個(gè)服務(wù) | service nginx restart | systemctl restart nginx |
| 查看服務(wù)狀態(tài) | service nginx status | systemctl status nginx |
5. 如何判斷系統(tǒng)使用 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目錄中的二進(jìn)制文件,說明使用SysVinit。
方法 2: 檢查進(jìn)程
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: 直接運(yùn)行 systemctl
systemctl --version
- 如果返回
systemd版本號(hào)(如systemd 249),說明 使用systemd。 - 如果
systemctl命令不存在,說明 使用SysVinit。
6. 哪些 Linux 版本使用 systemd?
| 發(fā)行版 | 使用的 init 系統(tǒng) |
|---|---|
| CentOS 6 及更早版本 | SysVinit |
| CentOS 7 及更新版本 | systemd |
| Ubuntu 14.04 及更早版本 | SysVinit |
| Ubuntu 16.04+ | systemd |
| Debian 7 及更早版本 | SysVinit |
| Debian 8+ | systemd |
Last:
SysVinit是 傳統(tǒng)的 Linux 啟動(dòng)管理系統(tǒng),使用init.d腳本,啟動(dòng)慢,依賴手動(dòng)管理。systemd是 現(xiàn)代 Linux 的標(biāo)準(zhǔn)init系統(tǒng),支持 并行啟動(dòng)、自動(dòng)管理依賴,大幅提升 啟動(dòng)速度。systemctl取代了service和chkconfig,提供更強(qiáng)的管理能力。journalctl替代了傳統(tǒng)/var/log/messages日志管理。
如果你的系統(tǒng)是 CentOS 7+ 或 Ubuntu 16+,你應(yīng)該使用 systemd 而不是 SysVinit。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
CentOS安裝Python2.7與Python2.6并存的方法
這篇文章主要介紹了CentOS安裝Python2.7與Python2.6并存的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-08-08
linux系列之常用運(yùn)維命令整理筆錄(小結(jié))
這篇文章主要介紹了linux系列之常用運(yùn)維命令整理筆錄(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
CentOS 下yum安裝mysql、jdk和tomcat的方法
這篇文章主要介紹了CentOS 下yum安裝mysql、jdk和tomcat的方法的相關(guān)資料,需要的朋友可以參考下2016-10-10
linux內(nèi)核編程container of()函數(shù)介紹
container_of在Linux內(nèi)核中是一個(gè)常用的宏,用于從包含在某個(gè)結(jié)構(gòu)中的指針獲得結(jié)構(gòu)本身的指針,這篇文章主要給大家介紹了關(guān)于linux內(nèi)核編程container of()函數(shù)的相關(guān)資料,需要的朋友可以參考下2021-07-07
centos7系統(tǒng)nginx服務(wù)器下phalcon環(huán)境搭建方法詳解
這篇文章主要介紹了centos7系統(tǒng)nginx服務(wù)器下phalcon環(huán)境搭建方法,結(jié)合具體實(shí)例形式詳細(xì)分析了centos7的nginx服務(wù)器搭建phalcon的具體操作步驟與相關(guān)設(shè)置技巧,需要的朋友可以參考下2019-09-09

