无忧启动论坛

标题: Windows定制Grub2(包括BIOS和UEFI、自定义Grub2路徑) [打印本页]

作者: 極限驅動    时间: 2014-9-29 17:03
标题: Windows定制Grub2(包括BIOS和UEFI、自定义Grub2路徑)
本帖最后由 極限驅動 于 2014-10-12 22:22 编辑

都知道Grub2的安装和定制大多都要在Linux环境下进行,但是很多地方都没怎么提到Windows下能否定制以及具体细节

在以前看到这个帖子
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=334058
知道在Windows下是可以安装Grub2,但是没提到定制

这是有关Grub2定制的,但是却是在Ubuntu的环境下定制,实际上在Windows系统下的一旦需要定制或是修改就安装Ubuntu,有点不方便
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=310626

這是也是有關Grub2定制的,不過同樣也是Ubuntu的环境下定制
http://forum.ubuntu.org.cn/viewtopic.php?t=324418


后面就自己琢磨这着怎么定制。还好吧,Ubuntu环境和Windows环境下的定制命令几乎没差别,所以命令基本可以参照。

首先,下载Grub2和bootice基本就只用到这两个小东东

Windows下的Grub2 版本是2.02 Beta2
http://alpha.gnu.org/gnu/grub/grub-2.02~beta2-for-windows.zip


【BOOTICE: 启动维护工具】用于安装Grub2
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=57675



下载Windows下的Grub2包,放在哪裡無所謂,为了简洁点我就直接解压到C盘,解压后我的路径是C:\grub-2.02~beta2-for-windows  解壓後在能看到
grub-2.02~beta2-for-windows.png



其中,方便點較為重要的我都用鼠標選中了,下面我簡單解釋下
i386-pc文件夾是BIOS模式的所需要的
i386-efi文件夾是UEFI模式的32Bit
x86_64-efi文件夾是UEFI模式的64Bit
unicode.pf2是Grub2的字體,支持简体、繁體漢字
grub-mkimage.exe自然就是grub-mkimage命令,用於定制Grub2
locale文件夾是語言文件,打開後看裏面文件夾名稱,就能知道有很多由各種語言簡稱命名的文件夾,不過每個文件夾裏面都是相同的名稱grub.mo,後面要自己改壹下,基本只要zh_CN、zh_TW這兩個文件夾
分別把裏面的grub.mo改成和文件夾相對應的名稱
zh_CN文件夾裏面的grub.mo改名為zh_CN.mo
zh_TW文件夾裏面的grub.mo改名為zh_TW.mo


基本就只用到grub-mkimage命令来定制,至于更深层次的,我就没怎么了解,在Windows下可以通过命令   -?或 --help 來獲取其他參數。
需要同時支持BIOS和UEFI模式,然後把Grub2安裝到U盤,(這個U盤只有壹個分區)這是定制目的,下面就開始重點了。

(支持BIOS和UEFI、定制路徑)
先在U盤根目錄基礎上建立些文件夾,先看下面:
EFI>Boot
Grub2>BIOS
Grub2>UEFI_i386-efi
Grub2>UEFI_x86_64-efi

在根目錄建立EFI目的是為了支持UEFI啟動,裏面再建立Boot目錄,用於放置EFI啟動文件,32Bit默認啟動文件名為Bootia32.EFI、64Bit默認啟動文件名為Bootx64.EFI
同樣也在根目錄建立個Grub2文件夾,裏面再分別建立BIOS、UEFI_i386-efi、UEFI_x86_64-efi這叁個目錄,分別用於支持啟動BIOS模式、32Bit的UEFI模式、64Bit的UEFI模式。
以BIOS目錄為例子,不過先看看完成BIOS目錄裏面的結構(這裡標識加粗的文字表示裏面的Fonts目錄、Locale目錄可以直接複製到UEFI_i386-efi文件夾、UEFI_x86_64-efi文件夾):
Grub2>BIOS>I386-PC
Grub2>BIOS>Fonts>unicode.pf2
Grub2>BIOS>Locale>zh_CN.mo
Grub2>BIOS>Locale>zh_TW.mo

