无忧启动论坛

标题: (求精)关于在windows下定制多分区grub2启动的细微规则 [打印本页]

作者: gzsdbb    时间: 2015-7-9 00:55
标题: (求精)关于在windows下定制多分区grub2启动的细微规则
本帖最后由 gzsdbb 于 2015-7-11 09:41 编辑

前几天看了windows下定制grub2相关的帖子
帖子原文http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1
于是想定制一个udm加grub2的启动u盘 ,苦恼的是照上边的帖子去做一直没有成功的启动
更苦恼的是发帖求助一真没人回答
udm是什么我也不知道怎么说 自己看帖子http://bbs.wuyou.net/forum.php?m ... &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?m ... &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 -O  i386-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
本帖最后由 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
本帖最后由 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
本帖最后由 gzsdbb 于 2015-7-9 03:45 编辑

占楼备用,不好意思大家!
关于启动文件的生成建议使用lnxboot.img+内核,因为grub2原本就是linux的东西,用linux的启动代码更好。然boot.img是windows的,cdboot.img是光盘的
作者: Roosevelt122007    时间: 2015-7-9 09:03
感谢楼主, 马上试试~
作者: Roosevelt122007    时间: 2015-7-9 10:13
试了,还是一样问题!
作者: 極限驅動    时间: 2015-7-9 11:09
本帖最后由 極限驅動 于 2015-7-9 11:11 编辑

目前貼子中的設定環境是U盤,分區壹個,這算是比較好的條件。當初在別的環境下確實是遇到你們壹樣的問題,只是沒時間去壹壹解決,目前涉及到變量的地方是要多次修改檢驗,否則問題很多
能夠發現問題、解決問題其實都是在幫助大家,很不錯
作者: 極限驅動    时间: 2015-7-9 11:12
gzsdbb 发表于 2015-7-9 02:56
沙发我占了,其实在grub2里字体和语言文件是可以共用的,就是说bois和efi共用
以我的为例我的言语和字体分 ...

模塊是不能共用的
作者: gzsdbb    时间: 2015-7-9 11:49
極限驅動 发表于 2015-7-9 11:12
模塊是不能共用的

谢谢指教  现在开始做grub.cfg中 用表达式 也可以共用一个grub.cfg 以后不要做菜单来回修改了
作者: gzsdbb    时间: 2015-7-9 11:49
極限驅動 发表于 2015-7-9 11:12
模塊是不能共用的

谢谢指教  现在开始做grub.cfg中 用表达式 也可以共用一个grub.cfg 以后不要做菜单来回修改了
作者: devilma    时间: 2015-7-9 17:17
不错!共同努力……就会解决一部分问题
作者: wg0517    时间: 2015-7-20 09:43
我是共用一个Grub.cfg再在Grub.cfg里分别指向EFI.cfg和Bios.cfg,最终只要修改EFI.cfg和Bios.cfg即可!
作者: cxylovelz    时间: 2015-7-21 20:33
进来学习学习!
作者: tulongwa    时间: 2015-10-23 17:22
本帖最后由 tulongwa 于 2015-10-23 17:25 编辑

http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1
中提到可以把启动目录的上百个文档打包,然后启动时映射这个包并读取。
但是那里面用的是GNU/linux SliTaz环境编译的命令:find boot | cpio -o -H newc > winly.pkg
我在win8.1里面试了一下命令行窗口就退出了
后来我在深度LiveCD模式打包了boot.pkg,虽然能够定制出来一个内置boot.pkg的GRUBx32.EFI,但是虚拟机测试不能启动。

,能不能简介一下这个全内置的方法,谢谢!
EFI_X86.CFG文件:
loopback Bootx64 /boot.pkg
set prefix=/boot/grub/

定制命令:
grub-mkimage.exe -d i386-efi -c EFI_X86.CFG -o GRUBx32.EFI -m boot.pkg -O  i386-efi part_gpt part_msdos disk fat exfat ext2 ntfs newc cpio loopback appleldr hfs iso9660 normal search configfile
作者: gzsdbb    时间: 2015-10-28 00:23
本帖最后由 gzsdbb 于 2015-10-28 00:29 编辑
tulongwa 发表于 2015-10-23 17:22
http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1
中提到可以把启动目录的上百 ...


