gzsdbb 发表于 2015-7-9 00:55:16

(求精)关于在windows下定制多分区grub2启动的细微规则

本帖最后由 gzsdbb 于 2015-7-11 09:41 编辑

前几天看了windows下定制grub2相关的帖子
帖子原文http://bbs.wuyou.net/forum.php?mod=viewthread&tid=339411&extra=page%3D1
于是想定制一个udm加grub2的启动u盘 ,苦恼的是照上边的帖子去做一直没有成功的启动
更苦恼的是发帖求助一真没人回答
udm是什么我也不知道怎么说 自己看帖子http://bbs.wuyou.net/forum.php?mod=viewthread&tid=330493&extra=page%3D1
关于udm和grub2的资料都很少 一直没有找到些好的资料 于是把grub2的中文说明书细细看了一次又一次
终于有了小发现
一些不为人注意的东西
说白了就是路径在gurb2下 有两个变量很重要 一个是root 这个变量是指定你现在所在盘 用windows来说就是指定你是c盘还是d盘 .另一个重要变量就是prefix 这个变量是指定你的gurb2的路径 你要加载的模块都在这个目录里i386-pc里(当然EFI同理在相应的UEFI_i386-efi或UEFI_x86_64-efi里 当然grub.cfg也在这个路径里)
   看了http://bbs.wuyou.net/forum.php?mod=viewthread&tid=339411&extra=page%3D1的帖子最下边有一个在定制里指定某个.cfg当默认启动配置,可是这帖子里的只适合于u盘只有一个分区
帖子里说到
I386-PC.CFG文件內容:
search.file /Grub2/BIOS/Grub.CFG root 看这里 这里的命令是查找/Grub2/BIOS目录下的Grub.CFG如果找到第一个就把Grub.CFG所在的分区盘设置为变量root,经过我多次的尝试发现这是错误的,理由我也不清楚,反复的试后发现search.file 返回的只是盘号 如hd0,msdos1,而设置root要(hd0,msdos1) 就是还要加()才行
所以我改了一个这个命令 改成如下
search.file /Grub2/BIOS/Grub.CFG sd
set root=(${sd})
set prefix=/Grub2/BIOS
search.file /Grub2/BIOS/Grub.CFG sd这里意思是查找/Grub2/BIOS/Grub.CFG 找到的第一个盘号(如hd0,msdos1)设置为变量sd (名字可以改)
[这里说一说hd0,msdos1 在grbu2里分区盘号不再是用hd0,1来表示   当然如果你的分区是ext的话 分区号可能是hd0,ext1 这里不再细究 如果你要细究只能自己找资料 我要说的是grub2的分区表达方式已经改成了上边的表示方式 这就是我想说的细则这一]
set root=(${sd})                              这里的意思是设置root变量为上边查找到的盘号(如hd0,msdos1)[上边我说过root的变量设置要加() 所以我先得到变量sd(如hd0,msdos1) 注意sd名字可以改随便 不过不可以是disk root boot   ......还有不得不说一说细则二 我把grub2调用变量改成了${xxx}   而不是$xxx ,不知道为什么,用($xxx)有时候行有时候不行,变量这鬼东西,这前我就死在这里
原帖子里 set prefix=/Grub2/BIOS这个是正确的 这里不用加盘号(比如不用写成${root}/Grub2/BIOS) 当然加上也没问题
配合上边的搜索方式 定制里要加入模块search_fs_file


好了以下我给下我自己的定制方案
我把bois里要加载到内核里的cfg改名为BIOS_PC.CFG
内容里下search -f -n --set=sd /Grub2/BIOS/Grub.CFG
set root=(${sd})
set prefix=/Grub2/BIOS
configfile /Grub2/BIOS/Grub.CFG      这里的意思是调用 /Grub2/BIOS/Grub.CFG 配置文件(这样就能指定调用,要加载configfile模块)

search -f -n --set=sd /Grub2/BIOS/Grub.CFG同理于search.file /Grub2/BIOS/Grub.CFG sd只是所用的模块不同 我这里有的是search模块

核心定制命令
grub-mkimage.exe -d i386-pc -c BIOS_PC.CFG -o Core.img -O i386-pc biosdisk part_msdos fat exfat ext2 ntfs normal iso9660 search configfile


看过前边帖子的都应该知道grub-mkimage.exe 的参数 我这里再啰唆一次
-d 指的是你的模块在所目录(如i386-pc)
-c指的是在核心里加入一个配置文件 (我这里加入的是BIOS_PC.CFG)
-o 指的生成的核心放在哪个目录 没有指定就是放在grud2.02所以的目录(比如 -o acb Core.img 指的是在acb目录里生成Core.img文件.....一般不用指定目录)
         定制里会自动有grub2所以目录里生成Core.img 注意就算你没特别指定目录-o参数还是必要的) 后边写上核心的名字 一般都Core.img当然你可改
-O 这个O是大写 指的是加载后边的模块到内核 比如之前说过的search 和configfile
基本到这里就能在多分区里启动grub2了
接下来就是做grub.cfg的菜单了这是不再多说了 论坛里很多 也不用多说了
下边再给出关于EFI的内置默认文件和定制命令

