全世界Linuxer都知道GRUB是什麼東西,但對於MBR引導到GRUB再引導到具體操做系統的這個流程可能有很多朋友就比較迷糊了。這不,cu上一位朋友就發出了這樣一個求助貼:
假如如今一臺電腦上裝了WIN2000系統,那麼我如今在裝上Linux系統和GRUB,那麼假如把GRUB裝在主分區的話,GRUB直接引導 Linux和WIN2000,我是能夠理解的,由於MBR中是GRUB的STAGE1(對不對呢?),MBR經過檢查DPT分區信息引導系統跳轉至DBR (活動分區),我這裏想問的活動分區是何時設的呢?那麼裝GRUB到MBR裏,那原來MBR中的WIN的引導信息是怎麼處理的呢?是否是咱們假如說裝 GRUB到MBR的時候,GRUB就把GRUB所在那個區設置爲了活動分區了呢?而後GRUB引導時候,MBR就找到那個活動分區找到所須要的文件,而後繼續呢?假如說把GRUB裝到其餘分區(非主引導區)的話,那是怎麼樣實現GRUB先啓動的呢?不是先MBR嗎?由於裝到了其餘分區,沒有改主引導區,所以主引導區仍是WIN2000的引導數據啊,怎麼會GRUB先啓動了呢?這是爲何呢?跟活動分區有關係沒有呢?我看資料上寫的是哪一個系統啓動哪一個系統就是活動分區,但是那樣的話,彷佛就解釋不通了啊,就是最最開始這個地方一直不懂,理不清楚。
下面就是cu各個玩家對這個問題分析討論的總結。
首先讓咱們看看傳統的啓動流程:加載並運行Master Boot Record(MBR)主引導區內容(如lilo等)。而後掃描分區表,定位活動分區,並將活動分區上的引導扇區內容加載到內存中執行。
系統引導過程主要由如下幾個步驟組成(以硬盤啓動爲例)
一、 開機;
二、 BIOS加電自檢(POST——Power On Self Test),內存地址爲0fff:0000;
三、 將硬盤第一個扇區(0頭0道1扇區,也就是Boot Sector)讀入內存地址0000:7c00處;
四、 檢查(WORD)0000:7dfe是否等於0xaa55.若不等於則轉去嘗試其餘介質;若是沒有其餘啓動介質,則顯示 「No ROM BASIC」 ,而後死機;
五、 跳轉到0000:7c00處執行MBR中的程序;
六、 MBR先將本身複製到0000:0600處,而後繼續執行;
七、 在主分區表中搜索標誌爲活動的分區。若是發現沒有活動分區或者不止一個活動分區,則中止;
八、 將活動分區的第一個扇區讀入內存地址0000:7c00處;
九、 檢查(WORD)0000:7dfe是否等於0xaa55,若不等於則顯示 「Missing Operating System」,而後中止,或嘗試軟盤啓動;
十、 跳轉到0000:7c00處繼續執行特定系統的啓動程序;
十一、 啓動系統。
裝GRUB到邏輯分區,那麼就必定把GRUB裝入的邏輯分區設爲活動的。不過,這時候,GRUB接管了11步之後的動做:從stage 1.5讀出GRUB.conf。再由配置和用戶選擇決定下一步的引導行爲。
通常安裝GRUB都有兩種狀況,對於安裝到MBR這種狀況而言,GRUB直接覆蓋了原來的MBR引導程序。這也是爲何要換回「原來的 windows的引導方式」,只要用dos引導fdisk /mbr一下就能夠的緣由。爲何能夠這樣作,請注意,1-11步中有兩個地方出現了0000:7c00。不論是dos boot sector仍是nt loader它自己也是從0000:7c00運行的。其實ms當年開發分區管理的這個小程序至關因而在bios引導boot sector中插進去的。GRUB由於也是寫的從0000:7c00這個內存開始的子程序,那麼既能夠被BIOS加載又能夠被dos的MBR加載應該好理解了吧。
開機自檢後,引導權交給了硬盤的MBR,此時GRUB就啓動了。由GRUB來引導windows /Linux均可以。注意:Linux不必定要安裝在活動分區,由於引導程序在MBR!可是windows必定要安裝在活動分區(可引導的 windows),第二個windows能夠不安裝在活動分區,但它的引導文件必定在活動分區。
大致順序是:
GRUB—->windows–>查找引導文件—引導加載—啓動windows
GRUB—->Linux—>查找引導文件(/boot)–>引導加載—啓動Linux
那麼,若是把GRUB安裝到了其它的分區上,不是MBR呢?這是GRUB所裝在的那個主分區必須被設爲活動分區。由於MBR(物理主引導分區)中其實並無 OS相關的引導程序的,一般MBR只是掃描並讀取隨後的分區表,找到相應的活動分區,讀取相應活動分區的第一個扇區的512字節程序並運行,該程序負責進一步引導相應分區的相應系統。所以,大概的運行次序是
BIOS—>MBR—->GRUB—->菜單。
這樣,大致的真實流程就能夠總結以下了:
一、 開機;
二、 BIOS加電自檢(POST——Power On Self Test),內存地址爲0fff:0000;
三、 將硬盤第一個扇區(0頭0道1扇區,也就是Boot Sector)讀入內存地址0000:7c00處;
四、 檢查(WORD)0000:7dfe是否等於0xaa55.若不等於則轉去嘗試其餘介質;若是沒有其餘啓動介質,則顯示 「No ROM BASIC」 ,而後死機;
五、 跳轉到0000:7c00處執行MBR中的程序;
六、 MBR先將本身複製到0000:0600處,而後繼續執行;假如先裝XP後裝Linux,而且Linux沒有裝在MBR,那這個MBR中的數據仍是WIN 寫的數據,它的做用都是下步中所說的做用,就是搜索主分區表中標誌爲活動的分區,那麼這個時候就必須把GRUB所在的主分區設置爲活動的分區,這個時候才能正常的啓動GRUB,而後GRUB的STAGE1在調STAGE1.5和其餘的,從而來引導整個系統。假如說先裝XP後裝Linux,可是GRUB裝在了MBR,那樣STAGE1直接調入內存,STAGE1在調STAGE1.5和STAGE2等,從而來引導系統。那這個時候是不須要將GRUB其餘文件所在的主分區設爲活動分區的,它直接調STAGE1.5等,而後再調STAGE2等,來識別文件系統,從而實現可多啓動。
七、 在主分區表中搜索標誌爲活動的分區。若是發現沒有活動分區或者不止一個活動分區,則中止;
八、 將活動分區的第一個扇區讀入內存地址0000:7c00處;
九、 檢查(WORD)0000:7dfe是否等於0xaa55,若不等於則顯示 「Missing Operating System」,而後中止,或嘗試軟盤啓動;
十、 跳轉到0000:7c00處繼續執行特定系統的啓動程序;
十一、 啓動系統。
一點資料:
能正常工做的GRUB應該包括一下文件:stage一、stage二、*stage1_五、menu.lst。
其中stage1的大小必定是512字節,它要被安裝(也就是寫入)某個硬盤的主引導記錄,或者某個活動分區(這個分區要用fdisk標記成可啓動的)的啓動扇區。stage1的主要的也是惟一的做用就是找到你存放在硬盤上某個地方的stage2文件,來完成後續的工做。
stage2 文件能夠存在在某個特定的文件系統中,好比你分了一個Linux分區,在上面建立一個ext2文件系統,而後把這個文件拷貝到這個分區的某個目錄下。也能夠把stage2直接存放在硬盤的某個位置,也就是未分區的某個地方。不過,好像沒有多少人會這麼作吧。
由於stage1的容量有限(主引導記錄MBR和啓動扇區的大小隻可以是512字節),因此它對文件系統是沒法識別的,那若是你把stage2存放 在 ext2或者fat格式的文件系統上,它如何來找到這個文件呢?這就要用到上面提到的那些stage1_5的文件了,它們負責解釋文件系統。你的 stage2放在什麼格式的文件系統上,就要調用對應的那個stage1_5文件。好比,你把stage2存放在ext2格式的文件系統上,就須要 e2fs_stage1_5;stage2存放在fat格式的文件系統上,就須要fat_stage1_5了。ios