linux系統啓動流程(CentOS爲例)


Centos系統啓動流程



熟悉系統啓動流程對於我們學習Linux系統是非常有幫助的,雖然基礎,但能幫助我們更加理解Linux系統的工作機制。以下將以CentOS發行版爲例來介紹Linux系統的啓動流程,因爲在CentOS 5CentOS 6以及CentOS 7使用的初始化程序init各不相同,雖然CentOS 6CentOS 7都有向後兼容,但在工作機制上仍有一些差異,因此以下主要介紹CentOS 5/6系統啓動流程

CentOS的啓動流程總體順序如下(CentOS 6爲例)

POST --> Boot Sequence --> bootloader(MBR) -->Kernel --> 加載rootfs --> switchroot--> /sbin/init --> (配置文件:/etc/inittab, /etc/init/*.conf) --> 根據init配置文件設置默認運行級別 --> 運行系統初始化腳本/etc/rc.d/rc.sysinit,完成系統初始化 --> 開啓或關閉用戶選定的對應運行級別下所對應的服務 --> 啓動終端,打印登錄提示符

注意:紅色部分代表內核空間的系統啓動流程,紫色部分代表用戶空間的系統啓動流程。

 

接下來逐一詳解:

第一步:POST加電自檢

主要實現的功能是檢測各個外圍硬件設備是否存在而且能夠正常運行起來,實現這一自檢功能的是固化在主板上的ROM(主要代表爲CMOS)芯片上的BIOS(Basic Input/Output System)程序;例如BIOS會檢測CPUMemory以及I/O設備是否能夠正常運行,如果是個人計算機的話可能還會檢測一下顯示器。只要一通電,CPU就會自動去加載ROM芯片上的BIOS程序,是這樣來實現的。而檢測完成之後就進行硬件設備的初始化

 

POST:系統首先由POSTPOWER ON SELF TEST,上電自檢)程序來對內部各個設備進行檢查,通常完整的POST自檢將包括CPU640K基本內存(640K BASE MEMORY)、1MB以上擴展內存(EXTEND MEMORY)、ROMREAD-ONLY MEMORY,只讀存儲器)、主板、CMOS存儲器、串口、並口、顯卡、軟盤子系統、硬盤子系統、鍵盤進行測試,一旦發現問題,系統將給出警告或鳴笛警告。

BIOS是英文"Basic InputOutput System"的縮略詞,直譯過來後中文名稱就是"基本輸入輸出系統"。其實,它是一組固化到計算機內主板上一個ROM芯片上的程序,它保存着計算機最重要的基本輸入輸出的程序、開機後自檢程序和系統自啓動程序,它可從CMOS中讀寫系統設置的具體信息。其主要功能是爲計算機提供最底層的、最直接的硬件設置和控制。

 

第二步:Boot Sequence(選擇啓動設備以加載MBR)

主要實現的功能是選擇要啓動的硬件設備,選擇了之後就可以讀取這個設備上位於MBR裏頭的bootloader了。這一步的實現是這樣的:根據BIOS中對啓動順序的設定,BIOS自己會依次掃描各個引導設備,然後第一個被掃描到具有引導程序(bootloader)的設備就被作爲要啓動的引導設備。

 

MBR:主引導記錄(MBRMain Boot Record)是位於磁盤最前邊的一段引導(Loader)代碼。它負責磁盤操作系統(DOS)對磁盤進行讀寫時分區合法性的判別、分區引導信息的定位,它由磁盤操作系統(DOS)在對硬盤進行初始化時產生的。

Bootloader:啓動加載,可以初始化硬件設備、建立內存空間映射圖,從而將系統的軟硬件環境帶到一個合適狀態,以便爲最終調用操作系統內核準備好正確的環境。

第三步:加載bootloader(MBR)

這一步實現起來的步驟比較多,前面的BIOS通過讀取並執行啓動設備的MBR中的bootloader,而bootloader要實現的功能就是提供一個菜單給用戶,讓用戶去選擇要啓動的系統或不同的內核版本,然後把用戶選擇的內核版本加載至RAM中的特定空間,接着在RAM中解壓、展開,而後把系統控制權移交給內核。

grubbootloader中的一種,就grub來說,這一步的實現是這樣的:grub是通過分成三個階段來實現加載內核這一功能的,這三個階段分別是:stage1,stage1.5以及stage2。其中:

stage1:存放於MBR的前446Bytes,用於加載stage1.5階段,目的是爲了識別並驅動stage2(或者/boot)所在分區的文件系統;

stage1.5:存放於MBR之後的扇區,加載stage2所在分區的文件系統驅動,讓stage1中的bootloader能識別stage2所在分區的文件系統;

stage2:存放於磁盤分區之上,具體存放於/boot/grub目錄之下,主要用於加載內核文件(vmlinuz-VERSION-RELEASE)以及ramdisk這個臨時根文件系統(initrd-VERSION-RELEASE.imginitramfs-VERSION-RELEASE.img)

概述:假如要啓動的是硬盤設備,首先我們的硬件平臺主板BIOS必須能夠識別硬盤,然後BIOS才能加載硬盤中的bootloader,而bootloader自身加載後就能夠直接識別當前主機上的硬盤設備了;不過,能夠識別硬盤設備不代表能夠識別硬盤設備中的文件系統,因爲文件系統是額外附加的一層軟件組織的文件結構,所以要對接一種文件系統,就必須要有對應的能夠識別和理解這種文件系統的驅動,這種驅動就稱爲文件系統驅動。而stage1.5就是向grub提供文件系統驅動的,這樣stage1就能訪問stage2及內核所在的分區(/boot)了。

需要注意的是,stage2、內核以及ramdisk文件通常放置於一個基本磁盤分區之上,因爲grub無法驅動lvm、軟raid等複雜邏輯設備,除非提供一個複雜的驅動接口,否則如果stage2及內核等文件都存放在lvm等複雜邏輯設備上將無法被stage1所識別,更別說加載了!

wKioL1l4BkuzoLGzAAB7U4aqhKI166.png

wKioL1l4Bqyx5jpZAACRenKjA84619.png

wKioL1l4BungoDqhAAB1wJt1krk114.png

ramdisk:虛擬內存盤是通過軟件將一部分內存(RAM)模擬爲硬盤來使用的一種技術。相對於直接的硬盤文件訪問來說,這種技術可以極大的提高在其上進行的文件訪問的速度。但是RAM的易失性也意味着當關閉電源後這部分數據將會丟失。但是在一般情況下,傳遞到RAM盤上的數據都是在硬盤或別處永久貯存的文件的一個拷貝。經由適當的配置,可以實現當系統重啓後重新建立虛擬盤。

 

第四步:Kernel自身初始化

Kerenl在得到系統控制權之後,首先要進行自身初始化,而初始化的主要作用是:

(1)探測可識別到的所有硬件設備;

(2)加載硬件驅動程序,即加載真正的根文件系統所在設備的驅動程序(有可能會藉助於ramdisk加載驅動);

(3)以只讀方式掛載根文件系統(即根切換);

(4)運行用戶空間的第一個應用程序:/sbin/init.

到這裏內核空間的啓動流程就結束了,而接下來是用戶空間完成後續的系統啓動流程。

 

注意:

    ramdisk和內核是由bootloader一同加載到內存當中的,ramdisk是用於實現系統初始化的、基於內存的磁盤設備,即加載至內存(的某一段空間)後把內存當磁盤使用,並在內存中作爲臨時根文件系統提供給內核使用,幫助內核掛載真正的根文件系統。而之所以能夠幫助內核掛載根文件系統是因爲在ramdisk這個臨時文件系統的/lib/modules目錄下有真正的根文件系統所在設備的驅動程序;除此之外,這個臨時文件系統也遵循FHS,例如有這些固定目錄結構:/bin, /sbin, /lib, /lib64, /etc, /mnt, /media, ...

需要注意的是,系統發行商爲了適應於各個不同的硬件接口,因此將各個不同的硬件接口的驅動組裝打包起來,例如在用戶第一次使用光盤安裝完系統之後,會動態探測當前主機上的硬件設備並調用與之對應的設備驅動再做成ramdisk文件的。所以,ramdisk文件並非必須的,如果只是爲了將Linux安裝於特定硬件平臺上,就可以直接把對應的驅動編譯進內核即可,而不需要去使用ramdisk文件了。

 

第五步:init管理用戶空間服務進程

這一步的流程是:/sbin/init --> 根據init配置文件設置默認運行級別 --> 運行系統初始化腳本/etc/rc.d/rc.sysinit,完成系統初始化 --> 關閉或啓動用戶選定的默認運行級別所對應的服務 --> 啓動終端,打印登錄提示符.

 

(1)根據init配置文件設置默認運行級別

對於CentOS 6來說,初始化程序initupstart,其配置文件爲:/etc/inittab /etc/init/*.conf,也就是upstart將配置文件拆分成多個,在/etc/init/目錄下以conf結尾的都是upstart風格的配置文件,而/etc/inittab僅用於設置默認運行級別;

注意:

    運行級別是爲了系統的運行和維護等目的而設定的一種機制,對於CentOS 5/6來講,一共有7種運行級別,即0-6,它們的意義如下:

 0:關機模式,shutdown

 1:單用戶模式(single user):不需要通過認證,登錄進去之後爲root用戶身份,是維護模式;

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

 3:多用戶模式(multi user):爲完全功能模式,提供文本界面;

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

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

 6:重啓模式,reboot


wKioL1l4Bx-CB-WEAACL5NNmjm4567.png


(2)運行系統初始化腳本/etc/rc.d/rc.sysinit,完成系統初始化

運行初始化腳本是爲了初始化系統環境,這一步初始化包括:

      ①  設置主機名;

     ②設置歡迎信息;

    ③激活udevselinux

    ④掛載/etc/fstab文件中定義的所有文件系統;

    ⑤檢測根文件系統,以讀寫方式重新掛載根文件系統;

    ⑥設置系統時鐘;

    ⑦根據/etc/sysctl.conf文件來設置內核參數;

    ⑧激活lvm及軟raid設備;

    ⑨激活swap設備;

    ⑩加載額外設備的驅動程序(因爲內核只加載根文件系統所在分區的驅動程序);


wKioL1l4B3_h_5WWAACOXUdw-gM880.png


(3)關閉或啓動用戶選定的默認運行級別下所對應的服務

要實現的功能是:根據前面用戶通過init配置文件對默認運行級別的設定,關閉或啓動這個運行級別下的服務。

具體實現方式:運行/etc/rc.d/rc這個腳本文件,而初始化程序init根據前面獲取的默認運行級別信息,將這個運行級別數字以參數方式傳遞給/etc/rc.d/rc腳本中的變量$runlevel;然後,這個腳本會以glob方式去把/etc/rc.d/rc$runlevel.d/S*匹配到的腳本所控制的服務開啓,而把/etc/rc.d/rc$runlevel.d/K*匹配到的腳本所控制的服務關閉。

wKiom1l4B73gI8tJAABl5dTeZOU846.png


需要注意的是,在這些/etc/rc.d/rc#.d/目錄下,除了S99local這個服務腳本之外,其他服務都鏈接到/etc/init.d/目錄下對應的服務腳本,而S99local則鏈接到/etc/rc.d/rc.local(/etc/rc.local)。所以,如果我們有不方便或者沒必要寫成服務腳本的程序,但又希望這樣的程序能夠在開機自動開啓時,可以直接寫進/etc/rc.d/rc.local這個腳本文件中就行了!

wKiom1l4CAygL9JyAAA8BpUJuBg384.png


(4)啓動終端,打印登錄提示符

根據前面獲取的運行級別來啓動終端,mingetty程序是用於啓動終端的,它會調用登錄程序login,這樣就能顯示出登錄提示符了,類似mingetty這種用於打開終端的程序還有getty等。  

如果默認運行級別爲3,則打開字符界面;

如果默認運行級別爲5,則會打開圖形界面。

 

第六步:用戶登錄

 系統啓動結束!





流程圖:


wKioL1l4CFahLr8ZAANdOO8CPs0990.jpg


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