Linux 開機從核心交棒給 init 進程後,遵循 System V init 或 BSD 風格兩大流派。本文詳細說明 System V init 的四大階段,並以 Linux From Scratch (LFS) 實際目錄結構與腳本為例,展現完整初始化脈絡。
/etc/rc.d/rc.sysinit — 啟用 swap、磁碟檢查、設定主機名、掛載檔案系統、載入硬體模組。/etc/inittab 的 initdefault,切換至對應 rcX.d 目錄執行 S*/K* 腳本。/etc/rc.d/rc.local — 最後執行,供管理員加入開機自啟指令。/bin/login 或圖形化顯示管理器。注意:BusyBox 等嵌入式環境可能直接執行 /etc/init.d/rcS,流程簡化。
id:3:initdefault:
si::sysinit:/etc/rc.d/init.d/rc sysinit
l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
...
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
su:S016:once:/sbin/sulogin
1:2345:respawn:/sbin/agetty tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
rc 腳本接收數字參數,對應 rcX.d 目錄;sysinit 參數對應 rcsysinit.d。
etc/
├── fstab
├── inittab
├── profile
├── rc.d/
│ ├── init.d/
│ │ ├── checkfs
│ │ ├── cleanfs
│ │ ├── modules
│ │ ├── mountfs
│ │ ├── mountkernfs
│ │ ├── network
│ │ ├── rc
│ │ ├── reboot
│ │ └── ...
│ ├── rc0.d/
│ │ ├── K80network -> ../init.d/network
│ │ ├── S60sendsignals -> ../init.d/sendsignals
│ │ └── S99halt -> ../init.d/halt
│ ├── rc1.d/ ...
│ ├── rc2.d/ ...
│ ├── rc3.d/
│ │ ├── S10sysklogd -> ../init.d/sysklogd
│ │ └── S20network -> ../init.d/network
│ ├── rc4.d/ ...
│ ├── rc5.d/ ...
│ ├── rc6.d/ ...
│ └── rcsysinit.d/
│ ├── S00mountkernfs -> ../init.d/mountkernfs
│ ├── S02consolelog -> ../init.d/consolelog
│ ├── S05modules -> ../init.d/modules
│ ├── S10udev -> ../init.d/udev
│ ├── S20swap -> ../init.d/swap
│ ├── S30checkfs -> ../init.d/checkfs
│ ├── S40mountfs -> ../init.d/mountfs
│ ├── S45cleanfs -> ../init.d/cleanfs
│ ├── S50udev_retry -> ../init.d/udev_retry
│ ├── S70console -> ../init.d/console
│ ├── S80localnet -> ../init.d/localnet
│ └── S90sysctl -> ../init.d/sysctl
S 開頭 = start (啟動),K 開頭 = stop (停止),數字越小優先度越高。
#!/bin/sh
. /etc/sysconfig/rc
. ${rc_functions}
. /etc/sysconfig/network
case "${1}" in
start)
for file in ${network_devices}/ifconfig.*; do
interface=${file##*/ifconfig.}
[ "${interface}" = "*" ] && continue
IN_BOOT=1 ${network_devices}/ifup ${interface}
done
;;
stop)
FILES=""
for file in ${network_devices}/ifconfig.*; do
FILES="${file} ${FILES}"
done
for file in ${FILES}; do
interface=${file##*/ifconfig.}
[ "${interface}" = "*" ] && continue
IN_BOOT=1 ${network_devices}/ifdown ${interface}
done
;;
restart)
${0} stop; sleep 1; ${0} start
;;
*)
echo "Usage: ${0} {start|stop|restart}"; exit 1
;;
esac
透過 ifconfig.* 設定檔迴圈啟動/關閉所有介面,體現 SysV 腳本的標準化模式。
System V init 以「執行層級 + 目錄化腳本」提供高度模組化的啟動管理。LFS 實作展示了最精簡且教學價值最高的結構,適合深入理解 Linux 開機機制、客製化嵌入式系統或建構教學環境。