CentOS系統啓動流程

CentOS系統的啓動流程


一、centos系統啓動分爲:

第一階段:

系統上電開機後,主板BIOS(Basic Input / Output System)運行POST(Power on self test)代碼,檢測系統外圍關鍵設備(如:CPU、內存、顯卡、I/O、鍵盤鼠標等)。硬件配置信息及一些用戶配置參數存儲在主板的CMOS( Complementary Metal Oxide Semiconductor)上(一般64字節),實際上就是主板上一塊可讀寫的RAM芯片,由主板上的電池供電,系統掉電後,信息不會丟失。

執行POST代碼對系統外圍關鍵設備檢測通過後,系統啓動自舉程序,根據我們在BIOS中設置的啓動順序搜索啓動驅動器(比如的硬盤、光驅、網絡服務器等)。選擇合適的啓動器,比如通常情況下的硬盤設備,BIOS會讀取硬盤設備的第一個扇區(MBR,512字節),並執行其中的代碼。實際上這裏BIOS並不關心啓動設備第一個扇區中是什麼內容,它只是負責讀取該扇區內容、並執行,BIOS的任務就完成了。此後將系統啓動的控制權移交到MBR部分的代碼。

注:在我們的現行系統中,大多關鍵設備都是連在主板上的。因此主板BIOS提供了一個操作系統(軟件)和系統外圍關鍵設備(硬件)最底級別的接口,在這個階段,檢測系統外圍關鍵設備是否“準備好”,以供操作系統使用。

第二階段:

BIOS通過下面兩種方法之一來傳遞引導記錄:

第一,將控制權傳遞給initial program loader(IPL),該程序安裝在磁盤主引導記錄(MBR)中

第二,將控制權傳遞給initial program loader(IPL),該程序安裝在磁盤分區的啓動引導扇區中

無論上面的哪種情況中,IPL都是MBR的一部分並應該存儲於一個不大於446字節的磁盤空間中,因爲MBR是一個不大於512字節的空間。

因此IPL僅僅是GRUB的第一個部分(stage1),他的作用就是定位和裝載GRUB的第二個部分(stage2);stage2對啓動系統起關鍵作用,該部分提供了GRUB啓動菜單和交互式的GRUB的shell。啓動菜單在啓動時候通過/boot/grub/grub.conf文件所定義的內容生成。在啓動菜單中選擇了kernel之後,GRUB會負責解壓和裝載kernel p_w_picpath並且將initrd裝載到內存中。最後GRUB初始化kernel啓動代碼。完成之後後續的引導權被移交給kernel。

假設Boot Loader爲grub (grub-0.97),其引導系統的過程如下:

grub分爲stage1(stage1_5)和stage2兩個階段。stage1可以看成是initial program loaderI(IPL),而stage2則實現了grub 的主要功能,包括對特定文件系統的支持(如ext2,ext3,reiserfs等),grub自己的shell,以及內部程序(如:kernrl,initrd,root)等。

stage 1:MBR(512字節,0頭0道1扇區),前446字節存放的是stage1,後面64字節存放硬盤分區表信息,BIOS將stag1載入內存中0x7c00處並跳轉執行。

stage1(/stage1/start.S)的任務非常單純,僅僅是將硬盤0頭0道2扇區讀入內存。0頭0道2扇區內容是源代碼中的/stage2/start.S,編譯後512字節,它是stage2或者stage1_5的入口。

start.S的主要功能是將stage2或stage1_5從硬盤載入內存,如果是stage2,則載入0x820處;如果是 stage1_5,則載入0x2200處。

注:這裏的stage2或者stage1_5不是/boot分區/boot/grub目錄下的文件,這個時候grub 還沒有能力識別任何文件系統。分以下兩種情況:

(1)假如start.S讀取的是stage1_5,它存放在硬盤0頭0道3扇區向後的位置,stage1_5作爲stage1和stage2中間的橋樑,stage1_5有識別文件系統的能力,此後grub纔有能力去訪問/boot分區/boot/grub 目錄下的 stage2文件,將stage2載入內存並執行。

(2)假如start.S讀取的是stage2,同樣,這個stage2也不是/boot分區/boot/grub目錄下的stage2,這個時候start.S讀取的是存放在/boot分區Boot Sector的stage2。這種情況下就有一個限制:因爲start.S通過BIOS中斷方式直接對硬盤尋址(而非通過訪問具體的文件系統),其尋址範圍有限,限制在8GB以內。因此這種情況需要將/boot分區分在硬盤8GB尋址空間之前。

假如是情形(2),我們將/boot/grub目錄下的內容清空,依然能成功啓動grub;假如是情形(1),將/boot/grub目錄下stage2刪除後,則系統啓動過程中grub 會啓動失敗。

這個地方經常要進行的操作:

是關於grub 常用的幾個指令對應的函數:

grub>root (hd0,0) --root指令爲grub 指定了一個根分區

grub>kernel  /vmlinuz-2.6.32-573.el6.x86_64 ro root=/dev/vg0/root --module指令加 載指定的模塊

grub>initrd /initramfs-2.6.32-573.el6.x86_64.img --指定initrd文件

grub>boot --boot 指令調用相應的啓動函數啓動OS內核

第三階段:

如階段2所述,grub>boot指令後,系統啓動的控制權移交給kernel。Kernel會立即初始化系統中各設備並做相關配置工作,其中包括CPU、I/O、存儲設備等。

