Linux學習筆記之 Linux系統啓動流程

第一步:POST(Power On Test) 

BIOS (Basic Imput & Output System) :基本輸入輸輸出系統,是固化在ROM中的一個程序。在系統啓動過程中,主要完成如下兩個功能。

1.POST,系統通電後,CPU會將BIOS程序加載到內存中運行,BIOS此時會執行系統完整性檢查,檢查主要硬件,如CPU、DMA、 等是否正常,如過發現嚴重錯誤,啓動過程就此終止,如果關鍵設備檢查通過,則會執行更完整的硬件檢查,包括Keyboard,Harddrive 等等。一切正常,則會進入下階段。

2.根據BIOS中設置的啓動順序來查找用於啓動系統的驅動器,可以是硬盤,光盤,U盤等。以硬盤爲例,查找到可啓動硬盤後,BIOS會讀取硬盤的第一個啓動扇區(BootSector)(0磁道,0扇區),該扇區大小隻有512字節,該扇區中包含主引導記錄MBR(Master Boot Record),至此BIOS已經完成了其自身使命,接下來交由MBR來引導系統。


第二步:BootLoader, Bootloader 位於MBR的前446字節,隨後的64字節用於存儲硬盤分區表,末尾2字節用於標示MBR的有效性。

Bootloader 功能:提供一個菜單,允許用戶選擇要啓動的系統或不同的版本,把用戶選擇的內核加載到內存中的特定空間中,解壓,展開後,將控制權交給內核

由於存儲bootloader的空間有限,只有446字節,所以沒有辦法將bootload所有程序(會包含很多驅動文件)全部放在MBR頭446字節中。因此,bootloader需要分階段加載,於是就有了Grub Stage 1、Grub stage 1.5(銜接Grub Stage 1 和Grub Stage 2)、Grub Stage 2 (存放在硬盤分區上)。

查看/boot/grub 目錄下的文件,可發現有stag1,stage1.5,stage 2 相關文件,其中*.stage1_5 多和文件系統相關的文件,如e2fs,jfs,等等

wKiom1YGQ4bQJ8bbAAExdse2DCg774.jpg

Grub Stage 1 數據存儲於硬盤第一個扇區的頭446字節中。

Grub Stage 1.5 相關數據存放MBR最後的32K字節中,這段空間被稱爲MBR GAP,Stage 1.5 包含文件系統的驅動,一旦Stage 1.5加載了,grub 就可以讀取/boot/grub/grub.conf 配置文件,其中包含kernel 和initrd(initial ramdisk) 文件路徑。

Grub Stage 2: 位於磁盤分區/boot/grub下 (系統啓動之初,是無法識別文件系統的,所以需要Stage 1.5 來銜接Stage 1 和 Stage 2)


啓動時,在看到如下界面時候,按e可以進到Groub的選擇菜單界面,可以選擇你想要使用的內核(如果有安裝多內核的話)

默認啓動的內核是在/etc/grub/grub.conf 定義的

wKioL1YGPjei2rDVAABk34d6uiU299.jpg

此時,可移動光標,選擇想要啓動的內核,接下來就會進入內核的加載階段

  wKiom1YGPknDCjCyAAEYKIjt2UU260.jpg

 Grub 配置文件介紹:(/etc/grub.conf)

#boot=/dev/sda
default=0    #默認啓動的內核 ,從0開始編號
timeout=5    #菜單顯示的超時時間
splashimage=(hd0,0)/grub/splash.xpm.gz   #Grub啓動的背景圖
hiddenmenu    #隱藏菜單;註釋掉此行後,Grub引導時,將直接進入菜單選項頁面
title CentOS 6 (2.6.32-504.el6.x86_64)    #啓動時,顯示的系統的名稱
        root (hd0,0)    #指明引導分區路徑
        kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/mapper/vg_host1-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg_host1/lv_root rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_DM  KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg_host1/lv_swap rhgb quiet        #指定內核位置,已經相關配置和選項
        initrd /initramfs-2.6.32-504.el6.x86_64.img    #指明ramdisk的路徑

                                            

第三步:內核(Kernel)加載

類似於Grub,內核加載也是分階段進行的,Kernel 文件是以壓縮的鏡像文件格式存放的,它是一個可執行的bzImage 文件。


內核加載並初始化的過程:

探測可識別到的所有硬件設備

加載硬件驅動程序:(有可能藉助於ramdisk加載驅動)

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

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


initrd (initial ramdisk),

內核爲了裝載系統,需要衆多模塊和驅動,但是爲了保證kernel體積不至於過大,所以內核需要ramdisk 來輔助加載一些驅動。

ramdisk 也是以壓縮的鏡像文件格式存放的,其路徑在/boot 目錄下。

 

接下來解壓ramdisk文件看看其內容:

[root@S2 initrd]# gunzip initramfs-2.6.32-504.el6.x86_64.gz 

wKioL1YGPsnzY2I1AAEucbcYSqY525.jpg

可見其包含有 bin ,etc, init...等等,目錄結構和真正的根 (/)目錄類似;ramdisk 其實就是一個臨時的小的虛擬的根文件系統,它用在Kernel裝載真正的根之前,提供一些必要的驅動程序和模塊


下圖就是ramdisk 文件解壓後的文件結構:

wKioL1YGP0ijSEMuAAYAWh2hjhM357.jpg


第四步: init進程完成各種系統初始化工作

內核加載完成後,啓動系統上第一個進程init ,它是系統上所有其它進程的父進程,它首先會調用/etc/rc.d/rc.sysinit 做系統初始化,接着它會讀取/etc/inittab文件中的運行級別,來執行相應級別需要運行的服務腳本,啓動該啓動的服務。過程如下:

1.執行系統初始化腳本(/etc/rc.d/rc.sysinit),對系統進行基本配置,以讀寫方式重新掛載根文件系統,及其它文件系統

2.執行/etc/rc.d/rc 腳本,其定義了啓動服務的順序是先K(Kill),再S(Start),即先停止,再啓動服務,具體每個運行級別的服務狀態是保存在/etc/rc.d/rc*.c (*取值從0到6) 目錄下,所有文件均是指向/etc/init.d 相應文件的符號鏈接; /etc/init.d,rc.sysinit通過讀取/etc/inittab 文件來確定運行級別,然後去執行對應級別下(/etc/rc.d/rc*.d)的文件

/etc/init.d-> /etc/rc.d/init.d

/etc/rc ->/etc/rc.d/rc

/etc/rc*.d ->/etc/rc.d/rc*.d

/etc/rc.local-> /etc/rc.d/rc.local

/etc/rc.sysinit-> /etc/rc.d/rc.sysinit

3.  執行用戶自定義的開機需要運行的命令(/etc/rc.d/rc.local),任何想要開機運行的命令都可以放在rc.local裏面,開機會自動雲心

4.  啓動終端或X-Window ,打印登錄提示符,等待用戶登錄


參考文檔有:

http://blog.chinaunix.net/uid-23069658-id-3142047.html

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