Debian启动过程简介

http://www.ringkee.com/note/opensource/debian/ch09s03.html

Debian与其它的Linux发行版一样,系统启动主要分三个阶段,第一个阶段是BIOS启动阶段,第二个阶段是kernel启动阶段,第三个阶段是init初始化系统阶段。当电脑加电启动时会首先运行主板flash Memory中的程序,主要任务是检测电脑的基础组件,如主板、内存和硬盘等。当基础组件检测完成后,找到引导设备后,电脑就会进入kernel启动阶段。kernel启动阶段通过MBR中的引导程序(LILO or GRUB)把内核映像装入内存运行。Kernel启动阶段完成后,就开始启动系统的第一个进程init,它完成一系统初始化工作,使Linux系统可以正常使用。init进程是Linux系统所有进程的父进程。本节重点介绍init初始化程序。

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:    #默认的启动级别为5

# 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

# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.

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

# What to do when CTRL-ALT-DEL is pressed.
#ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

# Action on special keypress (ALT-UpArrow).
#kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."

# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop

# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  :::
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6

# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3

在这个配置文件中,以“#”号开头的内容是注释信息。第一个执行的脚本是/etc/init.d/rcS,它会执行/etc /rcS.d目录下的所有脚本。/etc/rcS.d目录下的脚本名都以大写字母“S”和一个顺序号开头,它们在系统初始化时都要被执行。如果某个脚本你不想执行,则改成以大写字母“K”开头即可。以”K“开头的脚本会先被执行,它调用了脚本的stop参数,用来关闭一些进程,接着再执行以”S“开头的脚本,它调用了脚本的start参数,用以启动进程。其实/etc/rcS.d目录下的所有脚本都是符号链接,真正执行的脚本存放在/etc/init.d 目录下。脚本会按从小到大的顺序执行,以S40开头的脚本执行之后,本地文件系统已加载,网络已启动,所有的驱动程序完成初始化。S60的脚本执行之后,系统时钟已设置,NFS文件系统已加载,文件系统已可用。

执行完系统级的初始化脚本后,init程序会继续执行默认运行级别指定的启动脚本。如指定的默认运行级别是5则会执行/etc/rc5.d目录下的脚本,如果是1则会执行/etc/rc1.d目录下的脚本。/etc/rc5.d目录下的脚本名的命名格式和rcS.d目录下的脚本一样,也是一些以“S”或“K”开头的符号链接。以“S”开头表示启动,以“K”开头的表示禁止。 Debian系统定义了从0到6共7个运行级别。每个级别代表意义如下:

  • Runlevel 0:关机操作,关闭所有程序,如果内核支持APM,还可以自动关闭主机电源。

  • Runlevel 1:单用户模式,提供一个root shell和只读的文件系统,该级别用于进行系统恢复。

  • Runlevel 2,3,4,5:多用户模式,由用户自由设定。

  • Runlevel 6:与级别0类似,但它不关闭电脑,而是重启电脑。

update-rc.d命令用以维护不同级别下的启动脚本,它会自动在rc?.d目录下创建到/etc/init.d目录中脚本的链接。在运行该命令前,请确保你要添加的启动脚本已位于/etc/init.d目录下。下面是一个update-rc.d命令示例:

debian:/etc# update-rc.d foo start 99 2 3 4 5 . stop 01 0 1 6 .
 Adding system startup for /etc/init.d/foo ...
   /etc/rc0.d/K01foo -> ../init.d/foo
   /etc/rc1.d/K01foo -> ../init.d/foo
   /etc/rc6.d/K01foo -> ../init.d/foo
   /etc/rc2.d/S99foo -> ../init.d/foo
   /etc/rc3.d/S99foo -> ../init.d/foo
   /etc/rc4.d/S99foo -> ../init.d/foo
   /etc/rc5.d/S99foo -> ../init.d/foo

/etc/inittab配置文件有专门的指令控制init进程的运行,指令格式如下:

id:runlevels:action:command

id是指令标识,runlevels表示运行级别,action表示执行的时机,command表示执行的命令。如:

l5:5:wait:/etc/init.d/rc 5

其中15是指令标识符,5是运行级别,wait表示进入运行级别时就开始执行”/etc/init.d/rc 5“命令,在执行命令期间,init程序会停下来,直到命令执行完成后init才继续往下执行。action有很多种,下面分别介绍:

  • respawn,启动命令并监视命令的执行,当进程退出时,会再次执行该命令。

  • wait,进行指定运行级别时,执行指定的命令,并且init进程会暂停,直到命令执行完成再继续。

  • once,进行指定运行级别时,执行一次指定命令。

  • boot,命令在系统引导时就被执行,不受运行级别约束。

  • bootwait,同上,但init进程会停下来等命令执行完才继续往下执行。

  • off,禁用所有运行级别下的某个命令。

  • initdefault,指定在系统引导时进入哪个运行级别。

  • powerwait,在电源不足时需要运行的命令,init进程会暂停,直到指定的命令完成。

  • powerfailnow,同上,但init进程不会暂停。

  • powerokwork,电源恢复正常后需运行的命令,init进程暂停,直到命令执行完成。

  • ctrlaltdel,在捕获到Ctrl+Alt+Del组合键时执行的命令。

  • kbdrequest,把特殊的动作映射到特定的按键上。

你可能感兴趣的:(Linux)