init 進程本質
- 內核啟動完成後啟動的第一個用戶態進程 (PID=1)。
- 掛載點:
/sbin/init (若不存在嘗試 /bin/sh,失敗則內核 panic)。
- 祖先進程:所有用戶進程的直接或間接父進程,負責收養孤兒進程。
運行級別
| 級別 | 名稱 | 描述 |
| 0 | 停機 | 關機,**不可**設為 initdefault |
| 1 | 單用戶 | 維護模式,僅 root,最少服務,掛載最少文件系統 |
| 2 | 多用戶無 NFS | 多用戶,無網絡文件系統 |
| 3 | 完全多用戶 | 標準運行級,文本界面 |
| 4 | 保留 | 未使用,可自定義 |
| 5 | 圖形界面 | X11 (xdm/gdm/kdm) |
| 6 | 重啟 | 重啟,**不可**設為 initdefault |
/etc/inittab 核心格式
id:runlevels:action:process
- id:唯一標識 (1-4 字符)。
- runlevels:生效的運行級別集合 (如
123、2345)。
- action:關鍵字決定 init 如何處理
process。
- process:執行的命令/腳本。
常見 action
| action | 行為 |
| initdefault | 指定默認運行級別 (無 process) |
| sysinit | 系統啟動早期執行 (如掛載、清理 /tmp) |
| wait | 進入指定級別時執行一次,等待結束 |
| once | 進入級別執行一次,不等待 |
| respawn | 進程終止自動重啟 (如 getty、sshd) |
| ctrlaltdel | 捕獲 Ctrl+Alt+Del 執行 (通常重啟) |
| powerfail/powerwait | UPS 電源故障處理 |
範例片段
id:3:initdefault: # 默認運行級 3
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l3:3:wait:/etc/rc.d/rc 3
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
SysV 啟動腳本機制
- 腳本存放:
/etc/init.d/ 或 /etc/rc.d/init.d/
- 各級別目錄:
/etc/rc.d/rc[0-6].d/ (符號鏈接)
- 鏈接命名:
Sname (啟動)、Kname (停止),NN 為優先級。
- 切換級別時,init 調用
/etc/rc.d/rc $runlevel,按順序執行 K* 停止舊服務、S* 啟動新服務。
單用戶模式實戰
場景:忘記 root 密碼
- GRUB/LILO 引導菜單編輯內核參數:
init=/bin/sh 或 single / 1 / emergency。
- 進入單用戶,掛載根分區可寫:
mount -o remount,rw /。
- 執行
passwd 修改密碼。
- 重啟進入正常級別。
telinit 動態切換
telinit 3 # 切換到運行級 3
telinit 5 # 啟動圖形界面
telinit 6 # 重啟
telinit q # 重讀 inittab
systemd 時代備註
現代發行版 (RHEL7+, Ubuntu 15.04+) 已遷移至 systemd,運行級別映射為 target (如 multi-user.target ≡ 3,graphical.target ≡ 5)。/etc/inittab 不再使用,但理解 SysV 概念有助於兼容舊腳本與排查遺留問題。