centos(RHEL)系列操作系统的启动流程:Intel x86兼容架构;


  Linux的系统组成:内核 + 应用程序  GUN/Linux:单纯的指Linux内核;


  从硬盘存储和启动操作系统的角度:


    Linux的系统组成:内核 + 根文件系统(rootfs)


    内核功能:进程管理,文件系统管理,内存管理,网络协议,驱动程序,安全功能,...


    Linux系统的系统运行环境可以分为两部分;

      内和空间:内核代码(系统调用)

        就是内核进程占用的CPU和内存资源的总和;

      用户空间:应用程序(进程或线程)

        就是各种存储于文件系统中的应用程序,在发起为进程或线程之后,占据的CPU和内存资源的总和;


  操作系统内核的设计流派:

    单内核设计:

      所有的功能全部集中于同一个程序;运行时表现为一个进程;

      Linux就是单内核设计


      Linux,我们不需要他成为最先进的,我们只是要使用它;


    微内核设计: 

      每种功能使用一个单独的子系统来实现;

      Windows,Solaris都是微内核审计


  Linux内核的特点:

    单内核 + 模块化:内核之中的功能更 + 各种模块提供的功能之和;

    为了能够提高工作效率,会为速度比较慢的iO设备提供缓冲和缓存;


  Linux内核的组成部分:

    内核核心文件:

      /boot/vmlinuz-VERSION-release

    centos5:

      /boot/vmlinuz-2.6.18-398.el5

    centos6:

      /boot/vmlinuz-2.6.32-573.el6.x86_64

    centos7:

      /boot/vmlinuz-3.10.0-327.el7.x86_64

 

    最新的内核版本:4.13-rc1


    内核模块文件:

      /lib/modules/KERNEL_VERSION/kernerl/


    ramdisk:

      centos 5:

        /boot/initrd-2.6.18-398.el5.img

      centos 6/7:

        /boot/initramfs-2.6.32-573.el6.x86_64

        /boot/initramfs-3.10.0-327.el7.x86_64.img     


    centos 5/6:

      生成ramdisk的工具:mkinitrd

    centos 7:

      生成ramdisk的工具:dracut mkinitrd


      rd和ramfs:

        ramdisk:双缓冲和双缓存;

        ramfs:提高效率,避免双缓冲和双缓存;



