• Linux启动流程分析


    目录

    一、Linux启动流程图

    二、硬件启动流程

    2.1、POST

    2.2、BIOS

    2.3、MBR

    三、GRUB

    3.1、Stage1阶段

    3.2、Stage1.5阶段

    3.3、Stage2阶段

    四、内核Kernel引导阶段

    五、系统初始化阶段

    5.1、init进程/程序

    5.2、设定Inittab运行等级

    5.3、加载rc.sysinit

    5.4、加载内核模块

    5.5、启动运行级别程序

    5.6、读取rc.local文件

    5.7、执行/bin/login程序


    一、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的时候了,你已经可以用自己的帐号登入系统了。

  • 相关阅读:
    MySQL锁杂谈
    七夕趣味玩法,用 MMGeneration 生成心仪的 TA
    用键盘传输小数据,破除解决多层远程访问或防火墙限制不能粘贴复制的问题
    leetcode每天5题-Day50
    eladmin代码生成详细过程
    golang数据结构与算法——递归、迷宫回溯和二叉树的遍历
    day15-Servlet04
    Java设计模式之备忘录模式
    Netty源码学习9——从Timer到ScheduledThreadPoolExecutor到HashedWheelTimer
    【初识Linux】:背景介绍以及环境搭建
  • 原文地址:https://blog.csdn.net/code_lyb/article/details/128048445