1. 程式人生 > >centos6之前版本的啟動流程

centos6之前版本的啟動流程

核心模塊 系統 處理 優先級 ble kernel tty nlog 訪問

centos6 之前的系統啟動:

    linux啟動流程:
    1)加電自檢
    2)讀取MBR,引導加載程序grub,完成grub的三個階段。
    3)加載系統內核kernel,執行系統初始化信息。
    4)啟動用戶空間第一個執行程序/sbin/init,並調用init的配置文件,完成初始化。
    5)啟動核心的外掛模塊,來啟動各種所需服務。
    6)啟動6個虛擬終端,執行/bin/login 程序,等待用戶登錄。
    7)登錄之後開始以Shell控制主機。
    CMOS通電-->BIOS啟動-->讀取MBR-->加載程序grub-->加載內核kernel-->執行程序/sbin/init-->/bin/login

1。加載BIOS 的硬件信息,獲取第一個啟動設備

    加電自檢:Power-On-Self-Test(POST)
        檢測硬件設備是否正常運行。自檢功能是由一個軟件程序來實現的,叫做BIOS,(basic input output system),即基本輸入輸出系統,它被裝載在一個硬件芯片CMOS上,CMOS是個硬件設備。加電過程就是給CMOS通電,然後啟動其上的BIOS程序,BIOS程序會根據CMOS上的配置信息來讀取其他硬件設備信息並進行檢查是否存在且能正常運行,之後就進行硬件設備的初始化。
        
    加電自檢:給CMOS通電,其上的BIOS啟動,並根據CMOS的配置信息來檢查其他硬件設備是否正常,之後進行設備初始化。

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

    讀取MBR,引導加載程序grub,完成grub的三個階段。
        硬件設備初始化後,BIOS會列出一些可以啟動的裝置順序,然後開始讀取第一個可以啟動的設備中的操作系統文件。
        怎樣來讀取這第一個啟動設備上的操作系統文件呢?需要用到啟動管理程序:Boot Loader。它是個程序,依賴與硬盤,這個硬盤就是第一個可以啟動的硬盤。Boot Loader是在該硬盤上第一個扇區上MBR(master boot record,主引導記錄)當中。每個硬盤分區都有塊啟動分區,這個啟動分區就是用來為操作系統安裝Boot Loader。
        Boot Loader的主要功能:一個就是去識別、加載操作系統中的核心文件,並提交到內存中運行,進而啟動對應的操作系統。另一個主要功能是提供菜單信息(這些菜單信息可為使用者提供不同的啟動項目來加載操作系統),並將啟動管理功能轉交給其他的加載程序。
        Boot loader功能的發揮是需要grub的是三個階段來完成的。
        
    BIOS列出啟動順序,讀取加載並啟動第一個可以啟動硬盤上的第一個啟動扇區上的MBR上的Boot Loader,發揮Boot loader的功能,而功能的發揮是通過引導加載程序grub來實現,也就是共要完成grub的三個階段stage1-1.5-2。

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


    加載系統內核kernel,執行系統初始化信息。
        在Boot Loader完成grub的是三個階段後,就開始讀取操作系統內核文件,接下來就會將內核文件解壓縮後裝載到內存當中,然後根據內核提供的功能開始檢測與加載各個設備。
        此時的設備檢查和之前bios自檢不同,此時內核程序已完全接管了BIOS的工作,之後的操作都是由內核來完成的。此時內核程序還沒有加載到磁盤便沒法讀取系統上的內核文件,而加載磁盤時就需要磁盤驅動程序,磁盤驅動程序還在硬盤上,但硬盤上的驅動程序還沒被讀取到。這就形成了死循環。
        所以這裏用了個虛擬文件系統來解決這個問題。虛擬文件系統(Initial RAM DISK)同樣放置在/boot目錄下,並且是一個以initrd(5)或initamfs(6)開頭的文件。這個以initrd開頭的文件能通過Boot Loader程序將其加載到內存中,然後這個文件會被解壓縮並在內存中模擬一個根文件系統,這個根文件系統能提供一個可以運行的程序,通過該程序可以加載在啟動過程中所需的核心模塊(RAID, LVM, SCSI 等文件系統和磁盤驅動程序),加載完後會協助內核重啟呼叫/sbin/init來執行後面的正常啟動。
        
    總的來說就是:Boot Loader 可以加載kernel(以vmlinuz開頭的文件)和initrd(以initrd開頭的文件),然後在內存中讓initrd(5)或initamfs(6)解壓縮成虛擬的根目錄,然後內核kernel可以在這個虛擬的根目錄上加載合適的驅動程序,來檢查和加載硬盤等各個設備,再之後釋放虛擬的根文件系統,且會協助內核重啟呼叫/sbin/init來執行後面的正常啟動,並以只讀的方式掛載到磁盤上真實的根文件系統,之後就是正常的啟動過程了。

