1.POST(加电自检)
POST:Power-On-Self-Test,是BIOS功能的一个主要部分。它负责完成对CPU、主板、内存、软硬盘子系统、显示子系统(包括显示缓存)、串并行接口、键盘、CD-ROM光驱等的检测。主要检查硬件的好坏。
2.BOOT Sequence
按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备。
3.第一阶段引导加载程序
MBR 实际上是由3个部分组成 :主引导加载程序(master bootloader code,446 字节)、主分区表(ppt)、magic nubmer(0xAA55)组成主分区表有4个记录,对应主分区1-主分区4,共64字节。最后的magic number是2字节。
主引导加载程序搜索主分区表,扫描全部4个分区记录,确保只有1个是被标为“active”的(用fdisk可以设置某个分区为active分区)。然后读入该分区的引导扇区(前512 字节)。active 分区一般是 C 盘或者 linux 的第一个分区。
主引导加载程序的作用就是读入第2阶段的引导加载程序。
4.第二阶段引导加载程序
第2阶段引导加载程序的目的是加载内核和initrd ,如果Boot-Loader安装在MBR中,启动过程将不会涉及到Active分区的第一个扇区,也就是说MBR的引导程序(stage1)会直接加载stage2(或是stage1.5,grub有此阶段),而stage2是存放在某个分区中的文件,lilo应该是boot.b, grub是stage1.5和stage2,在安装boot-loader的时候,这些文件的位置会被记录在stage1中。在这种情况下,即使没有一个分区是Active的,系统也可以引导。
如果Boot-loader安装在Active分区的第一个扇区,MBR仍然会有一小段引导程序,用于加载被安装在Active分区第一个扇区的Boot-loader Stage1. 通过Stage1会启动stage1.5的boot loader来理解linux内核镜像中的特殊的文件系统格式,例如,reiserfs_stage1-5(用于从reiserf日志文件系统中进行加载)或e2fs+stage1_5(用于从wxt2或ext3文件系统进行加载)。当stage1.5的boot loader被加载并运行时,stage2 的boot loader才能被加载。当stage2被加载时,GRUB能根据请求的情况显示一个可选内核的清单(在 /etc/grub.conf 中进行定义,同时还有几个软符号链接 /etc/grub/menu.lst和/etc/grub.conf)。你可以选择一个内核,修改其附加的内核参数。同时,你可以选择使用命令行的shell来对启动过程进行更深层次的手工控制。在第二阶段boot loader存在与内存中后,就可以对文件系统进行查询了,同时,默认的内核镜像以及初始化内存盘镜像也被加载到内存中。一切准备完毕之后,第二阶段的boot loader就会调用内核镜像。
5.内核
内核自解压,按照bootloader向它提供的initrd在内存中的地址,把/dev/initrd的内容拷贝到 /dev/ram ,并释放/dev/initrd所占用的内存。
把/dev/ram按rw的模式挂载为虚拟文件系统,在内存中仿真一个根目录系统,提供一个可执行程序,该程序执行其上面的/linuxrc或者/init脚本,目的是加载驱动模块。
在/linuxrc和/init脚本中,会有pivot_root()或者switchroot把/sysroot下的真正根文件系统设备挂载到/,把初始根文件系统挂载到/initrd下。
/linuxrc和/init脚本的后面会umount /initrd下的初始根文件系统(即使没有完全卸载,也会在/etc/rc.d/rc.sysinit中把它们全部卸载)。
接下来是启动init进程,在2.4内核中,这个步骤是由内核完成的。但在2.6内核中,这个步骤是由/init脚本完成的。
简而言之:Boot Loader加载kernel和initrd后,在内存中让initrd解压缩为一个虚根,kernel就能借此通过linuxrc加载适当的驱动程序,最终释放那个虚拟文件系统,并挂载实际的根目录文件系统,就能够开始后续的正常启动流程了。
6.INIT
此时内核主动调用第一个进程/sbin/init。其主要功能是准备软件执行的环境,包括系统主机名,网络设置,语系处理,文件系统格式及其他服务的启动等。
init会读取/etc/inittab的配置文件,inittab定义了init的处理流程,其流程是:
(1)取得runlevel即默认执行等级的相关等级
(2)使用/etc/rc.d/rc.sysinit进行系统初始化,其主要工作是设置好整个系统的环境。
(3)确认启动进入级别,通过/etc/rc.d/rc根据启动的级别来决定启动的服务选项,
(4)执行用户自定义开机启动程序/etc/rc.d/rc.local
(5)执行终端机模拟程序mingetty来启动login进程,等待用户登入