兴趣是最好的学习契机!
全部博文(127)
分类: LINUX
2015-04-13 15:43:39
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,把特殊的动作映射到特定的按键上。