你那个是winly工程的吧
这么说吧 如果是定制efi下的 其实不用winly.pkg文件打包
直接把所有模块打包到efi里就可以了 efi启动要在fat32/16分区 所以大少限制是2G
如果你用loopback的话 命令是把boot.bkg回写包到内存 所以 prefix 也要改到内存盘去麻烦麻烦 或者在boot.bkg里再加入一个CFG菜单然后EFI_X86.CFG最后调用这个菜单 菜单里也要重新定义prefix 总之麻烦 麻烦
不如直接命令全部打包到efi文件里去
说白了 重点是prefix
作者: tulongwa    时间: 2015-10-28 05:19
我是在boot.pkg加了个菜单,可能就是设置prefix不对吧,要全部打包的话是不是要把所有的模块都写在命令里?字体也可以打包进去吗
作者: 2012列兵    时间: 2015-10-28 22:54
本帖最后由 2012列兵 于 2015-10-28 22:59 编辑

search -f -n --set=sd /Grub2/BIOS/Grub.CFG
set root=(${sd})
set prefix=($root)/Grub2/BIOS

若没有($root)。会找不到模块的(mod )
作者: 2011niumao    时间: 2015-10-29 13:40
本帖最后由 2011niumao 于 2015-10-29 21:00 编辑

我定制grub2时候使用的内部的配置文件如下
  1. ##########################################################
  2. ##嵌入在g2ldr内部的配置文件内容
  3. ##prefix=(hd0,1)/grub2  这是默认前缀.即grub模块所在路径.
  4. ##prefix=(${rootgrubdev})/grub2 这是修改后的前缀,必须使用绝对路径;避开root关键词.
  5. set rootgrubdev=(hd0,msdos1)
  6. search --no-floppy -f --set=rootgrubdev /grub2/grubpc.cfg
  7. set prefix=(${rootgrubdev})/grub2
  8. set  root=(${rootgrubdev})
  9. ##指向新的配置文件
  10. configfile /grub2/grubpc.cfg
  11. #########################################################
复制代码

其中多设一个关键词 rootgrubdev ,使用它在搜索后来定义新前缀 prefix..
目的是避开root   ----如果在后续操作中root被改变了,不至于影响prefix .

其次,记得在定制grub2时候,制定命令 指定前缀 时候必须使用绝对路径.这是
默认prefix=(hd0,1)/grub2的原因.

所以对于 prefix 感觉还是使用绝对路径好.因为绝对路径在 root 改变时候不受影响.
但是为了能灵活的改变 prefix ,应该再引入一个关键词,名字自己任意起---如这里的rootgrubdev 或 grubrootdev什么的.
作者: dos时代菜鸟    时间: 2015-12-6 21:46
不错,不错
我想问个问题哈,

就是 内置菜单
set root=(${sd})
set prefix=/Grub2/BIOS
改成
set root=(${sd})
set prefix==(${sd})/Grub2/BIOS
是不是更好一些,因为有的菜单下也会跳转到 其他盘做 root ,而这个盘没有 /grub2/bios 的化 ,prefix 是不是就失效了呢?
比如 一些search.file /bootmgr root 的命令会变更 当前盘,而此后 insmod 命令根据prefix加载mod模块还能不能成功呢?


作者: heham    时间: 2016-1-14 09:58
我直接alone了,制定一个配置文件完事
作者: heham    时间: 2016-1-14 09:58
我直接alone了,制定一个配置文件完事
作者: qj_tzy    时间: 2016-1-22 13:54
谢谢楼主,我对grub2一直搞不清,今天又学到了一点!
作者: wangziqiang    时间: 2016-2-1 11:25
支持下 可能会用到啊
作者: kyvi    时间: 2016-6-10 19:01
学习了,确实精华帖,谢谢分享




欢迎光临 无忧启动论坛 (http://wuyou.net./) Powered by Discuz! X3.3