標籤:linux核心
具體要求如下:
Grub的源碼分析:Grub如何支援多個系統和核心的啟動選擇(MultiBoot機制)。
一.GRUB 簡介(介紹主流的系統管理程式grub)
什麼是GRUB;
GNU GRUB 是一個多重作業系統啟動管理器。GNU GRUB 是由GRUB(GRand Unified Bootloader) 派生而來。GRUB 最初由Erich Stefan Boleyn 設計和應用;
“boot loader”是電腦啟動後第一個啟動並執行軟體。它負責載入一個作業系統的核心,並把控制權交給核心。核心則負責剩下的初始過程。
GRUB 一個很重要的特色就是靈活性;GRUB 可以識別檔案系統和二進位格式的核心,所以你可以載入任何作業系統,而不需要記錄核心在
磁碟上的物理位置。
二.GRUB 的現狀
目前 GRUB 分成 GRUB legacy 和 GRUB 2。版本號碼是 0.9x 以及之前的版本都稱為 GRUB Legacy ,從 1.x 開始的就稱為 GRUB 2。目前
GRUB Legacy 已經停止開發了,只是出於一個 bug fix 的狀態,不再增加新的功能了,所有的開發都轉移到 GURB 2 之上了。
三.GRUB 和 stage 檔案(grub1)檔案說明
GRUB 含有幾個 images 檔案,兩個基礎(必需的)stages 檔案(stage1和 stage2),可選的 stage(也稱為 stage1.5),和兩個網路引導的images 檔案
nxgrub 和 pxegrub)。stage1 是用於引導 GURB 的一個必須的映象檔案。通常它是被嵌入到 MBR。或者一個分區的開機磁區之中。因為 PC 的開機磁區是
512 位元組,所以 stage1 也是 512 位元組。stage1 的作用就是從一個本地磁碟載入 stage 2 或者 stage 1.5 。因為大小的限制,stage1 對 stage2 或者
stage 1.5 的位置進行編碼,也就是說,stage1 是無法識別檔案系統格式的。stage2 是 GRUB 的核心映象。它幾乎處理所有的事情(除了載入它自己),
通常可以把他放在檔案系統上,但不是必須的。一旦你執行了 grub-install 安裝了 boot loader ,stage1 檔案就不是必須的,可以把它移動到任意位置,因為它已經被嵌入到 MBR 或者 PBR 了。stage1和stage2 檔案一般位於 /boot/grub/ 目錄下,在這個目錄下還有很多 stage 1.5 的檔案,而且都是以檔案系統格式命名的。它們的目的是在 stage1 和 stage2之間搭建一個橋樑,也就是 stage 1 載入 stage 1.5, stage 1.5 載入 stage2。stage1 和 stage 1.5 的不同之處是 stage1 無法識別檔案系統,stage 1.5 可以。因為 Stage2 太大了,無法被嵌入到某個固定的地區,而 Stage1.5可以安裝在 MBR 之後的位置。
四.多重作業系統引導管理器及工作原理
系統啟動引導管理器,是在電腦啟動後啟動並執行第一個程式,他是用來負責載入、傳輸控制到作業系統的核心,一旦把核心掛載,系統引導管理器的任務就算完成退出,系統引導的其它部份,比如系統的初始化及啟動過程則完全由核心來控制完成;
在X86 架構的機器中,Linux、BSD 或其它Unix類的作業系統中GRUB、LILO 是大家最為常用,應該說是主流;
五.啟動過程
電腦啟動後,BIOS將尋找第一個可開機裝置(通常為硬碟),而後從MBR中載入啟動程式,然後把控制交給這段代碼。MBR位於硬碟的前512位元組內。
GRUB具有兩種不同的啟動方法。一個是直接載入一個作業系統,而另一個是鏈式載入另一個啟動載入器,它然後將真正載入一個作業系統。概括而言,前 者是更期望的,因為你不需要安裝或維護其它啟動載入器,並且GRUB足夠靈活,能從任意硬碟、分區載入一個作業系統。不過,後者有時也是需要的,因為 GRUB不是天然地支援所有現存的作業系統。
GRUB 第一版本
GRUB的步驟1包含在MBR中。由於受MBR的大小限制,步驟一所做的幾乎只是裝載GRUB的下一步驟(存放在硬碟的其它位置)。步驟1既可以直接裝載步驟2,也可以裝載步驟1.5:GRUB的步驟1.5包含在MBR後面的30KB中。步驟1.5載入步驟2。
當步驟2啟動後,它將呈現一個介面來讓使用者選擇啟動的作業系統。這步通常採用的是圖形菜單的形式,如果圖形方式不可用或者使用者需要更進階的控制,可以使用GRUB的命令列提示,通過它,使用者可以手工指定啟動參數。GRUB還可以設定逾時後自動從某一個核心啟動。
GRUB 第二版本
與GRUB 第一版相似的是,boot.img像步驟1一樣在MBR或在開機磁碟分割中,但是,它可以從任何LBA48地址的一個扇區中讀取,它(boot.img)將讀取core.img(產生於diskboot.img)的第一個扇區以用來後面讀取core.img的剩餘部分。core.img正常情況下跟步驟1.5儲存在同一地方並且有著同樣的問題,可是,當他被移動到一個檔案系統或一個純粹的分區時會比在步驟1.5移動或刪除引起更少的麻煩。 一旦完成讀取,core.img會讀取預設的設定檔和其他需要的模組。
當GRUB啟動後
一旦選擇了啟動選項,GRUB把選擇的核心載入記憶體並把控制交給核心。在此步驟中,對於Windows之類不支援多啟動標準的作業系統,GRUB也 可以通過鏈式啟動把控制傳給其它啟動器。在這種情況下,其它作業系統的啟動程式被GRUB儲存了下來;與核心不同,其它作業系統如同直接自MBR啟動。類 似Windows的啟動菜單,也許是另一個啟動管理器,它允許在多個不支援多啟動的作業系統中做進一步的選擇。(在已有Windows的系統上面,或者包 含多個Windows版本的系統上安裝現代的Linux而不修改原作業系統,即屬於這類情況。)
六.Grub如何支援多個系統
6.1如何使用GRUB直接啟動一個OS
多重啟動是GRUB支援的原有格式。出於方便的緣故,還有對Linux,FreeBSD,NetBSD及OpenBSD的支援。如果你希望啟動其它作業系統,你將要鏈式載入它們
運行命令列啟動
鏈式載入一個OS
不支援多重啟動,並且在GRUB中沒有特殊支援的作業系統(存在對Linux,FreeBSD,NetBSD及OpenBSD的特殊支援)必須被鏈式載入,這涉及載入另一個啟動載入器,然後在實模式中跳轉至它。
鏈式載入器命令用於這個目的。通常也需要載入某些GRUB模組來設定合適的根裝置。綜合起來,我們得到像這樣結論,對於在第一個硬碟的第一個分區上的一個Windows系統:
menuentry"Windows" {
insmod chain
insmod ntfs
set root=(hd0,1)
chainloader +1
}
在具有多個硬碟的系統上,可能要求一個額外的變通方案。
鏈式載入僅在PCBIOS及EFI平台上支援。
6.2GNU/Linux
從GRUB啟動GNU/Linux相對簡單,因為它有點類似於啟動一個多重啟動相容OS。
1. 設定 GRUB的根裝置為與GNU/Linux的相同。命令search --file --set /vmlinuz或類似的命令可能可協助你。
2. 使用命令linux載入核心:
grub> linux /vmlinuz root=/dev/sda1
如果你需要指定某些核心參數,只要把它們附加到命令上。例如,把‘acpi’設定到‘off’,要這樣做:
grub> linux /vmlinuz root=/dev/sda1 acpi=off
至於可用選項的完整資訊,參考Linux原始碼樹中的文檔。
在linux命令裡,GRUB使用32位協議。在這個協議中某些BIOS服務,象APM或EDD不可用。在這種情況下,你需要使用linux16:
grub> linux16 /vmlinuz root=/dev/sda1 acpi=off
3. 如果你使用一個initrd,在linux後執行命令initrd:
grub> initrd /initrd
如果你使用linux16,你需要使用initrd16:
grub> initrd16 /initrd
4. 最後,運行命令boot。
注意:如果你使用一個initrd,並向核心指定‘mem=’選項,使得它使用少於真實大小的記憶體,你將也要向GRUB指定相同的記憶體大小。為了使 GRUB知道這個大小,在載入核心之前,運行命令uppermem。
6.3 DOS/Windows
GRUB不能直接啟動DOS或Windows,因此你必須鏈式載入它們。不過,它們的啟動載入器有某些關鍵性的缺陷,因此僅鏈式載入它們可能不能工作。為了對付這個問題,GRUB為你提供了兩個協助函數。
如果你已經在第一個硬碟以外安裝了DOS(或Windows),你必須使用硬碟交換技術,因為OS只能從第一個硬啟動。GRUB所使用的變通方案是命令drivemap,象這樣:
drivemap -s (hd0) (hd1)
這在你的第一個及第二個硬碟間執行一個虛擬交換。
注意:僅當DOS(或Windows)使用BIOS來訪問交換硬碟時,這才起作用。如果OS為硬碟使用一個特殊的磁碟機,這可能不能工作。
如果你在硬碟上安裝了多個DOS或Windows,會引起另一個問題,因為如果有多個用於DOS/Windows的主要磁碟分割,會引起混淆。毫無疑問你應該避免這樣做,不過如果你想這樣做,有一個解決方案。使用分區隱藏/解隱藏技術。
如果GRUB隱藏了一個DOS(或Windows)分區,DOS(或Windows)將忽略 這個分區。如果GRUB解隱藏一個DOS(或Windows)分區,DOS(或Windows)將檢測到這個分區。這樣,如果你已經在第一個硬碟的第一、 第二分區上安裝了DOS(或Windows),並且希望從第一個分區上啟動,像下面那樣做:
parttool (hd0,1) hidden-
parttool (hd0,2) hidden+
set root=(hd0,1)
chainloader +1
parttool ${root} boot+
Boot
核心啟動過程