本文主要介紹的是grub2,在文末對傳統(tǒng)grub進行了簡述,但在grub2的內(nèi)容部分中包含了很多grub2和傳統(tǒng)grub的對比。

如果僅僅是想知道grub2中的boot.img/core.img/diskboot.img/kernel.img或者傳統(tǒng)grub中stage1/stage1_5/stage2文件的作用,請直接跳至相關(guān)內(nèi)容處閱讀。

1.1 基礎(chǔ)內(nèi)容

1.1.1 grub2和grub的區(qū)別

官方手冊原文:https://www.gnu.org/software/grub/manual/html_node/Changes-from-GRUB-Legacy.html#Changes-from-GRUB-Legacy

只說明幾個主要的:

1.配置文件的名稱改變了。在grub中,配置文件為grub.conf或menu.lst(grub.conf的一個軟鏈接),在grub2中改名為grub.cfg。

2.grub2增添了許多語法,更接近于腳本語言了,例如支持變量、條件判斷、循環(huán)。

3.grub2中,設(shè)備名稱從1開始,而在grub中是從0開始的。

4.grub2使用img文件,不再使用grub中的stage1、stage1.5和stage2。

5.支持圖形界面配置grub,但要安裝grub-customizer包,epel源提供該包。

6.在已進入操作系統(tǒng)環(huán)境下,不再提供grub命令,也就是不能進入grub交互式界面,只有在開機時才能進入,算是一大缺憾。

7.在grub2中沒有了好用的find命令,算是另一大缺憾。

1.1.2 命名習(xí)慣和文件路徑表示方式

官方手冊原文:https://www.gnu.org/software/grub/manual/html_node/Naming-convention.html#Naming-convention

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

(fd0)           :表示第一塊軟盤 (hd0,msdos2)    :表示第一塊硬盤的第二個mbr分區(qū)。grub2中分區(qū)從1開始編號,傳統(tǒng)的grub是從0開始編號的 (hd0,msdos5)    :表示第一塊硬盤的第一個邏輯分區(qū) (hd0,gpt1)      :表示第一塊硬盤的第一個gpt分區(qū) /boot/vmlinuz   :相對路徑,基于根目錄,表示根目錄下的boot目錄下的vmlinuz,                 :如果設(shè)置了根目錄變量root為(hd0,msdos1),則表示(hd0,msdos1)/boot/vmlinuz (hd0,msdos1)/boot/vmlinuz:絕對路徑,表示第一硬盤第一分區(qū)的boot目錄下的vmlinuz文件

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

1.1.3 grub2引導(dǎo)操作系統(tǒng)的方式

官方手冊原文:https://www.gnu.org/software/grub/manual/html_node/General-boot-methods.html#General-boot-methods

grub2支持兩種方式引導(dǎo)操作系統(tǒng):

  • 直接引導(dǎo):(direct-load)直接通過默認(rèn)的grub2 boot loader來引導(dǎo)寫在默認(rèn)配置文件中的操作系統(tǒng)

  • 鏈?zhǔn)揭龑?dǎo):(chain-load)使用默認(rèn)grub2 boot loader鏈?zhǔn)揭龑?dǎo)另一個boot loader,該boot loader將引導(dǎo)對應(yīng)的操作系統(tǒng)

一般只使用第一種方式,只有想引導(dǎo)grub默認(rèn)不支持的操作系統(tǒng)時才會使用第二種方式。

1.1.4 grub2程序和傳統(tǒng)grub程序安裝后的文件分布

在傳統(tǒng)grub軟件安裝完后,在/usr/share/grub/RELEASE/目錄下會生成一些stage文件。

[root@xuexi ~]# ls /usr/share/grub/x86_64-redhat/ e2fs_stage1_5      ffs_stage1_5       jfs_stage1_5       reiserfs_stage1_5  stage2             ufs2_stage1_5      xfs_stage1_5 fat_stage1_5       iso9660_stage1_5   minix_stage1_5     stage1             stage2_eltorito    vstafs_stage1_5

