流程图:

   系统初始化流程:

POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init 

  用户空间初始化流程:

 /sbin/init [/etc/inittab或/etc/init/*.conf]--> /etc/rc.d/rc.sysinit --> /etc/rc.d/rc0-9.d --> /etc/rc.local

 设置默认运行级别 --> 运行系统初始化脚本,完成系统初始化 --> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务 --> 设置登录终端 --> 启动图形终端


概述启动流程:

    一:post加电自检,将BIOS映射进CPU可以查找的线性地址空间,使得cpu可以读取主板上rom设备中的BIOS程序,通过rom加载内存(ram)并检查当前设备硬件是否存在

    二:BootSequence按次序查找各引导设备,根据BIOS中设置的启动次序去加载对应设备的MBR

    三:bootloader根据MBR的分区表,查找操作系统所在的分区,并通过grub加载操作系统的内核,此时将内核装载入内存,在内存中解压缩

    四:kernel进行自身初始化,探测可识别的硬件设备,并借助ramdisk加载boot目录下的initrd或initramfs文件中装载驱动模块(ramdisk中包含着initrd或initramfs)

    五:以只读方式挂载根文件系统

    六:运行/etc/inittab中的程序设定默认运行级别

    七:运行/etc/rc.d/rc.sysinit系统初始化脚本

    八:运行/etc/rc.d/rc0-9.d 关闭或启动对应级别下的服务

    九:运行/etc/rc.local系统初始化完成以后,程序自动加载的最后一个脚本

详细剖析:

    一:POST加电自检将BIOS映射进CPU可以查找的线性地址空间,使得cpu可以读取主板上rom设备中的程序BIOS,通过rom加载内存(ram)并检查当前设备硬件是否存在

  二:BootSequence按次序查找各引导设备,根据BIOS中设置的启动次序去加载对应设备的MBR

            MBR:Master Boot Record (512bytes)

            446bytes:存放bootloader

            64bytes:存放分区表

            2byte:判断MBR是否有效的标识55AA为有效

       CentOS 启动流程_第1张图片

  三: bootloader:引导加载器,程序 

            提供一个菜单,允许用户选择要启动的系统或不同的内核版本; 把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核;

            (1)Windows上引导加载器:ntloader

            (2)Linux上引导加载器

                   LILO:古老linux加载器,1024柱面之后无法加载,继而被grub所取代,现在多用于安卓手机启动

                   grub:提供一个菜单,允许用户选择要启动的系统或不同的内核版本, 把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核;

                        stage1:grub第一阶段存在MBR中,用于引导stage2

                        stage1_5:在MBR之后的扇区中,识别常见的不同的文件系统的

                        stage2:位于/boot/grub目录下,配置文件是/etc/grub.conf,功用:向上看

                                         

四:内核初始化:

    当stage2被载入系统执行时,它首先会去解析grub的配置文件/boot/grub/grub.conf,然后加载内核镜像到内存中,并将控制权转交给内核,内核会立即初始化系统中各设备并做相关的配置工作,其中包括CPU、I/O、存储设备等,并且以读写的方式挂载根文件系统,此时涉及到一个"先有鸡还是先有蛋的问题"

     要想访问根文件系统(rootfs),首先就得加载根文件系统中的驱动程序,而加载驱动程序需要先挂载根文件系统。为了解决这个问题:Linux设备驱动程序的加载,有一部分驱动程序直接被编译进内核镜像中,另一部分则是以模块的形式存放在initrd(ramdisk)中。内核启动被分成了两个阶段,第一阶段先执行initrd文件系统中的init,完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的/sbin/init进程


五:/etc/inittab:设定默认运行级别

    init程序在不同CentOS版本上的类型:

      CentOS-5 SysV init 配置文件:/etc/inittab

      CentOS-6 Upstart   配置文件:/etc/inittab /etc/init/*.conf

      CentOS-7 Systemd   配置文件:/usr/lib/systemd/system, /etc/systemd/system/                 


六:运行系统初始化脚本,完成系统初始化

     运行/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) 清理操作;

        

七:关闭或启动对应级别下的服务/etc/rc.d/rc#.d

       0-6:7个级别;

  0:关机, shutdown

  1:单用户模式(single user),root用户,无须认证;维护模式;

  2多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式;

  3多用户模式(mutli user),完全功能模式;文本界面;

  4预留级别:目前无特别使用目的,但习惯以同3级别功能使用;

  5多用户模式(multi user), 完全功能模式,图形界面;

  6重启,reboot

    1) 默认级别:3, 5

    2) 级别切换:init #

    3) 级别查看命令:who -r   runlevel

八:运行/etc/rc.local系统初始化完成以后,程序自动加载的脚本

        系统启动最后执行的一个脚本


九:启动终端

   tty1:2345:respawn:/usr/sbin/mingetty tty1

   ... ...

   tty6:2345:respawn:/usr/sbin/mingetty tty6        

(1)mingetty会调用login程序;

(2)打开虚拟终端的程序除了mingetty之外,还有诸如getty等;