以CentOS6.9为例,系统启动流程如下


POST --> Boot Sequence(BIOS)-->BootLoader --> grub --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --> 系统初始化脚本rc.sysinit --> 关闭或启动对应级别的服务 --> 启动终端


1.加电自检POST(Power On Self Test)

主机加电开机后,首先进行硬件自检。主机通电后,主板会自动读取ROM中的程序,并从CMOS中加载BIOS信息,负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。如遇到硬件故障的话将按两种情况进行处理:对于严重故障(致命性故障)则直接停机,此时由于各种初始化操作未完成,不能给出任何提示或信号;对于非严重故障,则会给出相应的提示或声音报警信号,等待用户处理。如果没有遇到故障,则加电自检通过,将后续工作交接给BIOS处理。

       

2.启动顺序Boot Sequence

POST完成后,系统控制权转交到BIOS,BIOS通过预设的参数识别基础硬件设备,启动硬件初始化;同时按照系统启动顺序依次查找各引导设备,第一个有引导程序的设备即为本次启动用到设备(一般为本地硬盘)。BIOS完成相关工作后,将后续工作交接给MBR中的Bootloader处理。

       

3.启动加载BootLoader

硬盘上第0头0道第1扇区被称为MBR(Master Boot Record),即主引导记录。虽然MBR仅有512个字节,但却存放了前446个字节的启动加载器(Bootloader,其中装有GRUB)、中间64个字节的磁盘分区表(Disk Partition Table)以及最后2个字节的结束标识(Magic Number)。启动设备读取MBR中前个446字节的Bootloader寻找GRUB,接着读取MBR后的扇区来识别磁盘分区表DPT以及内核Kernel所在的区域,最后启动GRUB。        


4.引导加载器GRUB(GRand Uniform Bootloader)

第1阶段(stage 1)

读取磁盘设备上第0头0道第1扇区的MBR;用来加载第2阶段, 只存放了Bootloader的部分代码

第1.5阶段(stage 1.5)

读取MBR之后的扇区,让第1阶段中的Bootloader能够识别到第2阶段所在分区上的文件系统

第2阶段(stage 2)

找到grub的配置文件(/boot/grub/grub.conf <-- /etc/grub.conf或/boot/grub2/grub.cfg),并根据其中的预设内容给用户提供一个可选择的菜单,用于选择想要启动的系统或内核版本。同时stage2即/boot/目录下还提供了Linux系统内核文件(vmlinuz文件)和虚拟文件系统文件(initramfs)等其它核心文件。

最后,GRUB把用户选定的启动系统或内核装载到内存中的特定空间中解压、展开,并把系统控制权移交给内核Kernel。


5.加载Kernel

自身初始化        

探测可识别到的所有硬件设备;

加载硬件驱动程序(有可能会借助于ramdisk加载驱动);

以只读方式挂载根文件系统rootfs;

切换至根文件系统switchroot;

运行用户空间的第一个应用程序:/sbin/init

至此,内核初始化完成,后续任务交给用户空间程序,只在模式切换或系统发生中断时,内核才会参与。


6.初始化init

/sbin/init最主要的功能就是准备系统运行环境,包括系统的主机名称、网络配置、语系处理、文件系统格式及其他服务的启动等


init程序的类型:

CentOS 5:SysV init

配置文件:/etc/inittab


CentOS 6:Upstart init

配置文件:/etc/inittab, /etc/init/*.conf


CentOS 7:Systemd systemd

配置文件:/usr/lib/systemd/system, /etc/systemd/system


7.配置文件/etc/inittab,设置默认运行级别

运行级别:为了系统的运行或维护等应用目的而设定;

0-6:7个级别

0:关机

1:单用户模式(root, 无须登录), single, 维护模式;

2: 多用户模式,会启动网络功能,但不会启动NFS;维护模式;

3:多用户模式,正常模式;文本界面;

4:预留级别;可同3级别;

5:多用户模式,正常模式;图形界面;

6:重启


8.配置文件/etc/rc.d/rc.sysinit,运行系统初始化脚本,完成系统初始化

(1) 设置主机名;    

(2) 设置欢迎信息;    

(3) 激活udev和selinux;     

(4) 挂载/etc/fstab文件中定义的文件系统;    

(5) 检测根文件系统,并以读写方式重新挂载根文件系统;    

(6) 设置系统时钟;    

(7) 激活swap设备;    

(8) 根据/etc/sysctl.conf文件设置内核参数;    

(9) 激活lvm及software raid设备;    

(10) 加载额外设备的驱动程序;    

(11) 清理操作;

    

9.对应脚本程序,关闭需要关闭的服务,启动需要启动服务 

根据运行级别的不同,系统会运行/etc/rc.d/rc0.d到/etc/rc.d/rc6.d中的响应的脚本程序,来完成相应服务的关闭和启动,并执行用户自定义开机启动程序脚本/etc/rc.d/rc.local。


10.配置文件/sbin/mingetty,设置启动终端

mingetty会调用/etc/login程序,登入成功后,整个系统启动流程完成。