下面就來開始手動建立

找到解壓到C盤的Grub2包,把裏面的i386-pc文件夾整個複製到這個BIOS目錄中(裏面有很多模塊)
這樣就完成了這第壹步
Grub2>BIOS>I386-PC

把Grub2包裏的i386-efi文件夾複製到UEFI_i386-efi文件夾
把Grub2包裏的x86_64-efi文件夾複製到UEFI_x86_64-efi文件夾
自然就完成
Grub2>UEFI_i386-efi>i386-efi
Grub2>UEFI_x86_64-efi>x86_64-efi


BIOS目錄中建立Fonts文件夾,然後把unicode.pf2字體複製到Fonts文件夾裏面
第貳步也完成了
Grub2>BIOS>Fonts>unicode.pf2


BIOS目錄中建立Locale文件夾,然後把Grub2其中的語言文件zh_CN.mo、zh_TW.mo複製到Locale文件夾中(在上面有提到Grub2的locale文件夾裏面的zh_CN文件夾、zh_TW文件夾以及zh_CN.mo、zh_TW.mo)
第叁部也完成了
Grub2>BIOS>Locale>zh_CN.mo
Grub2>BIOS>Locale>zh_TW.mo

這叁步就完成了Grub2的路徑定制



最後就是用grub-mkimage命令定制
這裡我再詳細點
BIOS模式定制的是內核文件Core.img,後面會用到啟動文件Boot.img,用這兩個文件以二進制合并成G2ldr
UEFI模式定制的是EFI啟動文件,有點不同的是UEFI是分64Bit啟動文件和32Bit啟動文件
同樣的,這裡我先直接給出定制的命令(基本可以照搬),後面我再解釋

BIOS模式定制:
注意了,BIOS模式對應的是MBR分區表,那麼啟動扇區的扇區數量為63
因為啟動扇區數量為63,有時定制BIOS模式時定制的模塊可以不要太多,基本上取biosdisk part_msdos fat exfat ntfs這些模塊就可以了,還有下面給出的定制命令,其實也能直接用的,原因後面再講

grub-mkimage.exe -d I386-PC -p (hd0,1)/Grub2/BIOS -o Core.img -O i386-pc biosdisk part_msdos fat exfat ext2 ntfs normal iso9660 search_fs_file

UEFI模式的32Bit定制:
grub-mkimage.exe -d i386-efi  -p (hd0,1)/Grub2/UEFI_i386-efi -o I386-EFI.EFI -O  i386-efi part_gpt part_msdos disk fat exfat ext2 ntfs appleldr hfs iso9660 normal search_fs_file

UEFI模式的64Bit定制:
grub-mkimage.exe -d x86_64-efi  -p (hd0,1)/Grub2/UEFI_x86_64-efi -o X86_64-EFI.EFI -O x86_64-efi part_gpt part_msdos disk fat exfat ext2 ntfs appleldr hfs iso9660 normal search_fs_file

grub-mkimage命令參數解釋(注意,大小寫,不能搞混,以及路徑用的是正斜杠 / ):
-d 表示在定制的模式時需要用到的文件所在的路徑,壹般不用給完整路徑,直接給出和模式對應的文件夾名稱就行了,在定制時會默認的路徑,在Windows下,我的Grub2包放在C盤,那麼路徑是C:\grub-2.02~beta2-for-windows,模式對應的路徑默認自然就是C:\grub-2.02~beta2-for-windows\i386-pc
-p 定制後對應的路徑,因為涉及Grub2的prefix变量值以及Grub2啟動路勁,所以這裡才是基本完成路徑定制,不過還有些問題我後面再講
-o (這裡是小o) 表示定制後輸出的文件名稱以及路徑,壹般只寫文件名稱就行,在Windows下,會直接輸出到Grub2包所在的路徑中
-O (這裡是大O)表示定制模式,後面接的自然就是包含的模塊,可以自己在模式對應的目錄裏面查找并選需要的模塊

