山高疑日近,海阔觉天低

Linux init 启动过程

如果 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。

赞(0) 打赏
未经允许不得转载:Mr.Zhang » Linux init 启动过程

评论 抢沙发

你的打赏是我的动力

登录

找回密码

注册