1. 程式人生 > >理解GRUB2工作原理及配置選項與方法

理解GRUB2工作原理及配置選項與方法

GRUB2是借鑑GRUB改寫到更加安全強大到多系統載入程式,現在大部分較新的Linux發行版都是使用GRUB2作為載入程式的。
GRUB2採用了模組化設計,使得GRUB2核心更加精煉,使用更加靈活,同時也就不需要像 GRUB那樣分為stage1,stage1_5,stage2這樣三個階段了。

GRUB2和GRUB相比具有如下一些新特徵:

  1. 無 stage1 stage1.5 stage2
  2. 配置檔案採用新語法,支援指令碼,假如新的命令,配置檔名為 grub.cfg
  3. 配置檔案 grub.cfg不可寫,由 grub2-mkconfig 自動產生,由 update2-grub 維護。
  4. 分割槽號不再從 0開始,而是從 1開始
  5. 支援更多到檔案系統,如:ext4、hfs、ntfs,並可以直接從 lvm和raid中讀取檔案/li>
  6. grub2有更可靠的方法在磁碟上有多系統時發現檔案和目標核心,可以用命令發現系統裝置號或者UUID。
  7. 引入了裝置模組,使得 core 映象保持更小到尺寸
  8. 在啟動時沒有選擇選單的話,按住shift即可強制顯示選單

GRUB2主要映象檔案:
boot.img
boot.img 相當與 GRUB 的 stage1 它被寫入 MBR或 boot分割槽,它不能識別任何檔案系統,在GRUB2安裝時GRUB2核心映象在磁碟中到位置寫入到 boot.img 中,這就使得 boot.img 能夠在不能識別檔案系統的情況下載入核心映象。

cdboot.img
當從CD引導情況下被寫入核心映象第一個扇區到內容,它負責載入其餘的核心映象到記憶體。
diskboot.img
當從磁碟引導情況下被寫入核心映象第一個扇區到內容,它負責載入其餘的核心映象到記憶體。
pxeboot.img
當從網路啟動時使用到的。

kernel.img
此映象包含GRUB2執行時包含的基本工具,框架驅動、檔案控制代碼、環境變數、安全模式命令列解析器等,他可以直接使用但是通常它會被編譯進所有的核心映象中使用。

core.img
這是GRUB2的核心映象,它由grub-mkimage程式將kernel.img和一些模組動態編譯而成,一般情況下他已經包含足夠的模組去訪問/boot/grub,模組機制使得核心映象能保持很小的尺寸。在某種程度上,它可以被視為 GRUB 中的 stage2。

*.mod
這是一些可以動態載入的一些模組,當我們需要時,可以將它們可以被動態載入編譯進核心映象,也可以使用insmod手動載入。他們就代替 GRUB 中的 stage1_5 之類到映象。

安裝 GRUB2
一、grub2-install 指令碼
1.安裝 GRUB 檔案到 /boot/grub2
2.複製/usr/lib/grub/i386-pc/ 目錄下的*.mod、*.lst、*.img到/boot/grub目錄下
3.呼叫grub2-probe掃描計算機並收集磁碟和分割槽資訊
4.呼叫grub2-mkimage構建一個新的new.img
5.grub2-setup把grub的boot.img寫入MBR中,把core.img寫進裝置的第一個扇區
二、grub2-install 不會呼叫 grub2-mkconfig生成grub.cfg 我們需要手動呼叫。
1.grub2-mkconfig指令碼呼叫grub2-mkdevicemap和grub2-probe生成grub.cfg
2.呼叫 grub2-set-default設定進入系統的預設核心
3.呼叫 grub2-mkdevicemap生成新的device.map,grub-mkdevicemap程式可以建立
device.map檔案,在執行grub-install時會自動執行他以建立映像關係,如果檔案不存在,
則會讀取/boot/grub2/devicd.map這個檔案,如果映像檔案存在,
則grub讀取他建立BIOS drives to OS drives

GRUB2配置
GRUB2不再使用 menu.list,而是使用全新的配置檔案 /boot/grub2/grub.cfg,檔案許可權為 444,其目的就是為避免手動更新,我們可以藉助 grub2-mkconfig -o /boot/grub2/grub.cfg 命令來更新。/boot/grub2 下到模組可以按需自動載入,模組可以在配置檔案中配置,每個模組以 ### BEGIN /etc/grub.d/module_config_name ###開始,以### END /etc/grub.d/module_config_name ### 結束,這些對應的模組檔案位於 /etc/grub.d目錄之下,次目錄下的檔名前面到數字決定了檔案的執行順序,數字越小越先執行,自定義選項在40_custom中定義,這些檔案必須有執行許可權才會被update-grub讀取,並把配置合併到grub.cfg中。

/etc/grub.d/00_header
配置初始的顯示專案,如預設選項,時間限制等,一般由/etc/default/grub匯入,一般不需要配置

/etc/grub.d/05_debian_theme
配置引導畫面,文字顏色等主題

/etc/grub.d/10_linux
定位當前作業系統使用中的root裝置核心的位置

30_os-prober
用來搜尋linux和其他系統,此指令碼中的變數用來指定在/boot/grub/grub.cfg 和 grub2選單中的名稱顯示方式,可以修改/etc/default/grub光比這個指令碼

40_custom
用來加入使用者自定義的選單樣板,將會在執行update-grub時更新至grub.cfg中

41_custom
判斷custom.cfg此配置檔案是否存在,如果存在就載入它

GRUB2在每次生成grub.cfg的時候,都會檢查並設定 /etc/default/grub 配置選項,我們可以通過修改/etc/default/grub來改變 GRUB2到行為。
常用配置選項有以下這些:
GRUB_DEFAULT
制定預設選單選擇項,可以是從0開始數字,也可以是 title 後面的字串,
當值是‘saved’時有特殊含義:預設的選單選則項會被儲存在GRUB_SAVEDEFAULT中,
下次啟動時會從這個值啟動。當值為saved時可以用grub2-set-default和grub2-reboot來設定預設啟動項,
grub2-set-default到下次修改前都有效,grub2-reboot下次啟動時生效

GRUB_SAVEDEFAULT
只有這個值是true,GRUB_DEFAULT是saved時才會生效

GRUB_TIMEOUT
選擇選單的顯示時間,預設是5,值是0表示不顯示選單選項,值是-1表示無限等待使用者選擇

GRUB_HIDDEN_TIMEOUT
GRUB2第一次執行時會尋找其他作業系統,如果沒有檢測到則會將選單隱藏,
如果有其他作業系統才會顯示選單,如果引數大於0,則會等待響應的秒數,
但是不會顯示選單,可以按住shift顯示選單。

GRUB_DISTRIBUTOR
選單中的描述名稱,採用命令lsb_release判斷,應該是紅帽系列的,如果不是就歸為Debian

GRUB_CMDLINE_LINUX
此行將追加到所有的linux 定義核心行的後面,不論是救援模式還是一般模式

GRUB_CMDLINE_LINUX_DEFAULT
次選項只會追加在一般模式後面,同上

GRUB_TERMINAL=console
啟用console,預設不啟用

GRUB_DISABLE_LINUX_UUID=true
在GRUB2中指定root時可以使用UUID,預設不啟用

GRUB_GFXMODE=640×480
圖形化選單的解析度,預設不啟用

GRUB_DISABLE_LINUX_RECOVERY=true
禁止顯示救援模式