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)
                -->設置默認運行級別

                --> 運行系統初始化腳本,完成系統初始化

                --> 關閉對應級別下需要停止的服務,啓動對應級別下需要開啓的服務

                --> 設置登錄終端

                --> 啓動圖形終端


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