最後,就可以打開Windows下的命令行,開始執行定制命令了,不過命令行的路徑壹般的默認路徑大多是C:\Windows\System32,還不能直接執行定制命令。
默認.png

要轉到Grub2包的路徑中,我的在C盤,執行如下命令:
cd /d c:\grub-2.02~beta2-for-windows
轉後如如下:
修改後.png

現在可以開始執行定制的命令了,先把BIOS模式定制的命令照搬

grub-mkimage.exe -d I386-PC -p (hd0,1)/Grub2/BIOS -o Core.img -O i386-pc biosdisk part_msdos fat exfat ext2 ntfs normal iso9660 search_fs_file

命令執行完後,會在我的C:\grub-2.02~beta2-for-windows路徑中生成個Core.img,文件 86.5 KB大小,後面會詳細講下這個文件
Core.png

當然,如果是UEFI模式定制,就簡單了,定制命令直接照搬,直接生成EFI啟動文件就徹底完成了。
在執行完定制UEFI模式的32Bit和64Bit命令後,會看到於Grub2包裏面的I386-EFI.EFI和X86_64-EFI.EFI兩個EFI啟動文件,大小無所謂
EFI.png

I386-EFI.EFI 更名為Bootia32.EFI
X86_64-EFI.EFI更名為Bootx64.EFI
注意:默認下UEFI模式是按照EFI啟動文件的名稱來引導啟動的,32Bit默認引導Bootia32.EFI、64Bit默認引導Bootx64.EFI
更名完後直接放置到前面提到的用於EFI啟動的目錄
EFI>Boot

放置完,UEFI模式的定制就徹底完成。BIOS模式還有個步驟要完成


在這裡就主要講BIOS模式的最後壹步

步驟中,已經生成BIOS模式所需的內核文件Core.img,其大小是86.5 KB
生成的只是單單BIOS模式的內核文件,還無法引導Grub2,還需要個啟動文件Boot.img,該文件很小,只有512Byte,位於i386-pc文件夾,該文件的作用是啟動Grub2,然後加載內核文件Core.img
所以這裡的最後壹步就是把啟動文件Boot.img和內核文件Core.img以二進制形式合并,合并後的文件我個人稱呼為扇區文件G2ldr(不知道這個文件有沒標準的名稱),因為可以直接導入到扇區,來引導啟動Grub2,也可以由GRUB4DOS直接加載這個扇區文件來啟動Grub2。
老樣子,先給出命令(如果命令行的路徑不是Grub2包所在的路徑,就先要修改命令行的路徑,前面有提到)
Copy /B i386-pc\Boot.img+Core.img G2ldr

Copy是Windows下的複製命令,自帶了個二進制的參數 /B ,加上去就表示二進制,文件在命令行中已經轉入到Grub2包所在的路徑,啟動文件Boot.img位於Grub2包裏的i386-pc文件夾,加上前面生成的內核文件Core.img,在後面只有壹個名稱G2ldr,表示兩個文件以二進制形式合并,其實名稱不一定非要取名G2ldr喜歡可以自己改。

注意:合并時必須以二進制方式,并且時啟動文件Boot.img必須放在內核文件Core.img前面才能進行合并,也就是說內核文件Core.img壹但放在啟動文件Boot.img前面,就會出現無法引導Grub2的情況,為了防止錯物的命令被複製,我就上圖了
錯誤Grub2.png

合并後能看到扇區文件G2ldr,大小是87.0 KB
G2ldr.png


合并完了也就基本完成BIOS模式的,這個文件能夠可以導入到扇區,也可以由GRUB4DOS加載啟動。
順便把定制出的內核文件Core.img複製到Grub2>BIOS>I386-PC這個文件夾裏面,扇區文件G2ldr複製到Grub2>BIOS文件夾中

