CentOS系统启动流程

    Linux系统的组成部分:内核+根文件系统
        内核:进程管理、内存管理、网络协议栈、文件系统、驱动程序、安全功能
            IPC:Inter Process Communication
                消息队列、semerphor、shm(共享内存)
                socket(跨主机的通讯,套接字。)
       运行中的系统环境分两层:内核空间,用户空间。
           用户空间:运行应用程序(进程或线程)
           内核空间:运行内核代码(系统调用)---文件系统运行在内核空间。

   内核设计流派:
        单内核设计:把所有功能集成于同一个程序;
            Linux使用单内核。
        微内核设计:每种功能使用一个单独的子系统实现;
            Windows, Solaris

    Linux内核特点:
        支持模块化:可以把其中重要的和不重要的,必须的和不必须的功能,划分为一个个模块。一般叫  .ko(kernel object)
        动态装、卸载:

        模块里面是一些驱动程序。


    内核组成部分:内核我文件、模块文件。
                核心文件:/boot/vmlinuz-VERSION-release -----使用 uname -r 查看。
                ramdisk:
                    CentOS 5:/boot/initrd-VERSION-release.img----当做磁盘
                    CentOS 6,7:/boot/initramfs-VERSION-release.img---当做文件系统(避免双缓存,避免双缓冲,提高效率)
                模块文件:/lib/modules/VERSION-release ------使用 ls /lib/modules 查看。

     内核要驱动根文件系统,则要先加载根文件系统的驱动,这个驱动根文件系统的驱动叫,临时根文件系统ramdisk。


