grub主要作用是找到內核(kernel)與部分核心模塊的鏡像(initrd,主要是sata硬盤驅動之類的模塊),把它們導入內存中運行。kernel與initrd放在文件系統中,因此grub必須有識別相應文件系統的能力。
能正常工作的grub應該包括一下文件:stage1、stage2、*stage1_5、menu.lst。
stage1:執行boot loader主程序(stage1包含解析某個stage1_5,獲取識別stage2文件所在文件系統的能力,stage1_5往往有多個,以支持不同文件系統的讀取。在安裝GRUB的時候,GRUB會根據當前/boot/分區類型,加載相應的stage1_5到0面0磁道的第3扇區。)。 其中stage1要被安裝(也就是寫入)某個硬盤的主引導記錄,或者某個活動分區(這個分區要用fdisk標記成可啟動的)的啟動扇區。
stage2:加載/boot/grub下的menu.lst。stage2文件包含menu.lst。menu.lst中存放了kernel等的位置stage2文件本身可以存在某個特定的文件系統中,比如你分了一個linux分區,在上面創建一個ext2文件系統,然後把這個文件拷貝到這個分區的某個目錄下。
因為stage1的容量有限(主引導記錄MBR和啟動扇區的大小只能夠是512字節),所以它對文件系統是無法識別的,那如果你把stage2存放在ext2或者fat格式的文件系統上,它如何來找到這個文件呢?這就要用到上面提到的那些stage1_5的文件了,它們負責解釋文件系統。你的stage2放在什麼格式的文件系統上,就要調用對應的那個stage1_5文件。比如,你把stage2存放在ext2格式的文件系統上,就需要e2fs_stage1_5;stage2存放在fat格式的文件系統上,就需要fat_stage1_5了。
grub流程:
開機-->CMOS--->MBR(stage1,判斷是否是grub,如果是--->stage1.5,加載設備映像文件(device.map)和菜單背景圖像文件(splash.xpm.gz)--->stage2,用戶選擇--->系統內核)
第一個就是stage1。在MBR扇區(0面0磁道的第1扇區),大小為512字節(446字節代碼+64字節分區表+2字節標志55AA),它負責加載存放於0面0道第2扇區的start程序
第二個是stage1_5。stage1_5負責識別文件系統和加載stage2,所以stage1_5往往有多個,以支持不同文件系統的讀取。在安裝GRUB的時候,GRUB會根據當前/boot/分區類型,加載相應的stage1_5到0面0磁道的第3扇區。stage1_5是由start加載的
第三個是stage2。它負責顯示啟動菜單和提供用戶交互接口,並根據用戶選擇或默認配置加載操作系統內核。同前兩個文件不同,stage2是存放在磁盤上/boot/grub下
第四個是menu.lst(/boot/grub/grub.conf的鏈接)。grub.conf是一個基於腳本的文本文件,其中包含菜單顯示的配置和各個操作系統的內核加載配置。GRUB根據grub.conf顯示啟動菜單,提供同用戶交互界面。GRUB正是根據用戶選擇或默認配置和grub.conf的內核配置加載相應的內核程序,並把控制權交給內核程序,使得內核程序完成真正的操作系統的啟動
GRUB實際上包含兩部分,一部分被安裝在磁盤的特殊扇區,另外一部分則以文件的形式存在:主要包括/sbin/下的grub、grub-install、grub-md5-crypt和grub-terminfo和/usr/bin/mbchk,以及/boot/grub下的設備映像文件(device.map)和菜單背景圖像文件(splash.xpm.gz)。