那現在就來導入到扇區,前面提到過【BOOTICE: 启动维护工具】是用來安裝Grub2的,安裝方式我就上圖解說:
目标磁盘選擇U盤,不要選錯了,然後選擇主引导记录(M)
BOOTICE_1.png

在主引导记录介面選擇恢复MBR(R)
BOOTICE_2.png

最後就可以選擇前面合并好的扇區文件G2ldr,請注意下打扇區文件G2ldr後的圖
BOOTICE_3.png

看到沒有,在恢复扇区数:的數字框中可以看到扇區數量為175,徹底大於前面說的63,其實也無所謂了,在数字框中手動填入63就可以,Grub2還是可以啟動的
BOOTICE_4.png

如果不修改為63,而是直接把175扇區數量寫入的話,Grub2會無法啟動,其他問題嘛(┬_┬)。。。。可能會把U盤的其他數據損壞


另外我這裡再給出個不超過63扇區的定制命令:
grub-mkimage.exe -d I386-PC -p (hd0,1)/Grub2/BIOS -o Core.img -O i386-pc biosdisk part_msdos fat exfat ntfs

內核文件Core.img,大小30.5 KB
合并后的扇区文件G2ldr,大小是31.0 KB
用bootice打開後會看到扇區大小剛好是63
63.png

这壹步完成后就基本完成了(BIOS和UEFI、自定義Grub2路徑)基本上就能啟動了。
不過還差個Grub.CFG文件,是個文本文件,改個後綴名就行了,編碼是UTF8,文件放置在和模式對應自定義的文件夾裏面,我這裡放置在Grub2>BIOS裏面,Grub.CFG文件配置大多都通用,只是注意路徑用的都是正斜杠 /
在論壇裏面有很多例子可以用,基本上只要拿過來後,只要自己修改路徑
BIOS模式的Grub.CFG文件配置
set pager=1
insmod all_video
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
insmod font
insmod gfxterm
insmod gfxmenu
insmod gettext
insmod jpeg
insmod png

#加载unicode字体显示中文
loadfont /Grub2/BIOS/Fonts/unicode.pf2
set locale_dir=/Grub2/BIOS/Locale
set lang=zh_CN

#设置分辨率
set gfxmode=auto
terminal_output gfxterm
#设置背景图片
background_image /

#倒计时
set timeout=300

#颜色
set color_normal=green/black
set color_highlight=white/cyan


UEFI模式的Grub.CFG文件配置(這個注意了,因為有32Bit和64Bit,對應的路徑需要自己改壹下)
set pager=1
insmod all_video
insmod video_bochs
insmod video_cirrus
insmod efi_gop
insmod efi_uga
insmod font
insmod gfxterm
insmod gfxmenu
insmod gettext
insmod jpeg
insmod png

#加载unicode字体显示中文
loadfont /Grub2/UEFI_i386-efi/Fonts/unicode.pf2
set locale_dir=/Grub2/UEFI_i386-efi/Locale
set lang=zh_CN

#设置分辨率
set gfxmode=auto
terminal_output gfxterm
#设置背景图片
#background_image /

#倒计时
set timeout=300

#颜色
set color_normal=green/black
set color_highlight=white/cyan




這裡最後我說壹下關於路徑的問題
目前GRUB4DOS和Grub2中(hdX,Y)表示第幾個硬碟第幾個分區
X表示第幾個硬碟
Y表示第幾個分區,不過
在GRUB4DOS中第壹塊硬碟的第壹分區的表示(hd0,0)
在Grub2裏第壹塊硬碟的第壹分區改變成(hd0,1)(我自己有點不明白為什麼要這樣改變,這個表達方式明明可以延續下來)


