Linux開機流程分析與Grub引導程式
開機,對於我們每個人來說,是簡單得不能再簡單得事,可是,整個開機的過程會經曆怎樣一個流程呢?
一般來說,linux的開機大致上經曆以下的流程:
1. 載入BIOS的硬體資訊,進行自檢,並依據設定獲得第一個啟動裝置
2. 讀取並執行啟動裝置內的MBR的boot Loader(grub)
3. Bootloader載入kernel,kernel會檢測硬體和載入驅動程式。
4. 核心啟動init程式
5. 系統初始化:(/etc/init/rcS.conf exec /etc/rc.d/rc.sysinit)
6. Init找到/etc/inittab檔案,確定系統預設的運行層級(/etc/init/rcS.conf exec telinit $runlevel)
7. 觸發響應的runlevel事件(/etc/init/rc.conf exec /etc/rc.d/rc $runlevel)
8. /etc/rcX.d中的指令碼按預先設定的優先順序次序啟動(實質上就是服務)
9. 最後執行/etc/rc.d/rc.local(自訂的引導啟動程式)
10. 載入終端或X-Window介面
MBR和bootLoader
當BIOS自檢完成之後會執行MBR內的boot loader。我們知道,MBR一般都裝在硬碟的主開機磁區中(0柱面,0磁頭,1扇區),總共512個位元組,下面給出一個MBR的組成圖:
Boot Loader
由可知,boot loader在MBR內佔了446個位元組,它的主要作用就是從檔案系統中載入系統的核心到主儲存空間中去執行。由此可知,boot loader可以引導系統的一個前提就是它能識別作業系統上的檔案系統。由於MBR的boot loader只有一份,而硬碟上得作業系統可能有多個,那麼,當MBR中的boot loader只能識別一個作業系統時,如果實現多重啟動呢?
要實現多重啟動,我們還需提前知道的一點是,引導程式並不僅僅只能安裝在MBR中,它還能安裝在檔案系統分區上的super block中。並且,引導程式還可以做到以下兩點:
1)直接載入核心到儲存空間中執行
2)轉交控制權給另一個載入程式
這裡,也許大家就明白了多重啟動是如何?的。假如我們的系統中有windows和linux這兩個作業系統,windows安裝在/dev/sda1中,linux安裝在/dev/sda2中。它們的superblock中也安裝了引導程式。MBR中的引導程式是可以同時識別這兩個作業系統的檔案系統的GRUB程式。
那麼,MBR的grub可以做到以下幾點:
1)直接載入/dev/sda2的/boot/vmlinux核心來啟動
2)將控制權轉交給/dev/sda2的super block中的boot loader來管理
3)將控制權轉交給/dev/sda1(windows)的super block中的boot loader來管理
注意:linux可以選擇將boot loader安裝在MBR或super block中,而windows預設會強制在MBR和super block中都安裝boot loader,並且,windows的boot loader預設是不具有控制權轉交功能的,這也是為什麼我們在裝多重系統時,先安裝windows,再安裝Linux的原因了,因為如果後安裝windows,那麼它的boot loader會覆蓋掉MBR中的boot loader。
重點:boot loader的目的就是要載入kernel。
GRUB引導流程
引導程式的功能非常強大,也涉及到了很多的設定檔。可是,我們看到MBR最多隻有512個位元組,那麼它的設定檔案都放置在哪裡呢?
其實,引導載入程式常常分為兩個階段來執行:
Stage1:它是引導載入程式的主程式,實質上就是MBR
Stege2:它是引導載入程式的相關設定檔案,一般來說,設定檔案都放置在/boot下面。
瞭解/boot下面的檔案
在/boot下面放置的就是與啟動相關的檔案。
vimlinuz:這就是最為重要的核心檔案了;
config-2.6.32-71.el6.i686:系統knerl的設定檔,核心編譯完成後儲存的就是這個檔案;
grub:引導程式相關的目錄
initramfs-2.6.32-71.el6.i686.img:虛擬檔案系統你相關檔案,取代了以前的Initrd檔案,用於載入一些核心模組。
System.map-2.6.32-71.el6.i686:系統kernel中的變數對應表
Symvers-2.6.32-71.el6.i686.gz:模組符號資訊
瞭解/boot/grub下的grub.conf檔案
該檔案就是引導程式在載入核心前需要尋找的設定檔,該設定檔大致格式如下:
Default=0
Timeout=5
Splashimage=(hd0,0)/grub/splash.xpm.gz
Hiddenmenu
Title CenOS(vimlinuz-2.6.32-71.el6.i686)
Kernel/vimlinuz-2.6.32-71.el6.i686roroot=UUID=be033dfc-63e2-491e-ae9e-2c884c6fead5
Initrd initramfs-2.6.32-71.el6.i686.img
Default表示開機預設載入的kernel,0表示第一個title,1表示第二個,依次類推
Timeou=5表示如果設定了hiddenmenu,則等待5秒,如果沒有按下任意鍵再載入預設的kernel
Splashimage是選項中選定的背景圖片
TITLE下面就是主要的載入的核心已經鏡像檔案。
注意:當我們grub錯誤而導致無法正常開機時,如開機後進入的時grubshell介面,我們可以手動載入核心。步驟如下:
首先找到/boot/grub的位置:
find /boot/grub
假設是(hd0,0)
然後指定/boot區
Root (hd0,0)
接著載入驅動
Kernel/vimlinuz-2.6.32-71.el6.i686roroot=UUID=be033dfc-63e2-491e-ae9e-2c884c6fead5
Initrd initramfs-2.6.32-71.el6.i686.img
最後,啟動
Boot
這樣,系統就能正常啟動了。
GRUB中的硬碟分區表示方法:
GRUB要求裝置名稱都包含在()之中,硬碟有hd來表示,磁碟片用fd來表示。其次,裝置是從0開始編號,分區也是一樣,裝置和分區中間用’,’隔開。如果沒有制定分區,表示MBR
第一個
(hd0) (hd0,0) (hd0,1)……..
第二個
(hd1) (hd1,0) (hd1,1)……..
.
.
.
.