CentOS系统启动流程:
           第一步  POST :加电自检---开机时自动检查计算机的各种硬件是否存在。
           第二步  Boot Sequence:
                   按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备 叫  bootloader。  
                   bootloader:引导加载器,程序。
                    对于Linux的bootloader叫grub。
                       GRUB 0.X:Grub Legacy   CentOS 5
                            GRUB 1.X:Grub2    CentOS 6、7

                    grub功能:提供一个菜单,允许用户选择要启动的系统或不同的内核版本; 把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核;
                  MBR:Master Boot Record
                    512bytes:
                        446bytes:bootloader
                        64bytes:fat ---分区表
                        2bytes:55AA
                        
                   GRUB:
                      bootloader:1st stage
                      Partition:filesystem driver, 1.5 stage
                      Partition:/boot/grub, 2nd stage


          Kernel:
                
    第三部:加载内核
            自身初始化:
               1、探测可识别到的所有硬件设备;
               2、加载硬件驱动程序;(有可能会借助ramdisk加载驱动)
               3、以之读方式挂载跟文件系统;
               4、运行用户空间的第一个应用程序:/sbin/init
               init程序的类型:
                 CentOS 5 :SysV init   在/etc/inittab
                 CentOS 6 :Upstart     在/etc/init/*.conf
                 CentOS 7 :Systemd     在/usr/lib/systemd/system/, /etc/systemd/system/

    ramdisk的解释,以及运行级别              

             ramdisk:在装系统完成后,探测当前硬件设备机制动态创建的。
             ramdisk:把内存内的某一段空间当磁盘用,创建一个临时的跟文件系统来 启动跟文件系统。    
             Linux内核的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问。
             ramdisk--->ramfs(换成文件系统,这是一种提速机制)。
             ramdisk对于CentOS 5 、6 、7 的区别:
             CentOS 5:/boot/initrd-VERSION-release.img
                      initrd此文件是由工具创建的--mkinitrd
             CentOS 6 、7:/boot/initramfs-VERSION-release.img
                      initramfs此文件是由工具创建的---dracut
 
                      CentOS 5 : SysV init
                      运行级别---为系统的运行级别说维护等目的而设置的机制。
                      0-6:7个级别
                        0:关机
                        1:单用户模式(single user)指的是root用户,无需认证,维护模式
                        2:多用户模式(multi user)会启动网络功能,但不会启动NFS,维护模式
                        3:多用户模式(multi user)完全功能模式,只会文本界面,不会激活桌面系统。
                        4:预留模式,目前无使用目的,但习惯以同3级别功能使用
                        5:多用户模式(multi user)完全功能模式,启动图形界面(桌面系统)
                        6:重启,reboot
                   默认级别:3  5  (服务器用3,个人有5)
                   级别切换:init#
                   级别查看:who -r
                             runlevel
总结:系统初始化流程(内核级别):POST-->Boot Sequence-->bootloader(MBR)-->Kernel(ramdisk来完成跟文件系统的启动)-->rootfs(readonly)-->/bin/init


       init要运行通过 配置文件:/etc/inittab

                  (CentOS 5 )每一行定义一种action(操作)以及与之对应的process

                  id:runlevels:action:process

                  id:一个任务的标识符
                  runlevels:在哪些级别启动此任务,#,###也可为空,表示所有级别
                  action:在什么条件下启动此任务
                  process:任务
                  action:
                  wait:等待切换至此任务所在的级别时执行一次
                  respawn:此任务终止时,就自定重新启动
                  initdefault:设定默认级别,此时,process省略
                  sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本

                        例如:
                            id:3:initdefault:
                            si::sysinit:/etc/rc.d/rc.sysinit
                            
                            l0:0:wait:/etc/rc.d/rc  0

                            l1:1:wait:/etc/rc.d/rc  1
                            …………
                            l6:6:wait:/etc/rc.d/rc  6
                                意味着去启动或关闭/etc/rc.d/rc3.d/
                                k*: 要停止的服务,k##*,优先级,数字越小越先关闭,依赖服务的服务先关闭
                                s*:要开始的服务,s##*,优先级,数字越小越先启动,依赖服务的服务先启动
        rc脚本:接受一个运行级别数字为数字
            rc脚本作用:但级别切换时会用于启动或停止任务。
            脚本框架:
            for  srv  in  /etc/rc.d/rc#.d/K*; do
                    $srv  stop
            done
                                        
                for  srv  in  /etc/rc.d/rc#.d/S*; do
                    $srv  start
            done
                                        
            /etc/init.d/* (/etc/rc.d/init.d/*)所有的服务脚本所在地:
            # /etc/init.d/SRV_SCRIPT  {start|stop|restart|status}
            # service  SRV_SCRIPT   {start|stop|restart|status}

chkconfig命令:管控/etc/init.d/每个服务脚本在各级别下的启动或关闭状态;
            chkonfig  --list   查看级别的开启关闭状态。
            chkonfig  --add  name:添加
              能被添加的脚本格式:
               chkonfig:LLL  NN  NN
                LLL:正在运行的级别
                NN:启动优先级
                NN:关闭优先级
            chkonfig  --del  name:删除
            修改指定的连接类型:
              chkconfig  [--level  LEVELS]  name  <on|off|reset>
                --level LEVELS:指定要控制的级别;默认为2345;
               注意:正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d/rc.local (/etc/rc.local)脚本;因此,不便或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。

系统初始化脚本:/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) 清理操作;

总结(用户空间的启动流程):/sbin/init(/etc/inittab)
        设置默认运行级别 --> 运行系统初始化脚本,完成系统初始化 --> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务--> 设置登录终端 [--> 启动图形终端]
            CentOS     6:    
                init程序:upstart,但依然为/sbin/init,其配置文件:
                    /etc/init/*.conf, /etc/inittab(仅用于定义默认运行级别)
                    
                        注意:*.conf为upstart风格的配置文件;
                            
                        rcS.conf:系统初始化脚本
                        rc.conf:启动或关闭服务
                        start-tty.cof:


            CentOS     7:    
                   init程序:systemd,配置文件:/usr/lib/systemd/system/*,  /etc/systemd/system/*
                    
                    完全兼容SysV脚本机制;因此,service命令依然可用;不过,建议使用systemctl命令来控制服务;
                
                    # systemctl  {start|stop|restart|status}  name[.service]


 CentOS启动流程:POST --> Bootloader(BIOS, MBR) --> Kernel(initrd) --> rootfs --> switch_root --> /sbin/init-->设置默认运行级别 --> 运行系统初始化脚本,完成系统初始化 --> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务--> 设置登录终端 [--> 启动图形终端]

内核文件:/boot/vmlinuz
内核模块(磁盘的加载驱动程序):/lib/modules
虚拟文件系统(ramdisk):一般使用的文件名为/boot/initrd
执行等级(runlevel):/etc/inittab
运行用户空间的第一个应用程序:/sbin/init
自定义开机启动程序:/etc/rc.d/rc.local
每个服务脚本在各级别下的启动或关闭状态:/etc/init.d/(chkconfig来查看)
系统初始化脚本:/etc/rc.d/rc.sysinit