Linux启动流程分析

一、Linux启动流程图

二、硬件启动流程

2.1、POST

        Linux开机加电后,系统开始开机自检,该过程主要对计算机各种硬件设备进行检测,如CPU、内存、主板、硬盘、CMOS芯片等。主要完成检测硬件能否满足运行的基本条件,叫做“硬件自检(Power-OnSelf-Test)”,简称POST。

        如果出现致命故障则停机,并且由于初始化过程还没完成,所以不会出现任何提示信号。

        如果出现一般故障则会发出声音等提示信号,等待故障清除;若未出现故障,加电自检完成。

        当打开计算机电源,计算机会首先加载基本输入输出系统(Basic Input Output System )。BIOS程序一般被存放在主板ROM(只读存储芯片)之中、即使在关机或掉电以后该程序也不会丢失。

2.2、BIOS

        硬件自检完成后,BIOS把控制权转交给下一阶段的启动程序。这是,BIOS需要知道,“下一阶段的启动程序”具体存放在哪个设备里(磁盘,光盘,移动硬盘等)。也就是说,BIOS需要有一个外部存储设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做“启动顺序”(Boot Sequence)

        BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PNP特性等等。在此之后,计算机就知道应该去读取哪个硬件设备了。

2.3、MBR

        主引导记录(MBR,Master Boot Record)是计算机开机以后访问硬盘时所必须要读取的第一个扇区,位于硬盘的第0柱面第0磁道第一扇区,大小为512字节。

        主引导程序的任务就是查找并且加载处在硬盘分区上的次引导程序。通过分区表查找活动分区,并将处在活动分区的次引导加载程序读取到内存里面运行。

        MBR的BootLoader中安装有GRUB程序的一部分,因为BootLoader只有446Bytes,容量太小,所以只安装了GRUB中一个小的程序在里面,用于加载剩余的GRUB程序。

三、GRUB

        在Linux资料中,被俗称GRUB的就是Boot Loader,GRUB是GRand Unified Bootloader的缩写,MBR的前446字节存放的就是GRUB程序的一部分,它是一个多重操作系统启动管理器,用来引导不同系统,GRUB是目前Linux环境中最流行的启动管理器。

        GRUB程序的作用是,可以在系统中选择性地引导不同的OS,实际上就是加载引导不同的内核镜像,当内核挂载成功之后就将控制权交给内核程序。

3.1、Stage1阶段

        Stage1可以理解为已写入MBR的BootLoader中的小程序部分。因为MBR空间有限,所以MBR当中安装最小程序。其主要作用是装载Stage2,即加载剩余的GRUB程序。

3.2、Stage1.5阶段

        Stage1.5是MBR后面的分区,并不处在MBR中。它是Stage1和Stage2的桥梁,能够识别启动分区文件系统,GRUB访问/boot分区grub目录下的Stage2文件,将Stage2载入内存并执行。

3.3、Stage2阶段

        Stage2运行后,开始解析GRUB的配置文件/boot分区下/grub/grub.conf。然后显示操作系统启动菜单,加载内核镜像到内存,通过/boot/initrd开头文件建立虚拟RAM DISK虚拟内存文件系统(initrd,最后将控制权转交给内核程序。

四、内核Kernel引导阶段

        依靠Stage2阶段在内存中创建的虚拟文件系统,从中调用虚拟根文件系统中的init程序,进而加载驱动模块来初始化系统中的各设备,并做相关配置,其中包括CPU、I/O、存储设备等。

        当所需的驱动程序加载完后,会根据grub.conf配置文件中“root=XXX”部分所指定的内容创建一个根设备,然后将根文件系统以只读的方式挂载,并切换到真正的根文件系统上,同时调用系统进程的/sbin/init程序,进入系统初始化阶段。

五、系统初始化阶段

        这一步是通过/sbin/init,init程序准备软件运行环境,启动系统服务。

5.1、init进程/程序

        init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。init进程启动后查找的第1个配置文件 硬件资源是“/etc/inittab”,这个文件控制 init 的行动。一般 init 会首先指定启动等级

5.2、设定Inittab运行等级

        内核加载完毕,会启动Linux操作系统第一个守护进程init,然后通过该进程读取/etc/inittab文件,/etc/inittab文件的作用是设定Linux的运行等级,Linux常见运行级别如下:

                运行级别0(关机):系统停机状态,系统默认运行级别不能设为0,否则不能正常启动

                运行级别1(单用户root):单用户工作状态,root权限,用于系统维护,禁止远程登陆

                运行级别2:多用户状态(没有NFS)

                运行级别3(命令行):完全的多用户状态(有NFS),登陆后进入控制台命令行模式

                运行级别4(保留):系统未使用,保留

                运行级别5(图形):X11控制台,登陆后进入图形GUI模式

                运行级别6(重启):系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动。

        默认级别:3,5。

        切换级别:init #

        查看级别:runlevel ; who -r

5.3、加载rc.sysinit

        读取完运行级别,Linux系统执行的第一个用户层文件/etc/rc.d/rc.sysinit,该文件功能包括:设定PATH运行变量、设定网络配置、启动swap分区、设定/proc、系统函数、配置Selinux等。

5.4、加载内核模块

        读取/etc/modules.conf文件及/etc/modules.d目录下的文件来加载系统内核模块。该模块文件,可以后期添加或者修改及删除。

5.5、启动运行级别程序

        根据之前读取的运行级别,操作系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。其中以S开头表示系统即将启动的程序,如果以K开头,则代表停止该服务。S和K后紧跟的数字为启动顺序编号。

 

5.6、读取rc.local文件

        操作系统启动完相应服务之后,会读取执行/etc/rc.d/rc.local文件,可以将需要开机启动的任务加入到该文件末尾,系统会逐行去执行并启动相应命令。

        rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。

5.7、执行/bin/login程序

        执行/bin/login程序,启动到系统登录界面,操作系统等待用户输入用户名和密码,即可登录到Shell终端,如图所示,输入用户名、密码即可登录Linux操作系统,至此Linux操作系统完整流程启动完毕

        此时系统已经进入到了等待用户输入username和password的时候了,你已经可以用自己的帐号登入系统了。

猜你喜欢

转载自blog.csdn.net/code_lyb/article/details/128048445