在grub2軟件安裝完后,會在/usr/lib/grub/i386-pc/目錄下生成很多模塊文件和img文件,還包括一些lst列表文件。

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

[root@server7 ~]# ls /usr/lib/grub/i386-pc/*.mod | wc -l 257 [root@server7 ~]# ls -lh /usr/lib/grub/i386-pc/*.lst    -rw-r--r--. 1 root root 3.7K Nov 24  2015 /usr/lib/grub/i386-pc/command.lst -rw-r--r--. 1 root root  936 Nov 24  2015 /usr/lib/grub/i386-pc/crypto.lst -rw-r--r--. 1 root root  214 Nov 24  2015 /usr/lib/grub/i386-pc/fs.lst -rw-r--r--. 1 root root 5.1K Nov 24  2015 /usr/lib/grub/i386-pc/moddep.lst -rw-r--r--. 1 root root  111 Nov 24  2015 /usr/lib/grub/i386-pc/partmap.lst -rw-r--r--. 1 root root   17 Nov 24  2015 /usr/lib/grub/i386-pc/parttool.lst -rw-r--r--. 1 root root  202 Nov 24  2015 /usr/lib/grub/i386-pc/terminal.lst -rw-r--r--. 1 root root   33 Nov 24  2015 /usr/lib/grub/i386-pc/video.lst [root@server7 ~]# ls -lh /usr/lib/grub/i386-pc/*.img -rw-r--r--. 1 root root  512 Nov 24  2015 /usr/lib/grub/i386-pc/boot_hybrid.img -rw-r--r--. 1 root root  512 Nov 24  2015 /usr/lib/grub/i386-pc/boot.img -rw-r--r--. 1 root root 2.0K Nov 24  2015 /usr/lib/grub/i386-pc/cdboot.img -rw-r--r--. 1 root root  512 Nov 24  2015 /usr/lib/grub/i386-pc/diskboot.img -rw-r--r--. 1 root root  28K Nov 24  2015 /usr/lib/grub/i386-pc/kernel.img -rw-r--r--. 1 root root 1.0K Nov 24  2015 /usr/lib/grub/i386-pc/lnxboot.img -rw-r--r--. 1 root root 2.9K Nov 24  2015 /usr/lib/grub/i386-pc/lzma_decompress.img -rw-r--r--. 1 root root 1.0K Nov 24  2015 /usr/lib/grub/i386-pc/pxeboot.img

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

1.1.5 boot loader和grub的關(guān)系

當(dāng)使用grub來管理啟動菜單時,那么boot loader都是grub程序安裝的。

傳統(tǒng)的grub將stage1轉(zhuǎn)換后的內(nèi)容安裝到MBR(VBR或EBR)中的boot loader部分,將stage1_5轉(zhuǎn)換后的內(nèi)容安裝在緊跟在MBR后的扇區(qū)中,將stage2轉(zhuǎn)換后的內(nèi)容安裝在/boot分區(qū)中。

grub2將boot.img轉(zhuǎn)換后的內(nèi)容安裝到MBR(VBR或EBR)中的boot loader部分,將diskboot.img和kernel.img結(jié)合成為core.img,同時還會嵌入一些模塊或加載模塊的代碼到core.img中,然后將core.img轉(zhuǎn)換后的內(nèi)容安裝到磁盤的指定位置處。

它們之間更具體的關(guān)系見下文。

1.1.6 grub2的安裝位置

官方手冊原文:https://www.gnu.org/software/grub/manual/html_node/BIOS-installation.html#BIOS-installation

嚴(yán)格地說是core.img的安裝位置,因為boot.img的位置是固定在MBR或VBR或EBR上的。

(1).MBR