關於設備驅動加載,有兩部分:一部分設備驅動編入Linux Kernel中,Kernel會調用這部分驅動初始化相關設備,同時將日誌輸出到kernel message buffer,系統啓動後dmesg可以查看到這部分輸出信息。另外有一部分設備驅動並沒有編入Kernel,而是作爲模塊形式放在initrd(ramdisk)中。

initrd 是一種基於內存的文件系統,啓動過程中,系統在訪問真正的根文件系統時,會先訪問initrd文件系統。將initrd 中的內容打開來看,會發現有bin、devetc、lib、procsys、sysroot、init等文件(包含目錄)。其中包含了一些設備的驅動模塊,比如scsi ata等設備驅動模塊,同時還有幾個基本的可執行程序insmod,modprobe,lvm,nash。主要目的是加載一些存儲介質的驅動模塊,如上面所說的scsi ideusb等設備驅動模塊,初始化LVM,把根文件系統以只讀方式掛載。

initrd 中的內容釋放到rootfs中後,Kernel會執行其中的init文件,這裏的init是一個腳本,由nash解釋器執行。這個時候內核的控制權移交給init文件處理,我們查看init文件的內容,主要也是加載各種存儲介質相關的設備驅動。

驅動加載後,會創建一個根設備,然後將根文件系統以只讀的方式掛載。這步結束後釋放未使用內存並執行switchroot,轉換到真正的根上面去,同時運行/sbin/init程序,開啓系統的1號進程,此後系統啓動的控制權移交給init進程。關於switchroot是在nash中定義的程序。

Linux Kernel需要適應多種不同的硬件架構,但是將所有的硬件驅動編入Kernel又是不實際的,而且Kernel也不可能每新出一種硬件結構,就將該硬件的設備驅動寫入內核。實際上Linux Kernel僅是包含了基本的硬件驅動,在系統安裝過程中會檢測系統硬件信息,根據安裝信息和系統硬件信息將一部分設備驅動寫入initrd。這樣在以後啓動系統時,一部分設備驅動就放在initrd中來加載。

第四階段:

init進程起來後,系統啓動的控制權移交給init進程。

/sbin/init進程是所有進程的父進程,當init起來之後,它首先會讀取配置文件/etc/inittab,進行以下工作:

1)執行系統初始化腳本(/etc/rc.d/rc.sysinit),對系統進行基本的配置,以讀寫方式掛載根文件系統及其它文件系統,到此係統基本算運行起來了,後面需要進行運行級別的確定及相應服務的啓動;

2)確定啓動後進入的運行級別;

3) 執行/etc/rc.d/rc,該文件定義了服務啓動的順序是先K後S,而具體的每個運行級別的服務狀態是放在/etc/rc.d/rcn.d(n=0~6)目錄下,所有的文件均鏈接至/etc/init.d 下的相應文件。

4)/etc/rc.d/rc $RUNLEVEL          # $RUNLEVEL爲缺省的運行模式

5) /etc/rc.d/rc.local

6)啓動虛擬終端/sbin/mingetty

7)在運行級別5上運行X

這時呈現給用戶的就是最終的登錄界面。

至此,系統啓動過程完畢。

說明:

系統啓動運行級別的概念以及服務的定製方法;

當initrd 可以正常檢測和裝載之後,最後的工作就基本上由操作系統來進行了。當系統的init 進程起來之後系統啓動的控制權移交給init進程。

/sbin/init 進程是所有進程的父進程,當init 起來之後,它首先會讀取配置文件/etc/inittab,進行以下工作:

1)執行系統初始化腳本(/etc/rc.d/rc.sysinit),對系統進行基本的配置,以讀寫方式掛載根文件系統及其它文件系統,後面需要進行運行級別的確定及相應服務的啓動,(從這個角度可以看出如果要定義系統的init 動作,需要修改/etc/rc.d/rc.sysinit腳本)。它的主要工作有:配置selinux,系統時鐘,內核參數(/etc/sysctl.conf),hostname,啓用wap分區,根文件系統的檢查和二次掛載(讀寫),激活RAID和LVM設備,啓用磁盤quota檢查並掛載其它文件系統。

2)通過對/etc/inittab文件的讀取確定啓動後進入的運行級別;

3) 在相應的運行級別中執行/etc/rc.d/rcx.d目錄下的腳本名稱,該文件定義了服務啓動的順序是先K 後S,而具體的每個運行級別的服務狀態是放在/etc/rc.d/rcn.d(n=0~6)目錄下,但這些文件均是到/etc/init.d下的相應文件的鏈接。

系統會按照在該目錄下的文件名稱和優先級執行對應運行級別目錄下的腳本:在某個運行級別的對應目錄下,K開頭的服務被關閉,S 開頭的服務被開啓,K 在S 開始之前執行,在執行過程中按照數字來定義優先級,數字越低優先級越高。

4)按照/etc/rc.d/rcX.d目錄中的定義,系統會於後臺啓動相應的服務,如果要對某個運行級別中的服務進行更具體的定製,通過chkconfig 命令來操作,或者通過setup/ntsys/system-config-services 來進行定製。

5)在/etc/inittab 文件中存在有關key sequence,UPS 的腳本定義,啓動虛擬終端/sbin/mingetty 的設置,這時呈現給用戶的就是最終的登錄界面。也就是說後臺啓動的服務完畢之後,如果系統默認進入字符界面,則運行mgetty進入1-6號終端控制檯,如果系統默認進入圖形界面,則開啓gdm 服務進入7號虛擬圖形控制檯。至此,系統啓動過程完畢。


簡要圖示:

wKioL1aHTojhG71FAAGjIeLX0xE763.png




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