学习Linux首先要做的工作,我觉得就是了解它的引导流程,这样我们才能深入地了解系统。 首先简单地概括下Linux的启动过程:
1、加载BIOS的硬件信息与进行自我测试,并依据设置取得第一个可启动的设备;
2、读取并执行第一个启动设备内MBR的的Boot Loader(即是grub,spfdisk等程序);
3、依据Boot Loader的设置加载Kernel,Kernel会开始检测硬件与加载驱动程序;
4、在硬件驱动成功后,Kernel会主动调用init进程,而init会取得run-level信息;
5、init执行/etc/rc.d/rc.sysinit文件来准备软件执行的操作环境(如环境变量、网络、时区等);
6、init执行/etc/rc.d/rc以根据默认设置的运行级别来启动相应的脚本程序;
7、init执行/etc/rc.d/rcN.d (其中N=0-6)下的脚本以启动相应的系统服务(如默认运行级别为3,则这里执行的是/etc/rc.d/rc3.d下的相应脚本);
8、init执行终端机模拟程序mingetty来启动login进程,最后就是等待用户登录。
呵呵,这一串描述下来有没有点晕的感觉呢?反正我第一次接触的时候是晕了。就算跟我一样晕了也没关系,下面我用图来大概展示下这个过程:
系统引导过程中自检程序载入Kernel后,Kernel要完成两件事:驱动硬件和启动init进程。init启动后读取inittab文件,执行缺省运行级别,从而继续引导过程。在Unix系统中,init是第一个可以存在的进程,它的PID恒为1,但它也必须向一个更高级的功能负责:PID为0的内核调度器(Kernel scheduler,主要负责CPU时间分配和进程切换),从而获得CPU时间。这里有必要附加一点对Linux进程的说明,在Linux中,如果父进程终止而其子进程由于某种原因没有终止,当系统检测到这种孤立进程后,会将其父进程指向init进程;如果子进程终止了,而父进程不知道子进程已经终止,仍然试图与其保持联系,这种情况下子进程将成为僵尸进程。
由上面的分析我们知道,系统引导过程中启动的第一个进程就是init进程,而init进程启动后就立马去读取/etc/inittab配置文件进而继续后续引导过程。那么这个inittab文件中都是些什么东东呢?下面我们就对这个/etc/inittab文件进行剖析。
我们直接打开这个inittab文件,我们会看到文件开头一段注释就是对文件功能的描述:
这一小段描述相信大家都能看懂,这里我就不啰嗦了。再往下走,我们会看到Linux运行级别的描述:
由此我们知道系统有7个运行级别,0表示关机;1表示单用户模式(注意,在该模式下只有root才能登陆);2表示多用户模式,但是该模式下没有NFS;3表示多用户模式;4暂时还没使用;5表示图形界面;6表示重启。了解了系统的运行级别后我们就可以修改系统的默认运行级别了,设置系统默认运行级别就是接下来的一句配置系统默认是启动图形界面,通常我们不需要图形界面就直接把这里的5改成3来让其默认启动命令行。接着往下走,我们会看到这么一小段。
由注释我们知道这是系统初始化动作,在这里我们看到了上面描述引导流程中提到的/etc/rc.d/rc.sysinit。接着往下我们看到了上面提到的/etc/rc.d/rc
这里是上面提到的各个run level要执行的各项脚本放置处,主要通过/etc/rc.d/rc这个命令来处理相关任务。假设这默认的run level是3,那么系统接下来就会执行/etc/rc.d/rc3.d下面的脚本
我们会发现这里面的文件都是以K或者S开头的,其实这些S开头的文件都是在run level为3时需要运行的服务,而K开头的文件都是run level为3时需要停止的服务,到这里系统就进入相应的运行级别启动相应服务。我们接着来看inittab文件,下面一段内容我们大概了解下就行了
我们看到#Run gettys in standard runlevels这行注释下面的这一段就是系统运行终端,默认提供6个运行终端tty1-tty6,我们也可以自己添加,通过这些运行终端我们就可以登录系统。
这里附加一点对inittab的说明,在inittab中所有的条目均采用个格式是id:run-levels:action:process。各个字段的分别表示:
id:标识符,一般为两位字母或数字
run-levels:指定运行级别,可以指定多个
action:指定运行状态
process:指定要运行的脚本/命令
其中常用的action值有:
initdefault:指定系统缺省启动的运行级别
sysinit:系统启动执行process中指定的命令
wait:执行process中指定的命令,并等其结束再运行其他命令
once:执行process中指定的命令,不等待其结束
ctrlaltdel:按下Ctrl+Alt+Del时执行process指定的命令
powerfail:当出现电源错误时执行process指定的命令,不等待其结束
powerokwait:当电源恢复时执行process指定的命令
respawn:一旦process指定的命令中止,便重新运行该命令
OK,上面就是Linux的引导流程。貌似写的有点乱呀,凑合看吧。我这里只是大概的分析了下启动过程,如果想要更详细地了解,推荐大家一本书《鸟哥的Linux私房菜》,这本书的第20章对这个启动分析的很详细。