简述CentOS系统启动流程

简述CentOS系统启动流程

1 CentOS6系统启动过程

1.硬件启动流程

a.打开电源
b.BIOS自检
	1)POST自检:初始化硬件设备,检测系统外围设备(CPU、内存、硬盘、IO设备等)
	2)BIOS检测:根据BIOS设置的启动顺序逐一排查。如果是硬盘启动,读取硬盘的MBR的BootLoader。
c.读取MBR信息
	1)MBR(Main Boot Record),是硬盘的0柱面,0磁道、1扇区(第一个扇区),称为主引导扇区,也称为主引导记录。
        它由三部分组成:主引导程序(BootLoader)、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。注:硬盘默认一个扇区大小为512字节。
		第一部分,主引导程序(BootLoader)占446个字节,负责从活动分区中装载,并运行系统引导程序。
		第二部分,硬盘分区表DPT占64个字节,有4个分区表项,每个分区表项占16个字节,硬盘中分区有多少以及每一个分区的大小都记录在其中。
		第三部分,硬盘有效标志,占2个字节,固定为55AA。如果这个标志位0xAA55,就认为这个是MBR。
	2)BootLoader主引导程序。Linux一般使用的是grub(也叫grub legacy)和grub2。
        CentOS6一般使用的是grub。GRUB(GRand Unified Bootloader)是一个来自GNU项目的多操作系统启动程序。

2.GRUB启动引导阶段

GRUB程序加载执行并引导kernel(内核)程序,其中有三个阶段。grub引导阶段的文件都在/boot/grub/目录下。
a.Stage1阶段:执行系统安装时预先写入到MBR的Bootloader程序。它的任务仅是读取(加载)硬盘的0柱面,0磁道,
2扇区的内容(/boot/grub/stage1)并执行。
b.Stage1.5阶段:Stage1阶段和Stage2阶段的桥梁,具有识别分区文件系统的能力,此后grub程序便有能力去访问/boot/grub/stage2,
并将其读取到内存执行。
c.Stage2阶段:解析grub的配置文件/boot/grub/grub.cnf,根据配置文件加载内核镜像到内存中,通过initrd
程序建立虚拟根文件系统,最后转交内核。

3.内核引导阶段

通过内存中的虚拟根文件系统,加载驱动,然后切换到真正的根文件系统,并执行/sbin/init程序。
    a.调用虚拟文件系统init程序
    b.加载驱动模块初始化设备并做相关配置,包括CPU、磁盘、IO设备等,是内核能够识别并加载到/的桥梁。
    c.加载并切换到真正的文件系统(grub.conf中的root=所指定的)。
    d.协助内核调用/sbin/init程序。

4.系统初始化阶段(init初始化阶段)

/sbin/init程序会读取/etc/inittab文件确认运行级别,然后执行/etc/rc.d/rc脚本,根据确认的运行
级别启动对应/etc/rc.d/rc#.d/目录下的服务(#为0~6),与此同时执行系统初始化脚本/etc/rc.sysinit(软链接,
指向/etc/rc.d/rc.sysinit),还会加载/etc/rc.local(软链接,指向/etc/rc.d/rc.local)用户自定义服务。
    a./sbin/init程序读取/etc/inittab文件
    b.执行系统初始化脚本/etc/rc.sysinit
	c.加载服务
	1)根据运行级别启动对应/etc/rc.d/rc#.d/目录下的服务(文件其实都是软链接,
     指向的都是/etc/rc.d/init.d/目录下的文件)主要设置主机名、开机自启动ssh服务、自动挂载、IP地址、定时任务、邮件服务等。
	2)加载用户自定义服务/etc/rc.local

5.启动终端

默认情况下执行/sbin/mingetty打开6个纯文本终端,验证并登录。如果是5,则加载图形界面。
	a.验证登录
        1./etc/nologin用户在该文件中则不允许登录
        2./etc/usertty对文件做出访问限制
        3./etc/securetty登记的终端才能登陆
        4./etc/passwd & /etc/shadow验证密码以及设置用户主目录、使用何种shell
	b.登陆成功
	1.屏幕输出	
            /var/log/lastlog输出最近一次登录信息
            /var/spoon/mail检查用户是否有新邮件
	2.加载环境变量
            /etc/profile
            ~/.bash_profile
            ~/.bashrc
            /etc/bashrc
            ~/.bash_login

简化版:

1.开机BIOS自检 
2.MBR引导 
3.GRUB引导菜单 
4.加载内核 
5.运行/sbin/init进程 
6.读取/etc/inittab配置文件,执行/etc/rc.d/rc.sysinit、/etc/rc.d/rc脚本
7.执行/etc/rc.d/rc3.d脚本服务
8.执行/etc/rc.local用户自定义服务
9.启动mingetty 进程 

2 CentOS7系统启动过程

1.硬件启动该流程

说明:和CentOS6硬件启动流程差不多。
a.Power On
b.BIOS检测
	1.POST检测
	2.查找启动介质:CDROM、USB、HDD
	查找硬盘启动的0柱面,0磁道,1扇区,也就是BootLoader,定位后MBR 即被装载到RAM(内存空间)中,BIOS将控制权转交MBR。
c.读取MBR
	1.第一部分:446Bytes,BootLoader,其实是安装grub2的boot.img
	2.第二部分:64Bytes,Partition Table
	3.第三部分:2Bytes,硬盘有效标志

2.GRUB2引导阶段

显示加载两个镜像,再加载MOD模块文件,把grub2程序加载执行,接着解析配置文件/boot/grub/grub.cfg,
根据配置文件加载内核镜像到内存,之后构建虚拟根文件系统,最后转到内核。
	a.Boot.img:系统启动时装载Core.img
	b.Core.img:grub2核心映像文件
	c.*.mod:动态加载的模块	
	d.解析grub.cfg配置文件

3.内核引导阶段

CentOS6也差不多,加载驱动,切换到真正的根文件系统,唯一不同的是执行的初始化程序变成/usr/lib/systemd/systemd
	a./boot/vmlinuz*
	    Linux内核映像及内核参数传递
	b./boot/initramfs*
	    1.在RAM中释放供内核使用的根文件系统boot/initramfs
	    2.挂载真正的文件系统并执行/usr/lib/systemd/systemd
	c.内核初始化

4.系统初始化阶段/systemd初始化阶段

启动/usr/lib/systemd/systemd进程。
	a.systemd执行默认target配置文件/etc/systemd/system/default.target
	b.systemd执行sysinit.target来初始化系统和basic.target来准备操作系统
	c.systemd启动multi-user.target下的本机与服务器服务
	d.systemd执行multi-user.target下的/etc/rc.d/rc.local用户自定义脚本
	e.Systemd执行multi-user.target下的getty.target及登录服务

5.启动终端

如果有图形化界面,systemd执行graphical需要的服务。

简化版(6-10并行执行):

1.开机BIOS自检 
2.MBR引导 
3.GRUB引导菜单 
4.加载内核 
5.运行/usr/lib/systemd/systemd进程
6.systemd执行默认target配置文件/etc/systemd/system/default.target
7.systemd执行sysinit.target来初始化系统和basic.target来准备操作系统
8.systemd启动multi-user.target下的本机与服务器服务
9.systemd执行multi-user.target下的/etc/rc.d/rc.local用户自定义脚本
10.Systemd执行multi-user.target下的getty.target及登录服务

3 参考博客

Linux系统启动流程