在我们使用Linux操作系统的时候,只要按下电源键,就会出现一些乱七八糟的代码,过一会就会出现登陆界面,那么在这期间系统自己都做了什么?现在就说一下在这这段时间系统做了些什么。

    系统初始化流程:                                        POST-->Bootsequence(BIOS)-->Bootloader(MBR)-->Kernel(ramdisk)-->rootfs(readonly)-->/sbin/init()/sbin/init

     第一步:加电自检(POST·)

   系统通电之后,进行硬件自检,是在电脑CPU的控制下,将RAM芯片中的某个程序映射到ROM地址空间,并完成其中的指令检查硬件是否健康。例如CPU设备,网卡,声卡等设备是否完好。当检查完成后,硬件和基本硬件都没有问题,则开始启动BIOS。

    第二步:引导启动 Bootsequence(BIOS)

    系统加电自检过程结束后,系统的控制权就转交Bootloader。Bootloader存储于硬盘上,这个时候机器不能获取外部的存储或者网络信息,譬如日期,时间等一些重要的参数都是从CMOS中获取的。说到了CMOS,那么什么是CMOS呢?CMOS全称是Complementary Metal-Oxide Semiconductor(本意是指互补金属氧化物半导体存储嚣,是一种大规模应用于集成电路芯片制造的原料)是微机主板上的一块可读写的RAM芯片, 主要用来保存当前系统的硬件配置和操作人员对某些参数的设定。硬盘也必须格式成某种格式的文件系统才能在操作系统下存储东西,那么,引导程序想要加载硬盘上的操作系统就必须有支持这个文件系统格式的驱动才行,遗憾的是区区446K的空间并不能做到,因此在MBR随后的扇区中 会有这个驱动程序,就会去第二段64位字节中去寻找这个驱动,而剩下的两个字节就是校验字节,若返回值为55AA,则有效。在Linux中通常在/boot/vmlinuz-版本-发型号,然后内核就被解压加载到内存中了。

    第三步:加载kernel

    将内核导入后,系统进入自身初始化的环节,首先会探测可识别的所有硬件设备,然后就要加载硬件驱动程序(可能会借助randisk),接下来会以只读的方式挂载根文件系统,最后会运行用户空间的第一个程序(/sbin/init)

            init程序在目前centos各发行版的类别又不一样。

            在centos5上:Sysv init

                配置文件:/etc/initab

            在centos6上:Upstart

                配置文件:/etc/initab    /etc/init/*.conf

            在centos7上:systemd

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

        randisk又是什么呢

            其是linux内核的特性之一:使用缓存来加速对磁盘上的文件访问

            centos5:initrd    工具程序:mkinitrd

            centos6、7:initramfs    工程程序:dracut,mkinitrd

    第四步:引导加载器(GRUB加载)

    对于grub,它包含了文件系统的知识。他能从ext2或ext3文件系统中加载linux内核。一旦bootloader完成启动加载器阶段,并能找到引导程序的位置,第一段启动加载引导程序到内存中开始第二段。GRUB引导加载器阶段通过将本来两段的bootloader转换成三个阶段的bootloader。

    stage1:BIOS加载mbr里面的GRUB,因为只有446个字节,不能实现太多的功能,所以就要加载滴1.5个阶段的文件。

    stage1.5:加载识别文件系统的程序,来识别文件系统,不加载就无法识别文件系统,找不到boot,就不能把boot分区设置成LVM。

    stage2:开始寻找内核并启动内核

    第四步:加载kernel

    geub把内核加载到内存后运行,内核一般都是压缩的,首先就要解压。内核加载到内存的时候,文件系统还不能使用,他使用的是Bootloader加载进内存时的initramfs。系统将解压后的内核放置在内存中,调用函数来启动一系列的初始化以及各种设备。

    第五步:读取initrd/etc/inittab配置文件

    配置文件/etc/inittab

        每一行定义一种action以及与之对象的process

            id:一个任务的标识符

            runlevel:在那些级别启动此服务

            action:在什么条件下启动此任务

            process:任务

        action:    

            wait:等待切换至此任务所在的级别时执行一次

            respawn:一旦此任务终止,就自动重新启动之

            initdefault:设定默认运行级别,此时,process省略

            sysinit:设定系统初始化方式,此处一般指定/etc/rc.d/rc.sysinit脚本

        K*:要停止的服务:K##,优先级,数字越小,越是优先关闭;依赖的服务先关闭,而后关闭被依赖的

        S*:要启动的服务:S##,优先级,数字越小,越是优先启动;被依赖的服务先启动,而依赖的服务后启动


        chkconfig:管控/etc/init.d/每个服务脚本在各个级别下的启动或关闭状态

            查看:chkconfig --list name

            添加:chkconfig --add name

            删除:chkconfig --del name 

            修改指定的连接类型:

                chkconfig [--level levels] name <on|off|restat>

                    --level levels:指要控制的级别:默认为2345

    在内核加载完后,启动的第一个进程是/sbin/init,init进程会读取/etc/initab,这个进程最主要的功能是准备软件环境,所有的动作都在/etc/initab中配置,执行initab来设定系统的运行默认级别,并用init #来改变系统默认级别。

    系统的级别:0--7

        0:关机,shutdown   

        1:单用户模式。root用户,无需认证,维护模式

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

        3:多用户模式:完全功能模式,文本界面

        4:预留级别:目前无特别使用目的,但习惯以三级别使用

        5:多用户模式:完全功能模式,图形界面

        6:重启:reboot

    第六步:启动系统服务/etc/rc.d/rc/sysinit

        

    执行/etc/rc.d/rc/sysinit的初始化会做很多的设置:

        1:设置主机名

        2:设置欢迎信息

        3:激活udev和selinux

        4:挂载/etc/fstab文件中定义的所有文件系统

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

        6:设置系统时钟

        7:根据/etc/sysctl.conf文件设置内核参数

        8:激活LVM和软RAID设备

        9:激活swap设备

        10:加载额外设备的驱动程序

        11:清理操作

    

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