CentOS系統啓動流程

CentOS系統啓動流程

  • Linux系統的組成部分
    Linux系統的組成部分:內核+根文件系統
    內核:進程管理,內存管理,網絡協議棧,文件系統,驅動程序,安全功能
    內核設計流派:
    單內核設計:把所有功能集成同一個程序
    微內核設計:每種功能使用一個單獨的子系統實現
    linux內核特點:支持模塊化: .ko(kernel object)
    支持模塊運行時動態裝卸或卸載
    組成部分:
    核心文件: /boot/vmlinuz-VERSION-release
    ramdisk:CentOS 5:/boot/initrd-VERSION-release.img
    CentOS 6,7:/boot/initramfs-VERSION-release.img
    模塊文件:/lib/modules/VERSION-release
    運行中的系統環境可分爲兩層:內核空間、用戶空間
    用戶空間:應用程序(進程或線程)
    內核空間:內核代碼(系統調用)

  • CentOS 系統的啓動流程
    1.加載BIOS的硬件信息,獲取第一個啓動設備
    2.讀取第一個啓動設備MBR的引導加載程序(grub)的啓動信息
    3.加載核心操作系統的核心信息,核心開始解壓縮,並嘗試驅動所有的硬件設備
    4.核心執行init程序,並獲取默認的運行信息
    5.init程序執行/etc/rc.d/rc.sysinit文件
    6.啓動核心的外掛模塊
    7.init執行運行的各個批處理文件(scripts)
    8.init執行/etc/rc.d/rc.local
    9.執行/bin/login程序,等待用戶登錄
    10.登錄之後開始以shell控制主機
  • 詳細說明啓動流程
    1..加載BIOS的硬件信息,獲取第一個啓動設備:
    POST,加電自檢是BIOS功能的一個主要部分,負責完成對CPU,主板,內存,硬盤子系統,顯示子系統,串並行接口,鍵盤等硬件情況的檢測
    ROM:BIOS,保存着有關計算機系統最重要的基本輸入輸出程序,系統信息設置,開機加電自檢程序和系統啓動自舉等
    RAM:CMOS互補金屬氧化物半導體,保存各項參數的設定
    按次序查找引導設備,第一個有引導程序的設備爲本次啓動設備
    bootloader:引導加載器,程序;
    Windows:ntloader
    Linux:
    LILO:LIinux LOader
    GRUB:Grand Uniform Bootloader
    GRUB 0.X:Grub Legacy
    GRUB 1.X:Grub2
    功能:提供一個菜單,允許用戶選擇要啓動的系統或不同的內核版本; 把用戶選定的內核裝載到RAM中的特定空間中,解壓、展開,而後把系統控制權移交給內核

2.讀取第一個啓動設備MBR的引導加載程序(grub)的啓動信息

 MBR:第一個扇區
            前446字節:bootloader
            中間64字節:分區表
            最後2字節:55AA

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

3.加載核心操作系統的核心信息,核心開始解壓縮,並嘗試驅動所有的硬件設備

Kernel:
      自身初始化:
                   探測可識別到的所有硬件設備
                         加載硬件驅動程序
                         以只讀方式掛載根文件系統
                         運行用戶空間的第一個應用程序:/sbin/init

