Linux基础之系统启动流程

操作系统启动过程

操作系统启动过程简单分为四部分,从BIOS自检、系统引导、启动内核、初始化系统。其中每个部分又分为多个自部分,操作系统的建立是一个相对比较复杂的事情。

Linux内核是从入口点开始执行的,入口点程序又称为初始化程序,其任务是为Linux操作系统的运行做好必要的准备,如将内核镜像(bzimage)在物理地址展开、获取计算机组成部分的配置参数、建立各种管理用的数据结构、启动各类守护进程、建立人机交互环境等。

Linux内核是一个驻留在外存中的程序,在运行前必须先将其读入物理内存。将Linux内核读入内存的工作成为引导,完成引导的程序被称为引导程序。引导也是在外存中的程序,所以在运行之前需要将其读入内存。讲引导读入内存的工作由BIOS(basic input output system)完成。BIOS驻留在非易失存储器中,不需要引导。

引导程序在linux内核读入后,将控制权交给内核头部的实模式初始化程序(main.c),在实模式下完成初始化工作,再将处理器切换到保护模式,而后转入解压程序。解压程序将内核镜像解压到物理地址中,然后把处理器的控制权交给内核首部程序。内核首部程序正式完成内核初始化。

每个过程都执行了自己该做的初始化部分的事情,有些过程又可分为好几个子过程。

CentOS 6 启动流程

Linux基础之系统启动流程

  第一步、硬件启动阶段

Linux基础之系统启动流程

  简单说一下这一步的流程:打开电源;POST自检;BIOS逐一排查设备启动顺序;如果是硬盘启动,读取硬盘的MBR的BootLoader。(这里默认MBR分区,暂不考虑GPT分区)

  这里主要有三个需要了解的地方BIOS启动顺序、MBR和BootLoader。

(1).MBR

  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

  不同的系统有不同的主引导程序(BootLoader)。Windows使用的是NTLDR(NT Loader,Windows NT系列操作系统)、Bootmgr(Boot Manager,Windows Vista,7,8,10),Linux一般使用的是grub(也叫grub legacy)和grub2。

  CentOS6一般使用的是grub。GRUB(GRand Unified Bootloader)是一个来自GNU项目的多操作系统启动程序。

第二步、GRUB引导阶段

Linux基础之系统启动流程

  简单说一下这一步的流程:GRUB程序加载执行并引导kernel(内核)程序,其中有三个阶段。

  grub引导阶段的文件都在/boot/grub/目录下

Linux基础之系统启动流程

(1).Stage1阶段

  这一阶段其实执行的就是系统安装时预先写入到MBR的Bootloader程序。它的任务仅是读取(加载)硬盘的0柱面,0磁道,2扇区的内容(/boot/grub/stage1)并执行。

  这一阶段,使硬件初始化,为Stage2准备RAM空间(内存空间),读取Stage2到RAM空间(应该涉及到了Stage1.5阶段)。就是Stage1.5阶段或Stage2阶段的入口,引导进入Stage1.5阶段或Stage2阶段。

  另外,这一阶段并没有识别文件系统的能力。  

(2).Stage1.5阶段

  这一阶段是Stage1阶段和Stage2阶段的桥梁,具有识别分区文件系统的能力,此后grub程序便有能力去访问/boot/grub/stage2,并将其读取到内存执行。

(3).Stage2阶段

  这一阶段会(初始化本阶段需要用到的硬件,检测系统的内存映像,)解析grub的配置文件/boot/grub/grub.conf,根据配置文件加载内核镜像到内存中,通过initrd程序建立虚拟根文件系统,最后调用(转交)内核

Linux基础之系统启动流程

第三步、内核引导阶段

Linux基础之系统启动流程

  简单说一下这一步的流程:通过内存中的虚拟根文件系统,加载驱动,然后切换到真正的根文件系统,并执行/sbin/init程序。

第四步、init初始化阶段(又叫系统初始化阶段)

Linux基础之系统启动流程

  简单说一下这一步的流程:/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文件)用户自定义服务(脚本)。

  /etc/rc.d/目录下的文件几乎在上一次都有相应的软链接(也就是/etc/目录下),唯一没有的/etc/rc.d/init.d/目录又似乎与/etc/init.d/目录完全相同

Linux基础之系统启动流程

(1)./etc/inittab文件