MBR格式的分區(qū)表用于PC BIOS平臺,這種格式允許四個主分區(qū)和額外的邏輯分區(qū)。使用這種格式的分區(qū)表,有兩種方式安裝GURB:

  1. 嵌入到MBR和第一個分區(qū)中間的空間,這部分就是大眾所稱的"boot track","MBR gap"或"embedding area",它們大致需要31kB的空間;

  2. 將core.img安裝到某個文件系統(tǒng)中,然后使用分區(qū)的第一個扇區(qū)(嚴(yán)格地說不是第一個扇區(qū),而是第一個block)存儲啟動它的代碼。

這兩種方法有不同的問題。

使用嵌入的方式安裝grub,就沒有保留的空閑空間來保證安全性,例如有些專門的軟件就是使用這段空間來實現(xiàn)許可限制的;另外分區(qū)的時候,雖然會在MBR和第一個分區(qū)中間留下空閑空間,但可能留下的空間會比這更小。

方法二安裝grub到文件系統(tǒng),但這樣的grub是脆弱的。例如,文件系統(tǒng)的某些特性需要做尾部包裝,甚至某些fsck檢測,它們可能會移動這些block。

GRUB開發(fā)團隊建議將GRUB嵌入到MBR和第一個分區(qū)之間,除非有特殊需求,但仍必須要保證第一個分區(qū)至少是從第31kB(第63個扇區(qū))之后才開始創(chuàng)建的。

現(xiàn)在的磁盤設(shè)備,一般都會有分區(qū)邊界對齊的性能優(yōu)化提醒,所以第一個分區(qū)可能會自動從第1MB處開始創(chuàng)建。

(2).GPT

一些新的系統(tǒng)使用GUID分區(qū)表(GPT)格式,這種格式是EFI固件所指定的一部分。但如果操作系統(tǒng)支持的話,GPT也可以用于BIOS平臺(即MBR風(fēng)格結(jié)合GPT格式的磁盤),使用這種格式,需要使用獨立的BIOS boot分區(qū)來保存GRUB,GRUB被嵌入到此分區(qū),不會有任何風(fēng)險。

當(dāng)在gpt磁盤上創(chuàng)建一個BIOS boot分區(qū)時,需要保證兩件事:(1)它最小是31kB大小,但一般都會為此分區(qū)劃分1MB的空間用于可擴展性;(2)必須要有合理的分區(qū)類型標(biāo)識(flag type)。

例如使用gun parted工具時,可以設(shè)置為bios_grub標(biāo)識:

12# parted /dev/sda toggle partition_num bios_grub# parted /dev/sda set partiton_num bios_grub on

如果使用gdisk分區(qū)工具時,則分類類型設(shè)置為"EF02"。

如果使用其他的分區(qū)工具,可能需要指定guid,則可以指定其guid為"21686148-6449-6e6f-744e656564454649"。

下圖是某個bios/gpt格式的bios boot分區(qū)信息,從中可見,它大小為1M,沒有文件系統(tǒng),分區(qū)表示為bios_grub。

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

下圖為gpt磁盤在圖形界面下安裝操作系統(tǒng)時創(chuàng)建的Bios boot分區(qū)。

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

1.1.7 進入grub命令行

在傳統(tǒng)的grub上,可以直接在bash下敲入grub命令進入命令交互模式,但grub2只能在系統(tǒng)啟動前進入grub交互命令行。

按下e見可以編輯所選菜單對應(yīng)的grub菜單配置項,按下c鍵可以進入grub命令行交互模式。

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

1.2 安裝grub2

官方手冊原文:https://www.gnu.org/software/grub/manual/html_node/Installing-GRUB-using-grub_002dinstall.html#Installing-GRUB-using-grub_002dinstall

這里的安裝指的不是安裝grub程序,而是安裝Boot loader,但一般都稱之為安裝grub,且后文都是這個意思。

1.2.1 grub安裝命令

