1. 加载BIOS。
BIOS(Basic Input Output System),是固化到计算机内主板上一个ROM芯片上的程序。保存CPU相关信息、设备启动顺序信息、硬盘信息、内存信息等等。
打开计算机电源第一项工作即加载BIOS,进行POST(Power On Self Test自检),对硬件进行检测;第二步进行本地设备的枚举和初始化。
2. 读取MBR 。
MBR(Master Boot Record),位于硬盘第0磁道第一扇区,大小512字节,存放预启动信息、分区表信息。
要引导一个操作系统,BIOS运行时会按照CMOS的设置定义的顺序,搜索处于活动状态可以引导的设备。通常Linux都从硬盘上引导,而MBR中包含主引导加载程序。当MBR被加载到RAM以后,BIOS将控制权交给MBR。
查看MBR内容,可以使用以下语句:
# dd if=/dev/sda of=mbr.bin bs=512 count=1
# od -ax mbr.bin | tail -n 10
001000=0d512 Byte,512B为一个扇区的大小。aa55是MBR结束标志。
1. 运行Boot Loader
Grub引导程序不能由仅有512B的MBR完整表示,因此MBR引导程序开始加载第二阶段的引导程序,然后读取/boot/grub/menu.lst组织文件里的数据,menu.lst中列出了所有可用的操作系统和启动参数,grub按照配置信息来启动不同的操作系统。
2. 加载内核
Linux不能直接加载内核,需要首先加载initrd文件。
initrd(initial RAM disk),初始RAM磁盘,是在系统引导过程中挂载的一个临时根文件系统。文件中包含各种可执行程序和驱动程序,与内核绑定并作为内核引导过程的一部分进行加载,然后再将initrd卸载释放内存。
根据grub设定的内核映像所在路径,系统读取内核映像,并进行解压缩操作。系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。在start_kernal()的最后调用init()函数,进入下一步设定运行等级。
3. 用户层init依据inittab文件来设定运行等级
init进程是系统中所有进程的父进程,init进程繁衍出完成通常操作所需的子进程,这些操作包括:设置机器名、检查和安装磁盘及文件系统、启动系统日志、配置网络接口并启动网络和邮件服务,启动打印服务等。Linux中init进程的主要任务是按照inittab文件所提供的信息创建进程,由于进行系统初始化的那些进程都由init创建,所以init进程也称为系统初始化进程。
内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。
其实/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运行在等级5上。Linux的运行等级设定如下:
0:关机
1:单用户模式
2:无网络支持的多用户模式
3:有网络支持的多用户模式
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式
6:重新引导系统,即重启
4. Init进程执行rc.sysinit
在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。
5. 执行不同运行级别的脚本程序
根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。
6. 执行etc/rc.d/rc.local程序
让用户在初始化完成之后,登录之前个性化设置启动的东西。
7. 建立终端,Mingetty启动操作系统的登录。
8. 登录Shell,建立用户与操作系统的交互。
注1:简化步骤:
机器上电->BIOS启动->MBR引导->GRUB引导->initrd-> linux内核->各种服务->系统login
注2:用cat /etc/inittab查看inittab中的内容时,显示如下图:
不像网上广泛出现的后面有si::sysinit:/etc/rc.d/rc.sysinit等内容,我的理解为fedora12版本没有将后面的进程加入到inittab中。
Shelley