CentOS 啓動流程

流程圖:

   系統初始化流程:

POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init 

  用戶空間初始化流程:

 /sbin/init [/etc/inittab或/etc/init/*.conf]--> /etc/rc.d/rc.sysinit --> /etc/rc.d/rc0-9.d --> /etc/rc.local

 設置默認運行級別 --> 運行系統初始化腳本,完成系統初始化 --> 關閉對應級別下需要停止的服務,啓動對應級別下需要開啓的服務 --> 設置登錄終端 --> 啓動圖形終端


概述啓動流程:

    一:post加電自檢,將BIOS映射進CPU可以查找的線性地址空間,使得cpu可以讀取主板上rom設備中的BIOS程序,通過rom加載內存(ram)並檢查當前設備硬件是否存在

    二:BootSequence按次序查找各引導設備,根據BIOS中設置的啓動次序去加載對應設備的MBR

    三:bootloader根據MBR的分區表,查找操作系統所在的分區,並通過grub加載操作系統的內核,此時將內核裝載入內存,在內存中解壓縮

    四:kernel進行自身初始化,探測可識別的硬件設備,並藉助ramdisk加載boot目錄下的initrd或initramfs文件中裝載驅動模塊(ramdisk中包含着initrd或initramfs)

    五:以只讀方式掛載根文件系統

    六:運行/etc/inittab中的程序設定默認運行級別

    七:運行/etc/rc.d/rc.sysinit系統初始化腳本

    八:運行/etc/rc.d/rc0-9.d 關閉或啓動對應級別下的服務

    九:運行/etc/rc.local系統初始化完成以後,程序自動加載的最後一個腳本

詳細剖析:

    一:POST加電自檢將BIOS映射進CPU可以查找的線性地址空間,使得cpu可以讀取主板上rom設備中的程序BIOS,通過rom加載內存(ram)並檢查當前設備硬件是否存在

  二:BootSequence按次序查找各引導設備,根據BIOS中設置的啓動次序去加載對應設備的MBR

            MBR:Master Boot Record (512bytes)

            446bytes:存放bootloader

            64bytes:存放分區表

            2byte:判斷MBR是否有效的標識55AA爲有效

       wKiom1dFJh_CNVCyAABOQFZj1Fg941.png

  三: bootloader:引導加載器,程序 

            提供一個菜單,允許用戶選擇要啓動的系統或不同的內核版本; 把用戶選定的內核裝載到RAM中的特定空間中,解壓、展開,而後把系統控制權移交給內核;

            (1)Windows上引導加載器:ntloader

            (2)Linux上引導加載器

                   LILO:古老linux加載器,1024柱面之後無法加載,繼而被grub所取代,現在多用於安卓手機啓動

                   grub:提供一個菜單,允許用戶選擇要啓動的系統或不同的內核版本, 把用戶選定的內核裝載到RAM中的特定空間中,解壓、展開,而後把系統控制權移交給內核;

                        stage1:grub第一階段存在MBR中,用於引導stage2

                        stage1_5:在MBR之後的扇區中,識別常見的不同的文件系統的

                        stage2:位於/boot/grub目錄下,配置文件是/etc/grub.conf,功用:向上看

                                         32131.bmp

四:內核初始化:

    當stage2被載入系統執行時,它首先會去解析grub的配置文件/boot/grub/grub.conf,然後加載內核鏡像到內存中,並將控制權轉交給內核,內核會立即初始化系統中各設備並做相關的配置工作,其中包括CPU、I/O、存儲設備等,並且以讀寫的方式掛載根文件系統,此時涉及到一個"先有雞還是先有蛋的問題"

     要想訪問根文件系統(rootfs),首先就得加載根文件系統中的驅動程序,而加載驅動程序需要先掛載根文件系統。爲了解決這個問題:Linux設備驅動程序的加載,有一部分驅動程序直接被編譯進內核鏡像中,另一部分則是以模塊的形式存放在initrd(ramdisk)中。內核啓動被分成了兩個階段,第一階段先執行initrd文件系統中的init,完成加載驅動模塊等任務,第二階段纔會執行真正的根文件系統中的/sbin/init進程


五:/etc/inittab:設定默認運行級別

    init程序在不同CentOS版本上的類型:

      CentOS-5 SysV init 配置文件:/etc/inittab

      CentOS-6 Upstart   配置文件:/etc/inittab /etc/init/*.conf

      CentOS-7 Systemd   配置文件:/usr/lib/systemd/system, /etc/systemd/system/                 


六:運行系統初始化腳本,完成系統初始化

     運行/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) 清理操作;

        

七:關閉或啓動對應級別下的服務/etc/rc.d/rc#.d

       0-6:7個級別;

  0:關機, shutdown

  1:單用戶模式(single user),root用戶,無須認證;維護模式;

  2多用戶模式(multi user),會啓動網絡功能,但不會啓動NFS;維護模式;

  3多用戶模式(mutli user),完全功能模式;文本界面;

  4預留級別:目前無特別使用目的,但習慣以同3級別功能使用;

  5多用戶模式(multi user), 完全功能模式,圖形界面;

  6重啓,reboot

    1) 默認級別:3, 5

    2) 級別切換:init #

    3) 級別查看命令:who -r   runlevel

八:運行/etc/rc.local系統初始化完成以後,程序自動加載的腳本

        系統啓動最後執行的一個腳本


九:啓動終端

   tty1:2345:respawn:/usr/sbin/mingetty tty1

   ... ...

   tty6:2345:respawn:/usr/sbin/mingetty tty6        

(1)mingetty會調用login程序;

(2)打開虛擬終端的程序除了mingetty之外,還有諸如getty等;


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