Linux学习之:系统启动流程

                                        Linux操作系统启动流程

              

wKioL1aBL9TAigCDAAE_OCS_ipE574.jpg

一、系统初始化

    1.POST:加电自检

        启动电源后,初始化硬件信息,查找启动BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘

信息、内存信息、时钟信息等。             
    2.Boot Sequence

wKiom1aGemuzR6E8AAH1jYet56k800.jpg

        按次序查找各引导设备,第一个有引导程序(MBR)的设备即为本次启动要用到的设备;第一个设

备没有引导程序,就会去查找第二个,如果第一个设备引导程序损坏了,则不会去查找下一个。

        系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。其实被复

制到物理内存的内容就是Bootloader,而具体到电脑,那就是grub了。                                             

     MBR:Master Boot Record 
         512bytes:
             446bytes:bootloader
             64bytes:fat 
             2bytes:55AA

    3.Grub启动引导管理功能

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

    GRUB:
        bootloader:1st stage
        Partition:filesystem driver, 1.5 stage
        Partition:/boot/grub, 2nd stage

     4. Kernel
          自身初始化:
                 探测可识别到的所有硬件设备;
                 加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)
                 以只读方式挂载根文件系统;
                 运行用户空间的第一个应用程序:/sbin/init                 
         init程序的类型:

                 wKioL1aGXf3zDcvEAADJDFcsGp4035.jpg

                      
         ramdisk: 使用缓冲和缓存来加速对磁盘上的文件访问;        
                        ramdisk --> ramfs
                        CentOS 5: initrd
                            工具程序:mkinitrd
                        CentOS 6,7: initramfs
                            工具程序:dracut, mkinitrd


==========================请叫我分割线===========================          
            总结:系统初始化流程(内核级别):

                            -->POST 系统加电自检

                            --> BootSequence(BIOS) 查找引导设备

                            --> BootLoader(MBR)加载bootloader

                            --> Kernel(ramdisk)初始化内核

                            --> rootfs(readonly) 以只读方式加载根文件系统

                            --> /sbin/init () 用户空间服务进程的启动
            
    5. /sbin/init(用户空间服务进程):

     设置默认运行级别:            

   运行级别:为了系统的运行或维护等目的而设定的机制,0-6:7个级别;                    
          0:关机, shutdown
          1:单用户模式(single user),root用户,无须认证;维护模式;
          2:多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式;
          3:多用户模式(mutli user),完全功能模式;文本界面;
          4:预留级别:目前无特别使用目的,但习惯以同3级别功能使用;
          5:多用户模式(multi user),完全功能模式,图形界面;
          6:重启,reboot                        
      系统的默认级别为:3, 5
      级别切换:init #    
      级别查看: # who -r
                # runlevel

      CentOS 5:

              init程序: SysV init   
              配置文件:/etc/inittab

wKiom1aGae_iGX9fAANq9RZWREI066.jpg

              每行定义一种action以及与之对应的process
                     id:runlevels:action:process
                            id:一个任务的标识符;
                            runlevels:在哪些级别启动此任务;#,###,也可以为空,表示所有级别;
                            action:在什么条件下启动此任务;
                            process:任务;    
                     action:
                            wait:等待切换至此任务所在的级别时执行一次;
                            respawn:一旦此任务终止,就自动重新启动之;
                            initdefault:设定默认运行级别;此时,process省略; 

               sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本;   
                例如:
                      id:3:initdefault: 设定默认级别为3
                      si::sysinit:/etc/rc.d/rc.sysinit
                            
                      l0:0:wait:/etc/rc.d/rc 0 只有切换至0级别才运行,传递的参数为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脚本:接受一个运行级别数字为参数;  
                         脚本框架:

               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}

        CentOS 6:
            init程序:upstart,但依然为/sbin/init,

            其配置文件:/etc/init/*.conf, /etc/inittab(仅用于定义默认运行级别)   
                  注意:*.conf为upstart风格的配置文件;                   
                  rcS.conf
                  rc.conf
                  start-ttys.conf                     
        CentOS 7:

            init程序:systemd

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

            完全兼容SysV脚本机制;因此,service命令依然可用;

            不过,建议使用systemctl命令来控制服务;

             服务控制命令格式:
                    # systemctl  {start|stop|restart|status}  name[.service]

  

          chkconfig命令:管控/etc/init.d/每个服务脚本在各级别下的启动或关闭状态;              
             查看:chkconfig  --list   [name]                               
             添加:chkconfig  --add  name
             删除:chkconfig  --del  name                         
             能被添加的服务的脚本定义格式之一:
                #!/bin/bash
                #
                # chkconfig: LLL(运行级别)  NN(启动优先级) NN(关闭优先级)
                # description: 
             修改指定的链接类型:
                    chkconfig  [--level  LEVELS]  name  <on|off|reset>
                          --level LEVELS:指定要控制的级别;默认为2345;

        
       注意:正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d/rc.local (/etc/rc.local)脚本;因此,不便或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。
                                
              tty1:2345:respawn:/usr/sbin/mingetty tty1
                            ... ...
              tty6:2345:respawn:/usr/sbin/mingetty tty6    
                   (1)mingetty会调用login程序;
                   (2)打开虚拟终端的程序除了mingetty之外,还有诸如getty等;  
              系统初始化脚本:/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)
                -->设置默认运行级别

                --> 运行系统初始化脚本,完成系统初始化

                --> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务

                --> 设置登录终端

                --> 启动图形终端


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章