傳統 SysVinit 定義 7 個執行等級:
| 等級 | 名稱 | 用途 |
|---|---|---|
| 0 | 關機 | 系統停機 |
| 1 | 單用戶 | 維護模式 |
| 2 | 多用戶無網路 | 字元介面 |
| 3 | 多用戶有網路 | 字元介面(伺服器預設) |
| 4 | 保留 | 未使用 |
| 5 | 圖形介面 | X11 桌面(桌面預設) |
| 6 | 重啟 | 系統重開機 |
BIOS POST
↓
MBR → GRUB → 載入核心 (vmlinuz) + initramfs
↓
核心初始化:偵測硬體、掛載根檔案系統 (ro)
↓
啟動 PID 1:/sbin/init
↓
讀取 /etc/inittab → 確定預設 runlevel (id:3:initdefault: 或 5)
↓
執行 /etc/rc.d/rc.sysinit (系統級初始化,僅執行一次)
↓
執行 /etc/rc.d/rc $RUNLEVEL (進入對應 rcX.d 目錄執行啟動腳本)
↓
執行 /etc/rc.d/rc.local (使用者自定義晚期啟動)
↓
啟動 mingetty / XDMCP 等待登入
/etc/rc.d/
├── init.d/ # 所有服務啟動腳本實體存放處
├── rc0.d/ → ../init.d/ # 關機等級符號連結
├── rc1.d/ → ../init.d/
├── rc2.d/ → ../init.d/
├── rc3.d/ → ../init.d/ # 多用戶文字模式
├── rc4.d/ → ../init.d/
├── rc5.d/ → ../init.d/ # 圖形模式
├── rc6.d/ → ../init.d/ # 重啟等級
├── rc.sysinit # 系統初始化腳本
├── rc.local # 晚期自定義腳本
└── rc # 切換 runlevel 的主控腳本
S##servicename # 啟動腳本 (Start)
K##servicename # 停止腳本 (Kill)
## 為兩位數字 00-99,決定執行順序
數字越小 → 越早執行
S 開頭 → 進入該 runlevel 時執行 (參數 start)
K 開頭 → 離開該 runlevel 時執行 (參數 stop)
K01smartd → ../init.d/smartd
K10network → ../init.d/network
S10network → ../init.d/network
S12syslog → ../init.d/syslog
S55sshd → ../init.d/sshd
S99local → ../init.d/local
需求:確保資料庫 (mysqld) 在 Web 伺服器 (httpd) 之前啟動
# 1. 查看現狀
ls -l /etc/rc3.d/ | grep -E 'mysql|httpd'
# 假設現狀:
S64mysqld → ../init.d/mysqld
S85httpd → ../init.d/httpd
# 2. 移除舊連結
rm -f /etc/rc3.d/S64mysqld /etc/rc3.d/S85httpd
rm -f /etc/rc0.d/K*mysqld /etc/rc0.d/K*httpd
# ... 同理處理 rc1.d rc2.d rc4.d rc5.d rc6.d
# 3. 建立新連結 (mysqld 較小數字 = 較早啟動)
ln -s /etc/init.d/mysqld /etc/rc3.d/S50mysqld
ln -s /etc/init.d/httpd /etc/rc3.d/S60httpd
# 停止連結數字通常與啟動互補 (100 - 啟動數字)
ln -s /etc/init.d/mysqld /etc/rc0.d/K50mysqld
ln -s /etc/init.d/httpd /etc/rc0.d/K40httpd
# 4. 使用 chkconfig 管理 (推薦)
chkconfig --level 35 mysqld on
chkconfig --level 35 httpd on
# chkconfig 會自動依據腳本內 # chkconfig: 35 50 50 註解建立連結
#!/bin/bash
# chkconfig: 35 50 50
# description: MySQL Database Server
# processname: mysqld
# config: /etc/my.cnf
# pidfile: /var/run/mysqld/mysqld.pid
. /etc/rc.d/init.d/functions
start() {
echo -n $"Starting MySQL: "
daemon --user=mysql /usr/bin/mysqld_safe &
touch /var/lock/subsys/mysqld
return 0
}
stop() {
echo -n $"Stopping MySQL: "
killproc mysqld
rm -f /var/lock/subsys/mysqld
return 0
}
case "$1" in
start) start ;;
stop) stop ;;
restart) stop; start ;;
status) status mysqld ;;
*) echo "Usage: $0 {start|stop|restart|status}"; exit 1 ;;
esac
fsck + mount)systemctl start/stop/enable/disable/statussystemd-sysv-generator 自動轉換 SysVinit 腳本