Linux基础之系统启动流程

  这里的数字 3 代表启动级别是 3 

  启动级别:

    0  关机 

    1  单用户模式、维护模式、急救模式

    2  没有网络的多用户模式

    3  完整的多用户模式

    4  预留级别,暂时没用,不用考虑

    5  图形界面,XWindows

    6  重启

(2)./etc/rc.d/rc#.d/目录

  在启动时执行的/etc/rc.d/rc脚本,会调用/etc/rc.d/rc#.d/目录下的文件

Linux基础之系统启动流程

  K开头的文件:要停止的服务(脚本),从01开始关闭,数字越小优先级越高

  S开头的文件:要启动的服务(脚本),从01开始启动,数字越小优先级越高

Linux基础之系统启动流程

 第五步、启动终端

Linux基础之系统启动流程

  最后一步就是用户登录。

Centos 7 启动流程

Linux基础之系统启动流程

第一步、硬件启动阶段

  这一步和CentOS6差不多。

第二步、GRUB2引导阶段

  从这一步开始,CentOS6和CentOS7的启动流程区别开始展现出来了。CentOS7的主引导程序使用的是grub2。

Linux基础之系统启动流程

  简单说一下这一步的流程:显示加载两个镜像,再加载MOD模块文件,把grub2程序加载执行,接着解析配置文件/boot/grub/grub.cfg,根据配置文件加载内核镜像到内存,之后构建虚拟根文件系统,最后转到内核。

  在这里grub.cfg配置文件已经比较复杂了,但并不用担心,到了CentOS7中一般是使用命令进行配置,而不直接去修改配置文件了。

Linux基础之系统启动流程

  一般修改好配置后都需要使用命令grub2-mkconfig -o /boot/grub2/grub.cfg,将配置文件重新生成。这里就涉及到/etc/default/grub文件以及/etc/grub.d/目录。

第三步、内核引导阶段

  这一步与CentOS6也差不多,加载驱动,切换到真正的根文件系统,唯一不同的是执行的初始化程序变成了/usr/lib/systemd/systemd

第四步、systemed初始化阶段(又叫系统初始化阶段)

  CentOS7中我们的初始化进程变为了systemd。执行默认target配置文件/etc/systemd/system/default.target(这是一个软链接,与默认运行级别有关)。然后执行sysinit.target来初始化系统和basic.target来准备操作系统。接着启动multi-user.target下的本机与服务器服务,并检查/etc/rc.d/rc.local文件是否有用户自定义脚本需要启动。最后执行multi-user下的getty.target及登录服务,检查default.target是否有其他的服务需要启动。

  注意:/etc/systemd/system/default.target指向了/lib/systemd/system/目录下的graphical.target或multiuser.target。而graphical.target依赖multiuser.target,multiuser.target依赖basic.target,basic.target依赖sysinit.target,所以倒过来执行。

  System概述(了解):systemd即为system daemon,是Linux下的一种init软件,开发目标是提供更优秀的框架以表示系统服务间的以来关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell系统开销的效果,最终代替现在常用的System V与BSD风格的init程序。

  与多数发行版使用的System V风格的init相比,systemd采用了以下的新技术:A.采用Socket**式与总线**式服务,以提高相互依赖的各服务的并行运行性能;B.用Cgroup代替PID来追踪进程,即使是两次fork之后生成的守护进程也不会脱离systemd的控制。

  unit对象:unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其他与init相关的信息。(也就是CentOS6中的服务器启动脚本)

(1)./etc/systemd/system/default.target

  这是一个软链接,和默认运行级别相关

Linux基础之系统启动流程

  我们可以到这个目录下看看

Linux基础之系统启动流程

  这里可以看到runlevel开头的target文件,对应着CentOS6的启动级别,不过一样是软链接,指向了同目录下的其他文件,也算一种向下兼容吧

Linux基础之系统启动流程

 (2)./usr/lib/systemd/system/

  这个目录存储每个服务的脚本,类似CentOS6的/etc/init.d/。

Linux基础之系统启动流程

(2)./run/systemd/system/

  系统执行过程中产生的脚本。

(3)./etc/systemd/system/

  类似于CentOS6的/etc/rc.d/rc#.d/SXX类文件的功能,管理员建立的执行脚本,大部分是软链接。

Linux基础之系统启动流程