在Grub2啟動時是以Grub2自身為中心,來確定第幾個硬碟至於第幾個分區會按照分區是否隱藏來確定,所以在grub-mkimage命令定制時 -p 這個參數用(hd0,1)來表示U盤是第壹個硬碟上的壹個分區,如果有兩個分區,并且Grub2安裝到第貳個分區可以用(hd0,2)表示

U盤如果有特別結構帶多個分區的注意了
如果U盤做成啟動盤,并且有特別結構帶有多個分區,同時在隱藏和顯示分區之前來回切換U盤的分區時,在使用基於Qemu的啟動器來測試時會發現有時無法啟動Grub2,原因在於把U盤上哪個分區顯示出來哪個就是(hd0,1)有可能導致Grub2基本啟動後找不到相對應的路徑
如果說第壹個分區是正常使用的也就是平時看得到的,它是(hd0,1),第貳個分區是隱藏的,安裝了Grub2,它是(hd0,2),平時能夠正常啟動是因為Grub2所在的分區是隱藏的正常順序位於(hd0,2)
但是在修改時,把第壹分區隱藏了,把第貳分區顯示了,那它們之前的分區順序就反過來了,變成正常使用的是(hd0,2),安裝Grub2的的是(hd0,1),在用Qemu測試時自然就因為Grub2找不到自己的路徑從而無法正常啟動
決解方法是,在定制路徑時可以不要(hd0,1)、(hd0,2)。。。這些來表示位置,老樣子,直接給出定制命令:

BIOS模式定制:
grub-mkimage.exe -d I386-PC -p /Grub2/BIOS -o Core.img -O i386-pc biosdisk part_msdos fat exfat ext2 ntfs normal iso9660 search_fs_file

UEFI模式的32Bit定制:
grub-mkimage.exe -d i386-efi  -p /Grub2/UEFI_i386-efi -o I386-EFI.EFI -O  i386-efi part_gpt part_msdos disk fat exfat ext2 ntfs appleldr hfs iso9660 normal search_fs_file

UEFI模式的64Bit定制:
grub-mkimage.exe -d x86_64-efi  -p /Grub2/UEFI_x86_64-efi -o X86_64-EFI.EFI -O x86_64-efi part_gpt part_msdos disk fat exfat ext2 ntfs appleldr hfs iso9660 normal search_fs_file

其實就是把路徑中的(hd0,1)這些去掉,讓Grub2啟動時模糊查找,自然就能正常啟動,不會受到U盤分區隱藏顯示的影響。



上面的东西就是我自己在Windows下完成的Grub2定制时发现的错误以及解决的,最後我自己是成功启动了,不过我自己没有UEFI环境,用的都是Qemu测试的,都成功启动了。
我自己也是搞了很久才成功的,上面有些地方講的方面可能有點多餘,也不清楚哪些地方出錯,如果知道的話,那麼各位請指出來。
希望上面東西對各位在Windows定制Grub2有幫助,不知道講的夠不夠詳細

小更新:
最後我要特別感謝Qemu启动器的作者:阿弥陀佛
能同時支持BIOS和UEFI 32Bit、64Bit,要是沒這個Qemu启动器,定制時的測試,真是的個大問題

[原创] 【14.7.31最后更新+源代码】Qemu启动测试器增强版,支持64位,支持EFI,linux内核调试
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=335197

下面是我按照我這個帖子做的定制的Grub2
Grub2目錄中的扇區文件G2ldr,大小31.0 KB,扇區數量63
Grub2>BIOS目錄的扇區文件G2ldr,大小87.0 KB,扇區數量175
Grub2>BIOS>I386-PC目錄的內核文件Core.img,大小86.5 KB,和啟動文件Boot.img合并後就是Grub2>BIOS目錄的扇區文件G2ldr

我分割壓縮了,把下面的最後面的7Z後綴名去掉,就能一起解壓了
Windows定制Grub2(包括BIOS和UEFI、自定义Grub2路徑).7z.001.7Z (1 MB, 下载次数: 3526)