4。核心執行init 程序,並獲取默認的運行信息

    啟動用戶空間第一個執行程序/sbin/init,並調用init的配置文件
        在內核、硬件及驅動信息加載完畢後,內核會呼叫用戶控件的第一個執行程序/sbin/init,init程序主要功能是準備軟件運行環境,包括系統的主機名稱、網路配置、文件系統格式等其他服務的啟動管理。這些所有的操作都是通過init的配置文件來定義的。
        
        init的配置文件:
            centos5:由於centos5采用的是SysV init方式,其特點是啟動用戶空間的服務程序,通常通過腳本進行,有依賴關系的服務將被串行啟動;這導致了centos5的系統啟動過程非常慢,其配額制文件為:/etc/initab
            centos6:采用的是Upstart的方式,其特點是守護進程間的通信依賴於D-Bus進行,因此,可基本實現類似並行啟動,配置文件:/etc/inittab,/etc/init/*.conf
            centos7:采用Systemd方式,其特點是服務只有在第一次被訪問到時才會真正啟動起來;因此centos7系統啟動過程非常快,配置文件:/usr/lib/systemd/*
    
    啟用用戶空間的第一個執行程序/sbin/init,這個程序根據init的配置文件來開始init初始化。初始化第一步是:根據/etc/inittab(centos5);或者/etc/inittab、/ect/init/*.conf(centos6)配置文件進行系統環境初始化。

5。初始化第一步結束後,開始初始化第二步。初始化第二步,init會根據/etc/rc.d/rc.sysinit中定義的內容進行系統初始化。

6。啟動核心的外掛模塊,init 執行/etc/rc.d/目錄下的各個批處理文件(scripts),最後執行/etc/rc.d/rc.local。

    在/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.d/目錄下的所有腳本,即為/etc/init.d/SERVICE_SCRIPTS。這些腳本遵循LSB服務腳本定義規範,都接受至少4個最基本的參數:{start|stop|status|restart}。
    /etc/init.d/目錄下的腳本在指定級別為啟動還是停止的控制方法:
        1。腳本開頭:
            # chkconfig: S_LEVELS S_PRIO K_PRIO  (s_levels s_prio k_prio)
            # description:
                
                #!/bin/bash
                #LLLL  表示初始在哪個級別下啟動,- 表示都不啟動
                # chkconfig: LLLL nn nn
                    服務腳本中,必須有#chkconfig  35  97  07,其中35表示開機支持在那個模式上啟動 ,97  07分別是服務列表名的前綴,分別表示啟動或關閉狀態
                    
                
        2。腳本開頭的第二方法:
            ### BEGIN INIT INFO 
            # Provides: $network
            # Should-Start: iptables ip6tables
            # Short-Dercription: Bring up/down networking
            # Description: Bring up/down networking
            ### END INIT INFO
    
    這些腳本可以直接被調用:
        /etc/init.d/SERVICE_SCRIPTS {start|stop|status|restart}
    也可以使用service 命令調用:
        service SERVICE_SCRIPTS {start|stop|status|restart}
    上面的服務也可以開機時(或切換為指定級別時)被自動啟動或停止:
        方法:
            /etc/rc.d/rc腳本,以及每個級別對應的級別目錄下的“符號鏈接”來進行(/etc/rc.d/rcN.d)如下內容:
                S##SERVICE_SCRIPTS
                K##SERVICE_SCRIPTS
            ##:兩位數字,表示優先級;比如想啟動一個web服務,那首先得有網絡服務,因為web服務依賴於網絡服務,因此網絡服務就會被優先啟動,web服務就後於網絡服務啟動,同樣,在停止是要先停止web服務,最後才能停止網絡服務。
    註意:
        有個特殊的鏈接在所有的/etc/rc.d/rcN.d/目錄下,這個鏈接就是S99local指向/etc/rc.local腳本,這個是最後執行的。
        這個腳本的功能是:那些不方便定義為服務腳本的,想設定為開機自動運行的,可以直接把命令寫到此腳本中以實現開啟運行。

7。執行/bin/login 程序,等待用戶登錄

    根據/etc/inittab中指定的id:3:initdefault:來啟動終端,並且會啟動6個虛擬終端且處於等候狀態,虛擬終端啟動後會在此虛擬終端上附加個用戶登錄程序/bin/login,來等待用戶登錄。
        在完成系統所有相關服務啟動後,接下來linux就會啟動終端或者是X window來向用戶提供登錄界面,例如啟動虛擬終端
        一般啟動6個虛擬終端:
             tty1:2345:respawn:/sbin/mingetty tty1
             tty2:2345:respawn:/sbin/mingetty tty2
             tty3:2345:respawn:/sbin/mingetty tty3
             tty4:2345:respawn:/sbin/mingetty tty4
             tty5:2345:respawn:/sbin/mingetty tty5
             tty6:2345:respawn:/sbin/mingetty tty6
            
        每個虛擬終端啟動後,會立即通過此終端附加一個應用程序——login
        如果默認級別為5,還會啟動一個圖形虛擬終端,會附加X應用程序
        
        註意:
            1。centos6的init程序為upstart,其配置文件為/etc/init/*.conf ;此些配置遵循upstrat語法格式進行編程;
            2。centos6 的服務控制事實上大多數並沒有使用upstart腳本來控制,而使用的是SysV風格的腳本;

8。登錄之後開始以Shell控制主機

centos6之前版本的啟動流程