Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 開機啟動腳本機制深度解析:init、runlevel、rc.d 目錄結構與自定義服務排序

編輯:Linux 教學

核心概念:init 與執行等級

傳統 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/ 目錄結構詳解

/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 的主控腳本

rcX.d 符號連結命名規則

S##servicename  # 啟動腳本 (Start)
K##servicename  # 停止腳本 (Kill)

## 為兩位數字 00-99,決定執行順序
數字越小 → 越早執行
S 開頭 → 進入該 runlevel 時執行 (參數 start)
K 開頭 → 離開該 runlevel 時執行 (參數 stop)

範例:rc3.d 目錄內容

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 註解建立連結

服務腳本標準模板 (chkconfig 相容)

#!/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

關鍵檔案:/etc/rc.d/rc.sysinit 主要工作

  • 載入鍵盤映射與字型
  • 啟用交換分區
  • 設定主機名稱
  • 設定 NIS 域名
  • 檢查並掛載檔案系統 (fsck + mount)
  • 啟用磁碟配額
  • 載入聲卡模組
  • 同步系統時鐘

現代系統:systemd 取代 SysVinit (RHEL 7+)

  • 並行啟動、依賴關係圖、Socket/D-Bus 啟動、Cgroups 資源控制
  • 指令對照:systemctl start/stop/enable/disable/status
  • 相容層:systemd-sysv-generator 自動轉換 SysVinit 腳本
Copyright © Windows教程網 All Rights Reserved