32位的

EFI_X86.CFG名字可以改 如果改名的话 下边定制命令里的 -c EFI_X86.CFG 名字也要改
内容
search -f -n --set=sd /Grub2/UEFI_i386-efi/Grub.CFG
set root=(${sd})
set prefix=/Grub2/UEFI_i386-efi
configfile /Grub2/UEFI_i386-efi/Grub.CFG
定制命令
grub-mkimage.exe -d i386-efi -c EFI_X86.CFG -o Bootia32.EFI -Oi386-efi part_gpt part_msdos disk fat exfat ext2 ntfs appleldr hfs iso9660 normal search configfile


64位的
EFI_X64.CFG名字可以改 如果改名的话 下边定制命令里的 -c EFI_X64.CFG 名字也要改
内容
search -f -n --set=sd /Grub2/UEFI_x86_64-efi/Grub.CFG
set root=(${sd})
set prefix=/Grub2/UEFI_x86_64-efi
configfile /Grub2/UEFI_x86_64-efi/Grub.CFG
定制命令
grub-mkimage.exe -d x86_64-efi -c EFI_X64.CFG -o Bootx64.EFI -O x86_64-efi part_gpt part_msdos disk fat exfat ext2 ntfs appleldr hfs iso9660 normal search configfile
要注意定制时要先cd到grub2所在目录再输入命令 如果对cmd不是很懂的话不会cd的话 可以新建一个open.bat文件内容写上cmd 然后把这个文件放到grrb2的目录里运行


以上所说的cfg文件编码都是UTF8 NO ROM 请用Notepad++来生成或修改




以上内容都是个人理解 并不代表就是正确的 请各位大侠加以指点 毕竟我也只是只菜鸟


还有本帖子求精!!!!! 管理员 求精求审核

gzsdbb 发表于 2015-7-9 02:56:00

本帖最后由 gzsdbb 于 2015-7-9 03:47 编辑

沙发我占了,其实在grub2里字体和语言文件是可以共用的,就是说bois和efi共用
以我的为例我的言语和字体分别放在/Grud2/Locale和/Grud2/Fonts里
我只要在bios和efi的grub.cfg里分别定义
loadfont /Grub2/Fonts/unicode.pf2
set locale_dir=/Grub2/Locale
set lang=zh_CN
就可以了,然后不用在bois和efi里分别建这些,虽然节省不了多少空间,不过我是处理座你们懂的,至于模块能不能共用,先不研究,其实我也挺忙的!

gzsdbb 发表于 2015-7-9 02:56:00

本帖最后由 gzsdbb 于 2015-7-11 09:35 编辑

占楼备用   帖子上configfile /Grub2/BIOS/Grub.CFG本来想发是当grub2启动后加载指定的cfg,结果又发现特别情况,设定的背景死活不加载!然后按了ESC键就要以了,得出结论当grub2启动过程grub.cfg是最后一步,中间还有其实加载,比如自动加载变量prefix里所有模块!
而我直接用了configfile /Grub2/BIOS/Grub.CFG却跳过了这些,所以........
解决方法,去掉这句,当然只要变量prefix设置没错的话,变量prefix目录下grub.cfg是会自动运行的

gzsdbb 发表于 2015-7-9 02:56:00

本帖最后由 gzsdbb 于 2015-7-9 03:45 编辑

占楼备用,不好意思大家!
关于启动文件的生成建议使用lnxboot.img+内核,因为grub2原本就是linux的东西,用linux的启动代码更好。然boot.img是windows的,cdboot.img是光盘的

Roosevelt122007 发表于 2015-7-9 09:03:34

感谢楼主, 马上试试~

Roosevelt122007 发表于 2015-7-9 10:13:14

试了,还是一样问题!

極限驅動 发表于 2015-7-9 11:09:45

本帖最后由 極限驅動 于 2015-7-9 11:11 编辑

目前貼子中的設定環境是U盤,分區壹個,這算是比較好的條件。當初在別的環境下確實是遇到你們壹樣的問題,只是沒時間去壹壹解決,目前涉及到變量的地方是要多次修改檢驗,否則問題很多
能夠發現問題、解決問題其實都是在幫助大家,很不錯

極限驅動 发表于 2015-7-9 11:12:54

gzsdbb 发表于 2015-7-9 02:56
沙发我占了,其实在grub2里字体和语言文件是可以共用的,就是说bois和efi共用
以我的为例我的言语和字体分 ...

模塊是不能共用的

gzsdbb 发表于 2015-7-9 11:49:06

極限驅動 发表于 2015-7-9 11:12
模塊是不能共用的

谢谢指教现在开始做grub.cfg中 用表达式 也可以共用一个grub.cfg 以后不要做菜单来回修改了

gzsdbb 发表于 2015-7-9 11:49:11

極限驅動 发表于 2015-7-9 11:12
模塊是不能共用的

谢谢指教现在开始做grub.cfg中 用表达式 也可以共用一个grub.cfg 以后不要做菜单来回修改了
页: [1] 2 3
查看完整版本: (求精)关于在windows下定制多分区grub2启动的细微规则