init程序的類型:
Centos5-:SysV int
配置文件:/etc/inittab
Centos6:Upstart
配置文件:/etc/inittab
/etc/init/*.conf
CentOS 7:Systemd
配置文件:/usr/lib/systemd/system/, /etc/systemd/system/
ramdisk:
Linux內核的特性之一:使用緩衝和緩存來加速對磁盤上的文件訪問;
ramdisk --> ramfs
CentOS 5: initrd
工具程序:mkinitrd
CentOS 6,7: initramfs
工具程序:dracut, mkinitrd
4.核心執行init程序,並獲取默認的運行信息
init 程序的類型:

1.SysV: init, 在CentOS 5中的開機速度是最慢的原因是採用SysV init方式,其特點是啓動用戶空間的服務程序,通常通過腳本進行,有依賴關係的服務將被串行啓動。

 (1)運行級別:爲了系統的運行或維護等目的而設定的機制;
       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
(2)配置文件:/etc/inittab
    每行定義一種action以及與之對應的process
               id:runlevels:action:process
                          id:一個任務的標識符;
                          runlevels:在哪些級別啓動此任務;#,###,也可以爲空,表示所有級別;
                          action:在什麼條件下啓動此任務;
                          process:任務;
                    action:
                       wait:等待切換至此任務所在的級別時執行一次;
                         respawn:一旦此任務終止,就自動重新啓動之;
                         initdefault:設定默認運行級別;此時,process省略;
                         sysinit:設定系統初始化方式,此處一般爲指定/etc/rc.d/rc.sysinit腳本;
        2.Upstart: init,CentOS 6 #CentOS 6的開機速度比5會快一些因爲他採用的是Upstart的方法雖然你見到的名字還叫做init但是很多機制都是採用ubuntu開發的Upstart這個機制,特點是守護進程間的通信依賴於D-Bus進行,因此可基本實現類似的並行啓動
         init程序:upstart,但依然爲/sbin/init,其配置文件:
                       /etc/init/*.conf, /etc/inittab(僅用於定義默認運行級別)
                                         *.conf爲upstart風格的配置文件;
        3.Systemd :systemd, CentOS 7 #在7中的啓動速度最快的原因是採用Systemd的方式,其特點是服務只有第一次被訪問時纔會真正的啓動起來
                              核心概念:unit,unit由其相關配置文件進行標識、識別和配置;文件中主要包含了系統服務、監聽的socket、保存的快照以及其它與init相關的信息;
                               這些配置文件主要保存在:
                                        /usr/lib/systemd/system
                                        /run/systemd/system
                                        /etc/systemd/system
                            unit的常見類型:
                                   Service unit:文件擴展名爲.service,用於定義系統服務;
                                   Target unit:文件擴展爲.target,用於模擬實現“運行級別”;
                                    Device unit: .device,用於定義內核識別的設備;
                                    Mount unit: .mount,定義文件系統掛載點;
                                    Socket unit: .socket,用於標識進程間通信用到的socket文件;
                                    Snapshot unit: .snapshot, 管理系統快照;
                                    Swap unit: .swap, 用於標識swap設備;
                                    Automount unit: .automount,文件系統自動點設備;
                                    Path unit: .path, 用於定義文件系統中的一文件或目錄;
              關鍵特性:
                    基於socket的激活機制:socket與程序分離;
                     基於bus的激活機制;
                     基於device的激活機制;
                     基於Path的激活機制;
                     系統快照:保存各unit的當前狀態信息於持久存儲設備中;
                      向後兼容sysv init腳本;/etc/init.d/
            不兼容:
                 systemctl的命令是固定不變的;
                 非由systemd啓動的服務,systemctl無法與之通信;

5.init程序執行/etc/rc.d/rc.sysinit文件

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

6.啓動核心的外掛模塊
7init 執行運行的各個批處理文件(scripts)

        在系統/etc/rc.d/rc.sysinit初始化完成系統之後,此時系統就已經可以正常工作了,只是還缺少啓動時所需要的各項服務,這樣主機才能提供一些我們需要的功能,如網絡服務、dhcp服務等功能這裏通過inittab裏面提到的l3:3:wait:/etc/rc.d/rc 3配置了,而這裏其實是通過/etc/rc.d/rc3.d/下所有鏈接文件來決定如何啓動或關閉服務;素有以S開頭的都被傳遞start參數啓動,所有以K開頭的,都被傳遞stop參數以停止。
        而/etc/rc.d/rc3.d/下的所有鏈接文件都是在/etc/init下面的所有腳本,而這些腳本都必須至少接受四個最基本的參數,{start|stop|status|restart}
        意味着去啓動或關閉/etc/rc.d/rc3.d/目錄下的服務腳本所控制服務;
                K*:要停止的服務;K##*,優先級,數字越小,越是優先關閉;依賴的服務先關閉,而後關閉被依賴的;
                S*:要啓動的服務;S##*,優先級,數字越小,越是優先啓動;被依賴的服務先啓動,而依賴的服務後啓動;
      rc腳本:接受一個運行級別數字爲參數;
            /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/每個服務腳本在各級別下的啓動或關閉狀態;
                                            查看:chkconfig  --list   [name]
                                            添加:chkconfig  --add  name
                能被添加的服務的腳本定義格式之一:
                                     #!/bin/bash
                                     #
                                     # chkconfig: LLL  NN NN
                                    # description:  
                                     刪除:chkconfig  --del  name
                修改指定的鏈接類型:
                        chkconfig  [--level  LEVELS]  name  <on|off|reset>
                     --level LEVELS:指定要控制的級別;默認爲2345;

8.init 執行/etc/rc.d/rc.local
注意:正常級別下,最後啓動的一個服務S99local沒有鏈接至/etc/init.d下的某腳本,而是鏈接至了/etc/rc.d/rc.local (/etc/rc.local)腳本;因此,不便或不需寫爲服務腳本的程序期望能開機自動運行時,直接放置於此腳本文件中即可。
• /etc/rc.d/rc.local 在指定運行級別腳本後運行
• 可以根據情況,進行自定義修改
9執行/bin/login 程序,等待用戶登錄
10登錄之後開始以Shell控制主機

CentOS 6 啓動流程:POST --> Boot Sequence(BIOS) --> Boot Loader -->Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 別 設定默認運行級別 --> 系統初始化腳本 rc.sysinit --> 務 關閉或啓動對應級別的服務 --> 啓動終端

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