centos系列操作系统的启动流程(2)

  基于x86架构兼容平台研究系统启动流程;


  1.post:power-on self test,加电自检;

    ROM:read-only memory,只读存储器;

      CMOS:BIOS,basic input and output system,基本输出输出系统;


    X76架构的CPU可以线性寻址的物理孔村空间:ROM + RAM


  2.bootsequence:启动顺序;

    作用:决定到何种硬件设备上加载操作系统;

    方式;按照指定的次序查找各个引导设备,第一个被找出有引导程序的设备即为本次启动要用到的设备;


      BootLoader:引导加载器,程序;


        MBT:

          master(main)boot recorn:

            0磁道0扇区:

              446byte:BootLoader

              64byte:fat,file allocation table;

              2byte:magic-number,55AA,表示MBR有效;

        GPT:


      Windows:NTLDR

      Linux:

        Lilo:Linux loader,有缺陷,不能支持大硬盘;不超过1024柱面;

        grub:grand uniform BootLoader,全球统一引导加载器;

          centos 6-:

            grub 0.x:grub legacy


          centos 7:

            grub 1.x:grub2


        grub提供的功能:

          1.为用户提供一个菜单,菜单中列举的是各个可以启动的操作系统内核;

          2.可以将用户选定的内核核心文件装载到RAM中,解压缩并展开,将系统控制权移交给内核;

          3.交互式的命令行接口;

          4.菜单及内核启动的安全保障;


  3.内核的启动:

    自身初始化:

      1.探测能够识别到的所有的硬件设备;

      2.加载硬件的驱动程序,有可能会借助于ramdisk加载驱动;

      3.以只读的方式挂载根文件系统;

      4.运行用户空间的第一个应用程序:/sbin/init


  4.init:

    init程序的类型:

      centos 5:sysV init

        配置文件:

          /etc/inittab


      centos 6:upstart init

        配置文件:

          /etc/inittab(几乎被废弃);

          /etc/init/*.conf


      centos 7:systemd

        配置文件:

          /usr/lib/systemd/system/*

          /etc/systemd/system/*0


小结:

  系统初始化流程(内核级别)

    post --> bootsequence(BIOS)--> BootLoader(MBR)--> kernel(内核核心文件,只能放置在基本分区上)--> 

    [ramdisk] --> rootfs(read-only)--> /sbin/init


centos 5的sysV init的工作过程;

  centos 5 sysV init:

    运行级别(run level):为了系统的运行或维护等目的而设置的管理机制;

      0-6:七个运行级别;

        # 0 - 关机,halt,shutdown;

        # 1 - 单用户模式(single user mode),root,无需验证;维护模式;

        # 2 - 多用户模式(multiuser),会启动网络功能;但是不会启动NFS,维护模式;

        # 3 - 多用户模式(full multiuser mode),完全的功能模式,仅使用CLI,不激活GUI;

        # 4 - 预留级别,目前无特别使用的目录;但是习惯上认为与3运行级别相同;

        # 5 - 多用户模式(full multiuser mode),完全的功能模式,默认激活GUI和CLI,默认使用的是GUI;

        # 6 - 重启,reboot


      通常会使用3,5运行级别作为此次系统启动的默认运行级别;

    查看当前系统的运行级别;

      who -r

      runlevel


    切换运行级别:

      init [0-6]


    init的配置文件:/etc/inittab,此配置文件有如下功能:

      1.在整个系统初始化的过程中要做那些任务;

        启动或关闭哪些后台服务;

        如何进行系统初始化;

        在验证用户的身份无误之后,如何为用户提供登录提示符,还要区分是图形界面还是文件界面;

        当备用电源失效或重新生效时,如何指挥系统操作;

        定义了按下“Ctrl + Alt + delete”组合键时,系统将采取什么行为;


      2.所有规定的任务如何执行;

        每一行定义一种操作,格式如下:

          id:runlevels:action:process


          id:一种操作的唯一标识符;

            l#,id,pf,pr,#,x,


          runlevel:指定任务执行所依赖的运行级别;

            ####,#,留空,


          action:在何种条件下启动此任务;

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

            respawn:一旦此任务结束,就自动重新启动此任务;

            initdefault:用于设定默认的运行级别,通常后面的process省略

            sysinit:设置系统初始化的方式,一般情况下此处运行/etc/rc.d/rc.sysinit脚本;

            powerfail:

            powerokwait:

            ctrlaltdel:


          /etc/rc.d/rc.sysinit:

            1.设置主机名称;

            2.设置启动的欢迎信息;

            3.激活udev和selinux;

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

            5.激活各个swap设备;

            6.检测rootfs,并且以读写的方式重新挂载rootfs;

            7.设置系统时间;

            8.根据/etc/sysctl.conf文件设置内核参数;

            9.激活lvm和软raid等高级逻辑设备;

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

            11.完成清理工作;


          /etc/rc.d/rc:

            根据特定的运行级别,启动或关闭/etc/rc.d/rc$runlevel.d/*

              K*:要停止的服务;K后面的两位数字表示优先级;数字越小优先级越高;依赖其他服务的服务应该优先关闭,被其他服务依赖的服务应该稍后关闭;


              S*:要启动的服务;S后面的两位数字表示优先级;数字越小优先级越高;被其他服务依赖的服务应该优先开启,依赖其他服务的服务应该稍后开启;


            rc脚本实际上可以接收一个运行级别作为其参数运行内容的;


            脚本框架:

              for i in /etc/rc.d/rc#.d/K* ; do

                $i stop

              done


              for i in /etc/rc.d/rc#.d/S* ; do

                $i start

              done             


  mkinitrd:建立要载入ramdisk的映像文件,以供Linux开机时载入ramdisk。

    选项:

      -f:若指定的映像问家名称与现有文件重复,则覆盖现有的文件; 

      -v:执行时显示详细的信息; 

      --omit-scsi-modules:不要载入SCSI模块; 

      --preload=<模块名称>:指定要载入的模块; 

      --with=<模块名称>:指定要载入的模块; 

      --version:显示版本信息。

    例子:

      mkinitrd -v -f myinitrd.img $(uname -r)


  dracut:建立要载入ramdisk的映像文件,以供Linux开机时载入ramdisk。

    例子:

      dracut /boot/initramfs-$(uname -r).img $(uname -r)