linux启动过程浅析--ZT

linux引导过程(linux boot progress)

当pc启动时,它首先要运行bios程序。bios程序通常是存放在EEPROM存储器中,一般地,用户可以设置bios固件来配置引导过程。例如,引导的顺序是先a盘啊还是先c盘或者是cdrom。随后bios程序读入引导介质的第一个扇区,此启动扇区包含现在将要运行的一小段代码,这一小段代码肩负着从磁盘读入操作系统和执行操作系统代码的任务。在linux系统中,通常使用lilo来让用户选择可以启动的操作系统。lilo通常安装在引导扇区(也被叫做主引导记录:master boot record)。如果用户选择引导linux,lilo将会把读入linux内核,就是做以下的事情:
·lilo将会读入文件/etc/lilo.conf。lilo会给用户选择从此配置文件的哪一行引导,如果从linux引导,可能会在此文件的一行中有这样的文字:"root=/dev/hda5",表明哪个设备将会作为root分区来挂载。也可能会有这么一行:”image=/boot/vmlinuz-2.2.5-15",告诉用户将要加载哪个内核映象(kernel image)
·linux内核会以压缩的形式被载入内存,所以载入后的第一件事是自己内核自己解压缩。内核映象的开头一小段代码完成解压缩的功能。
·如果你使用了linux能够识别的super-VGA显卡的话,linux将会提供你一些特殊的文本模式(如100列x40行),你可以自己选择一个。
·随后,内核会检测你有什么硬件设备(如硬盘,软驱,网卡等等),以及配置相关硬件的驱动,同时内核会在显示器屏幕上显示它的检测结果。
·内核会尝试挂载你的根文件系统。根文件系统可以在编译时刻确定,或者在lilo中确定。文件系统的类型由系统自动检测。如果挂载根文件系统失败,例如你忘记了在内核中包含进相应文件系统的驱动,内核会panic,挂起系统。文件系统通常以只读的方式挂载(当然也可以设置),目的是为了检测挂载上的文件系统,因为以读写的方式挂载文件系统进行检测并不是明智之举。
·此后,内核以后台的方式启动init程序(从/sbin/init),所以init的进程号通常是1。init将会启动系统中的一些服务


未完待续......
--
国家一级民工
※ 来源:.天大求实BBS http://bbs.tju.edu.cn [FROM: 202.113.9.233]



linux init 和系统初始化
(Linux Init and System Initialization)

一: init和runlevels

init进程读取/etc/inittab文件,使用它来决定如何创建进程。你可以man init来得到更多的信息。我们
应该注意到,init进程总是在运行中,并且可以根据各种各样的信号来动态的做一些事情和运行新的进程
。管理员可以通过修改/etc/inittab文件或者使用telinit命令来告知init进程改变系统进程和运行级别(runlevels)。首先,我们解释一下什么是运行级别(runlevels),运行级别是系统对软件的配置,它只允许被选择的一组进程得到运行。init进程可以使系统在8个不同的运行级别下运行。8个级别是0~6,S和s。当然系统一次只能在一个级别下运行,也就是说不能同时运行在不同的级别下。这些运行级别有各自的适用情况,对red hat linux version 6来说,它们是:

0 - halt(停机)
1 - Single user mode(单一用户模式)
2 - Multiuser, without NFS(多用户模式,没有nfs文件系统支持,同3,如果你没有网络的话)
3 - Full multiuser mode(多用户模式)
4 - unused(没有用到)
5 - X11(图形模式)
6 - Reboot(重启了)

二:inittab 文件
/etc/inittab文件告诉init进程系统要在哪个运行级别工作,以及告诉init在相应的级别下干什么工作。i

nittab文件中的每一个条目有如下的格式:

id:runlevels:action:process

·id - 在inittab文件中唯一标识一个条目的1-4个字符长的标识。
·runlevels - 列出指定的action的运行级别,例如123表示这个进程应该在运行级别1,2,3运行。
·action - 描述了应该采取的动作。可取的动作有:
·respawn - 如果该进程结束,将会重新启动
·wait - 当进入指定的运行级别后,该进程将会被执行一次,init会等到该进程的结束。
·once - 当进入指定的运行级别后,该进程将会被执行一次
·boot - 该进程在系统启动(boot)时被执行,忽略runlevels字段
·bootwait - 同boot,但是init将会等待该进程的结束。
·off - 什么也不做。
·ondemand - 当进入指定的级别后运行该进程。
·initdefault - 表明系统启动后将要进入的缺省的运行级别,process字段被忽略。
·sysinit - 在系统启动时执行该进程,它在任何的boot或者bootwait条目前执行。忽略runlevels字段。
·powerwait - 当init进程接收到SIGPWR信号时,执行改进程,init等待它执行完。
·powerfail - 同powerwait,但不会等待进程执行完。
·powerokwait - 当init进程接收到SIGPWR信号时,并且存在一个内容为“ok”的/etc/powerstatus文件的话,执行该进程。
·ctrlaltdel - 当init接收到SIGINT信号时(CTRL-ALT-DEL键),运行该进程。
·kbrequest - 当键盘中某一个按键被按下时,执行。
·process - 指定将要执行的进程。如果以+开头的话,init不会为这个进程使用utmp,wtmp来记录此进程的信息。

以下是一个inittab文件样本:

# inittab       This file describes how the INIT process should set up
#               the system in a certain run-level.
#
# Author:       Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
#               Modified for RHS Linux by Marc Ewing and Donnie Barnes
#

# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
1) id:3:initdefault:

# System initialization.
2) si::sysinit:/etc/rc.d/rc.sysinit

3) l0:0:wait:/etc/rc.d/rc 0
4) l1:1:wait:/etc/rc.d/rc 1
5) l2:2:wait:/etc/rc.d/rc 2
6) l3:3:wait:/etc/rc.d/rc 3
7) l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
9) l6:6:wait:/etc/rc.d/rc 6

# Things to run in every runlevel.
10) ud:nce:/sbin/update

# Trap CTRL-ALT-DELETE
11) ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.  
12) pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
13) pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"


# Run gettys in standard runlevels
14) 1:2345:respawn:/sbin/mingetty tty1
15) 2:2345:respawn:/sbin/mingetty tty2
16) 3:2345:respawn:/sbin/mingetty tty3
17) 4:2345:respawn:/sbin/mingetty tty4
1 5:2345:respawn:/sbin/mingetty tty5
19) 6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5
# xdm is now a separate service
20) x:5:respawn:/etc/X11/prefdm -nodaemon

注意:1),2)...20)是为了好说明而加的标记,并不存在于inittab文件中哟!
"#"是注释符号,标识后面的都是注释。

行1说明默认的运行级别是3,
行2说明在系统启动时,在其它任何的进程之前运行/etc/rc.d/rc.sysinit程序。
行3到9告诉init程序根据级别0~6运行相应的shell脚本(/etc/rc.d/rc <runlevels>)
行10说明程序/sbin/update在每个运行级别只运行一次。
行11说明当用户按下了"CTRL-ALT-DEL"时,执行/sbin/shutdown.
行14~19说明对于运行级别从2~5,都要运行/sbin/mingetty程序,启动控制台。

未完待续......

--
国家一级民工
※ 来源:.天大求实BBS http://bbs.tju.edu.cn [FROM: 202.113.9.233]