安裝方式非常簡單,只需調(diào)用grub2-install,然后給定安裝到的設(shè)備名即可。

shell> grub2-install /dev/sda

這樣的安裝方式,默認(rèn)會將img文件放入到/boot目錄下,如果想自定義放置位置,則使用--boot-directory選項指定,可用于測試練習(xí)grub的時候使用,但在真實的grub環(huán)境下不建議做任何改動。

shell> grub2-install --boot-director=/mnt/boot /dev/fd0

如果是EFI固件平臺,則必須掛載好efi系統(tǒng)分區(qū),一般會掛在/boot/efi下,這是默認(rèn)的,此時可直接使用grub2-install安裝。

shell> grub2-install

如果不是掛載在/boot/efi下,則使用--efi-directory指定efi系統(tǒng)分區(qū)路徑。

shell> grub2-install --efi-directory=/mnt/efi

grub2-install實際上是一個shell腳本,用于調(diào)用其他工具,真正的功能都是其他工具去完成的,所以如果非常熟悉grub內(nèi)部命令和機制,完全可以不用grub2-install。

對應(yīng)傳統(tǒng)的grub安裝命令為grub-install,用法和grub2-install一樣。

1.2.2 各種img和stage文件的說明

官方手冊原文:https://www.gnu.org/software/grub/manual/html_node/Images.html#Images

img文件是grub2生成的,stage文件是傳統(tǒng)grub生成的。下面是各種文件的說明。

1.2.2.1 grub2中的img文件

grub2生成了好幾個img文件,有些分布在/usr/lib/grub/i386-pc目錄下,有些分布在/boot/grub2/i386-pc目錄下,它們之間的關(guān)系,相信看了下文之后就會明白了。

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

下圖描述了各個img文件之間的關(guān)系。其中core.img是動態(tài)生成的,路徑為/boot/grub2/i386-pc/core.img,而其他的img則存在于/usr/lib/grub/i386-pc目錄下。當(dāng)然,在安裝grub時,boot.img會被拷貝到/boot/grub2/i386-pc目錄下。

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

(1)boot.img

在BIOS平臺下,boot.img是grub啟動的第一個img文件,它被寫入到MBR中或分區(qū)的boot sector中,因為boot sector的大小是512字節(jié),所以該img文件的大小也是512字節(jié)。

boot.img唯一的作用是讀取屬于core.img的第一個扇區(qū)并跳轉(zhuǎn)到它身上,將控制權(quán)交給該扇區(qū)的img。由于體積大小的限制,boot.img無法理解文件系統(tǒng)的結(jié)構(gòu),因此grub2-install將會把core.img的位置硬編碼到boot.img中,這樣就一定能找到core.img的位置。

(2)core.img

core.img根據(jù)diskboot.img、kernel.img和一系列的模塊被grub2-mkimage程序動態(tài)創(chuàng)建。core.img中嵌入了足夠多的功能模塊以保證grub能訪問/boot/grub,并且可以加載相關(guān)的模塊實現(xiàn)相關(guān)的功能,例如加載啟動菜單、加載目標(biāo)操作系統(tǒng)的信息等,由于grub2大量使用了動態(tài)功能模塊,使得core.img體積變得足夠小。

core.img中包含了多個img文件的內(nèi)容,包括diskboot.img/kernel.img等。

core.img的安裝位置隨MBR磁盤和GPT磁盤而不同,這在上文中已經(jīng)說明過了。

(3)diskboot.img

如果啟動設(shè)備是硬盤,即從硬盤啟動時,core.img中的第一個扇區(qū)的內(nèi)容就是diskboot.img。diskboo.img的作用是讀取core.img中剩余的部分到內(nèi)存中,并將控制權(quán)交給kernel.img,由于此時還不識別文件系統(tǒng),所以將core.img的全部位置以block列表的方式編碼,使得diskboot.img能夠找到剩余的內(nèi)容。

