以 RedHat 9.0 / i386 為例,啟動鏈路劃分為六大階段:
start_kernel() 初始化核心子系統/etc/inittabrc.sysinit 完成交換分區、磁碟檢查、模組載入等rc 腳本啟動對應 runlevel 守護進程mingetty 開啟虛擬終端 → login 驗證 → Shell 環境建立bootsect.S:載入引導扇區,跳轉 setup.Ssetup.S:收集 BIOS 回傳硬體參數(記憶體、磁碟)至特定記憶體、偵測顯示模式、切換保護模式、跳轉 0x1000000x100000 存放解壓後核心(bzImage 格式),由 arch/i386/boot/compressed/head.S 呼叫 decompress_kernel() 解壓0x100000 執行 arch/i386/kernel/head.S::startup_32 → start_kernel()(init/main.c)start_kernel() 執行大量初始化:記憶體管理、陷阱門、定時器、中斷、調度器、VFS、驅動模型等init() 創建首個核心執行緒(PID 1),完成外設驅動載入、根檔案系統掛載init() 重定向標準輸入輸出至 /dev/console,execve() 載入用戶空間 /sbin/init/etc/inittab 格式:id:runlevel:action:process
| 欄位 | 含義 | 關鍵值說明 |
|---|---|---|
| id | 入口識別符 | getty 項需與 tty 編號對應 |
| runlevel | 運行級別 | 0 停機、1 單用戶、3 多用戶文字、5 圖形、6 重啟;S/s 單用戶無需 inittab |
| action | 執行模式 | initdefault 預設級別、sysinit 無條件啟動、wait 等待結束、respawn 終止後重啟、ctrlaltdel 捕捉重啟鍵 |
| process | 執行程式 | 可帶參數 |
id:5:initdefault: # 預設運行級別 5 (圖形)
si::sysinit:/etc/rc.d/rc.sysinit # 系統初始化腳本
l5:5:wait:/etc/rc.d/rc 5 # 級別 5 啟動 rc 腳本
1:2345:respawn:/sbin/mingetty tty1 # 6 個文字終端
x:5:respawn:/etc/X11/prefdm -nodaemon # 圖形登入管理器
/etc/rc.d/rc.sysinit(850+ 行 Bash 腳本)核心任務:
建議管理員直接閱讀本機腳本理解細節。
/etc/rc.d/rc 接受級別參數(如 5),執行 /etc/rc.d/rc5.d/ 下腳本鏈結:
S* 開頭:start 參數啟動K* 開頭:若服務已運行(/var/lock/subsys/ 有鎖文件),先 stop 再 start,確保級別切換時服務重啟真實腳本位於 /etc/rc.d/init.d/,通用參數:start|stop|restart|status。常見守護進程:network, syslog, crond, sshd, httpd, smb, nfs, xinetd...。透過 chkconfig 或 setup 管理各級別服務清單。
mingetty 以 respawn 模式在 tty1-6 運行,提供文字登入介面,接收用戶名傳遞給 login 驗證。
login 驗證邏輯:非 root 檢查 /etc/nologin、root 限制 /etc/securetty、/etc/usertty 附加限制/etc/passwd、/etc/shadow 驗證密碼、取得家目錄與 Shell(預設 /bin/bash)/etc/profile → ~/.bash_profile → 其引用的其他配置
掌握此鏈路,可精準定位啟動故障、客製化啟動流程、深入理解 Linux 核心與用戶空間交互機制。