如果 init 是 SysVinit(/sbin/init),其执行步骤如下:
一. 读取 /etc/inittab
# /etc/inittab: init(8) configuration. # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $ # The default runlevel. id:5:initdefault: # Boot-time system configuration/initialization script. # This is run first except when booting in emergency (-b) mode. si::sysinit:/etc/init.d/rcS # What to do in single-user mode. ~~:S:wait:/sbin/sulogin l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # Normally not reached, but fallthrough in case of emergency. z6:6:respawn:/sbin/sulogin #mxc0:12345:respawn:/bin/start_getty 115200 ttymxc0 #mxc0:12345:respawn:/sbin/getty -l -n -L 115200 ttymxc0 mxc0:12345:respawn:/sbin/getty -L 115200 ttymxc0 # /sbin/getty invocations for the runlevels. # # The "id" field MUST be the same as the last # characters of the device (after "tty"). # # Format: # ::: # 1:12345:respawn:/sbin/getty 38400 tty1
init 读取 /etc/inittab 文件,确定系统初始化行为和默认运行级别(runlevel)。
/etc/inittab 定义了系统初始化脚本、运行级别脚本、终端进程等。例如:
运行级别:
id:5:initdefault
初始化脚本:
si::sysinit:/etc/init.d/rcS
运行级别脚本:
l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6
二.执行系统初始化脚本(/etc/init.d/rcS)
init 执行 /etc/inittab 中定义的 sysinit 脚本,通常是 /etc/init.d/rcS。
/etc/init.d/rcS 是一个主脚本,负责调用 /etc/rcS.d/ 目录中的初始化脚本。
/etc/rcS.d/ 中的脚本是符号链接,指向 /etc/init.d/ 中的实际脚本
常见任务(嵌入式系统可能精简):
挂载文件系统(/proc、/sys、/dev 等)。
设置主机名。
初始化网络或设备驱动。
加载内核模块(modprobe)。
设置系统时钟(可能涉及 date -u 获取 UTC 时间)。
#!/bin/sh # # rcS Call all S??* scripts in /etc/rcS.d in PATH=/sbin:/bin:/usr/sbin:/usr/bin runlevel=S prevlevel=N umask 022 export PATH runlevel prevlevel # Make sure proc is mounted # [ -d "/proc/1" ] || mount /proc # # Source defaults. # . /etc/default/rcS # # Trap CTRL-C &c only in this shell so we can interrupt subprocesses. # trap ":" INT QUIT TSTP # # Call all parts in order. # exec /etc/init.d/rc S
三.进入默认运行级别
/etc/inittab 指定默认运行级别(例如 2 表示多用户模式)。
init 执行 /etc/init.d/rc X(X 为运行级别,如 2),调用 /etc/rcX.d/ 目录中的脚本。
/etc/rcX.d/ 包含 S##(启动)和 K##(停止)脚本,按编号顺序执行。
嵌入式系统中,运行级别通常简化为单一级别(如 2 或 5),或直接跳过,仅执行 rcS.d。