該img文件因為占用一個扇區(qū),所以體積為512字節(jié)。

(4)cdboot.img

如果啟動設(shè)備是光驅(qū)(cd-rom),即從光驅(qū)啟動時,core.img中的第一個扇區(qū)的的內(nèi)容就是cdboo.img。它的作用和diskboot.img是一樣的。

(5)pexboot.img

如果是從網(wǎng)絡(luò)的PXE環(huán)境啟動,core.img中的第一個扇區(qū)的內(nèi)容就是pxeboot.img。

(6)kernel.img

kernel.img文件包含了grub的基本運行時環(huán)境:設(shè)備框架、文件句柄、環(huán)境變量、救援模式下的命令行解析器等等。很少直接使用它,因為它們已經(jīng)整個嵌入到了core.img中了。注意,kernel.img是grub的kernel,和操作系統(tǒng)的內(nèi)核無關(guān)。

如果細心的話,會發(fā)現(xiàn)kernel.img本身就占用28KB空間,但嵌入到了core.img中后,core.img文件才只有26KB大小。這是因為core.img中的kernel.img是被壓縮過的。

(7)lnxboot.img

該img文件放在core.img的最前部位,使得grub像是linux的內(nèi)核一樣,這樣core.img就可以被LILO的"image="識別。當(dāng)然,這是配合LILO來使用的,但現(xiàn)在誰還適用LILO呢?

(8)*.mod

各種功能模塊,部分模塊已經(jīng)嵌入到core.img中,或者會被grub自動加載,但有時也需要使用insmod命令手動加載。

1.2.2.2 傳統(tǒng)grub中的stage文件

grub2的設(shè)計方式和傳統(tǒng)grub大不相同,因此和stage之間的對比關(guān)系其實沒那么標(biāo)準(zhǔn),但是將它們拿來比較也有助于理解img和stage文件的作用。

stage文件也分布在兩個地方:/usr/share/grub/RELEASE目錄下和/boot/grub目錄下,/boot/grub目錄下的stage文件是安裝grub時從/usr/share/grub/RELEASE目錄下拷貝過來的。

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

電腦培訓(xùn),計算機培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

(1)stage1

stage1文件在功能上等價于boot.img文件。目的是跳轉(zhuǎn)到stage1_5或stage2的第一個扇區(qū)上。

(2)*_stage1_5

*stage1_5文件包含了各種識別文件系統(tǒng)的代碼,使得grub可以從文件系統(tǒng)中讀取體積更大功能更復(fù)雜的stage2文件。從這一方面考慮,它類似于core.img中加載對應(yīng)文件系統(tǒng)模塊的代碼部分,但是core.img的功能遠比stage1_5多。

stage1_5一般安裝在MBR后、第一個分區(qū)前的那段空閑空間中,也就是MBR gap空間,它的作用是跳轉(zhuǎn)到stage2的第一個扇區(qū)。

其實傳統(tǒng)的grub在某些環(huán)境下是可以不用stage1_5文件就能正常運行的,但是grub2則不能缺少core.img。

(3)stage2

stage2的作用是加載各種環(huán)境和加載內(nèi)核,在grub2中沒有完全與之相對應(yīng)的img文件,但是core.img中包含了stage2的所有功能。

當(dāng)跳轉(zhuǎn)到stage2的第一個扇區(qū)后,該扇區(qū)的代碼負責(zé)加載stage2剩余的內(nèi)容。

注意,stage2是存放在磁盤上的,并沒有像core.img一樣嵌入到磁盤上。

(4)stage2_eltorito

功能上等價于grub2中的core.img中的cdboot.img部分。一般在制作救援模式的grub時才會使用到cd-rom相關(guān)文件。

(5)pxegrub

轉(zhuǎn)載請注明出處:http://www.cnblogs.com/f-ck-need-u/p/7094693.html

   

http://www.cnblogs.com/f-ck-need-u/p/7094693.html