无忧启动论坛

标题: Grub2的简单使用 [打印本页]

作者: hilsonma    时间: 2019-12-27 16:16
标题: Grub2的简单使用
本帖最后由 hilsonma 于 2020-5-30 09:12 编辑

现在,UEFI平台正逐渐广泛应用,作为UEFI平台下一款可以灵活定制的启动管理器,grub2越来越被人们熟知。
当大多数windows用户初次接触grub2的时候,面对下载来的grub2,却不知所措,那一堆文件,不知要怎么使用。

下面分享一下做为一个windows用户对grub2的使用。

最简单的,就是使用别人的模板,在使用的过程中慢慢熟悉,然后再灵活定制自己想要的方案。

附件是一个最简单的grub2启动模板,4项菜单:正常启动Windows、进入PE维护、重启、关机。

efi.7z (126.55 KB, 下载次数: 1803)

只有两个文件:启动文件bootx64.efi 和菜单文件grub.cfg 。

第一步,下载模板
第二步,显示ESP(EFI分区)
第三步,将ESP 的 \efi\boot\bootx64.efi 改名备份如bootx64b.efi。如果ESP没有\efi\boot\bootx64.efi就跳过这一步
第四步,用7z或其他解压软件打开压缩包,将压缩包中的两个文件拖放到ESP的 \efi\boot
        这时如果重启就会出现grub2菜单。不过要使用grub2菜单生效,还要做以下两步。
第五步,要使菜单第一项生效,将以下附件的bcd解压放到Windows分区的文件夹 \Windows\Boot\EFI
第六步,要使菜单第二项生效,将以下附件的pe文件夹解压放到ESP根目录。
        附件中的pe.wim是空文件,请将你使用的维护PE镜像改名为pe.wim替换到pe文件夹中。也可以到这里下载一个。
第七步,操作完成恢复隐藏ESP

万一重启后不出现grub2菜单,那可能是原来的主引导不是 (ESP)\efi\boot\bootx64.efi ,需要使用bootice 将(ESP)\efi\boot\bootx64.efi 添加到启动序列并调到第一位。

注:现在发现预装windows的新电脑是完全符合UEFI规范的,开机启动文件是ESP的\EFI\Microsoft\Boot\bootmgfw.efi,不是\EFI\Boot\bootx64.efi。
这时应该把ESP的\EFI\Microsoft\Boot\bootmgfw.efi改名为bootmgfw0.efi,再把附件中的bootx64.efi改名为bootmgfw.efi放到ESP的\EFI\Microsoft\Boot文件夹中。

经过以上操作,你就用上了grub2启动。

如果要恢复原来的启动方案,只需删除(ESP)\efi\boot 的这两个文件bootx64.efi和grub.cfg,并将原来备份的bootx64b.efi改回bootx64.efi

相关工具:
ESP显示及隐藏
7-zip
bcd bcd.7z (961 Bytes, 下载次数: 592)
pe pe.7z (594.35 KB, 下载次数: 762)
bootice


进一步:
(二楼)使用中文菜单
(三楼)菜单文件解读
(四楼)使用自定义命令简化菜单
(五楼)使用菜单快捷键
(六楼)几个常用的菜单命令
(七楼)定制efi文件
(八楼)我使用的模板

进阶资料:
Grub2英文手册(官方)
Grub2中文手册(wintoflash)
Grub2实战手册(金步国)
Grub2启动模板封装成单文件
Grub2主题应用
作者: hilsonma    时间: 2019-12-27 16:16
本帖最后由 hilsonma 于 2019-12-27 16:37 编辑

你会发现,菜单出现的是英文,想要中文,自己来改吧。
把grub.cfg改成中文菜单如下。
  1. menuentry "正常启动Windows" {
  2.         search --no-floppy --set --file /Windows/Boot/EFI/bootmgfw.efi
  3.         chainloader /Windows/Boot/EFI/bootmgfw.efi
  4. }
  5. menuentry "进入PE维护" {
  6.         search --no-floppy --set --file /pe/bootmgfw.efi
  7.         chainloader /pe/bootmgfw.efi
  8. }
  9. menuentry "重启" {
  10.         reboot
  11. }
  12. menuentry "关机" {
  13.         halt
  14. }
复制代码

建议使用notepad2或notepad++之类工具修改。
grub2本身支持中文,记得将grub.cfg以UTF-8编码保存。

作者: hilsonma    时间: 2019-12-27 16:17
本帖最后由 hilsonma 于 2020-4-7 19:02 编辑

下面解读一下grub.cfg 。相关引导例子参见 我常用的引导
  1. menuentry "Windows" {
  2.         search --no-floppy --set --file /Windows/Boot/EFI/bootmgfw.efi
  3.         chainloader /Windows/Boot/EFI/bootmgfw.efi
  4. }
  5. menuentry "WinPE" {
  6.         search --no-floppy --set --file /pe/bootmgfw.efi
  7.         chainloader /pe/bootmgfw.efi
  8. }
  9. menuentry "Reboot" {
  10.         reboot
  11. }
  12. menuentry "Halt" {
  13.         halt
  14. }
复制代码

以上4条menuentry语句,每条定义一个菜单项,共4个菜单项。
menuentry的最简单用法是

menuentry 标题 {命令;...}
标题就是显示的菜单标题,
命令就是选择该项菜单后执行的命令,命令可以多条,每条命令必须以分号或换行来结束。全部命令用大括号括住。

第一条菜单有两个命令search 和chainloader

search 是搜索分区的命令,最简单的用法是
search --file 文件路径
查找指定文件所在的分区,可以简写成 search -f 文件路径
grub2使用/来分隔目录,与windows使用\不同
找到分区后我们要把它记出来以便后面使用,这时用--set 参数,简写成-s ,会将分区记到变量root
万一硬盘找不到还会查找软盘,这时不管有没有软盘都会超慢,所以用--no-floppy 参数,简写成-n ,表示不查找软盘。

chainloader 是加载文件命令,文件路径如果不指定分区的话就默认root分区
chainloader /Windows/Boot/EFI/bootmgfw.efi 就是引导root分区的/Windows/Boot/EFI/bootmgfw.efi
grub2指定分区比较麻烦,所以我们一般使用search命令来确定分区并指定为root分区

reboot是重启命令
halt是关机命令



作者: hilsonma    时间: 2019-12-27 16:17
本帖最后由 hilsonma 于 2019-12-28 05:54 编辑

前2条菜单的命令相对较长,我们可以自己定义一个命令来简化。
自定义命令(函数)的命令是function,用法是
function 命令名 {命令;...}
记得每条命令以分号或换行来结束。

如我们定义一个run命令如下
function run {search -n -s -f $1; chainloader $1;}

这个自定义命令里的两个命令search 和chainloader前面已经讲过,现在使用的是简写样式。文件路径我们使用了变量$1,意思是run命令的第一个参数。
这样我们就可以将文件路径写成run命令的第一个参数。

这样简化的菜单如下:
  1. function run {search -n -s -f $1; chainloader $1;}
  2. menuentry "Windows" {run /Windows/Boot/EFI/bootmgfw.efi;}
  3. menuentry "WinPE"   {run /pe/bootmgfw.efi;}
  4. menuentry "Reboot"  {reboot;}
  5. menuentry "Halt"    {halt;}
复制代码





作者: hilsonma    时间: 2019-12-27 16:17
本帖最后由 hilsonma 于 2019-12-28 07:03 编辑

在menuentry命令中使用--hotkey 参数,我们可以为每条菜单指定一个快捷按键。
指定了快捷按键时,建议显示在菜单标题的第一位。
  1. function run {search -n -s -f $1; chainloader $1;}
  2. menuentry "0.Windows" --hotkey=0 {run /Windows/Boot/EFI/bootmgfw.efi;}
  3. menuentry "1.WinPE"   --hotkey=1 {run /pe/bootmgfw.efi;}
  4. menuentry "2.Reboot"  --hotkey=2 {reboot;}
  5. menuentry "3.Halt"    --hotkey=3 {halt;}
复制代码


其实grub2内定有几个菜单按键,方向键向上向下或者向左向右是移动选择,回车是执行选择,这些一般都知道的。
还有两个可能不知道的是
e 查看菜单项并临时修改,修改后可按F10键执行临时修改过的菜单,按ESC键返回原菜单项
c 进入grub2命令行,可输入各项grub2命令,包括输入 help search 这样来查看search命令和其他命令的说明。按ESC键返回菜单。我习惯使用Qemu启动测试器进入grub2菜单然后进入grub2命令行来查看各命令的说明。

作者: hilsonma    时间: 2019-12-27 16:17
本帖最后由 hilsonma 于 2019-12-27 17:16 编辑

现在菜单是等待我们选择才启动的,如果想菜单有个倒计时,超过多少秒后就自动选择,可使用set命令设置timeout变量

set timeout=5
设定菜单等待多少秒。时间到了就启动默认选项。如果是负数就表示永远等待。默认是负数,也就是说没有这一句的话就是永远等待。在硬盘上我设为1秒,在U盘上我设为5秒。

set default=0
设定菜单默认选项。菜单编号从0开始,第一项是0,第二项是1...依次类推。默认是0 ,也就是说没有设置的话就默认选择第一项。

set fallback=1
设定菜单后备选项。如果默认选项启动失败就执行后备选项。如果不设置的话启动失败就会返回菜单。
fallback变量也可以在菜单项中设置,这样当该菜单项启动失败时就不是返回菜单而是执行后备选项。




作者: hilsonma    时间: 2019-12-27 16:17
本帖最后由 hilsonma 于 2019-12-29 13:18 编辑

前面了解了菜单文件grub.cfg ,现在再来了解启动文件 bootx64.efi 。
这个文件下载别人的话,不知道包含什么模块,有哪些功能,所以现在就学习自己定制,要什么功能用什么模块自己来定。

grub2是模块化的,下载来的一堆文件其实主要就是模块文件。
grub2的命令是通过模块来实现的,缺少模块相关的命令就用不了。

下载来的grub2有几个文件夹(官网这里下载),其中
i386-efi 是32位uefi平台用的模块,
i386-pc 是bios平台用的模块
locale 是grub2提示信息的各种语言翻译
themes 是自带的主题设置
x86_64-efi 是64位uefi平台用的模块

wintoflash的grub2还有个文件夹arch是预设的各平台使用的模块列表(wintoflash版grub2这里下载

下载包里会有一个exe文件 grub-mkimage.exe ,这个文件就是用来生成启动文件的。
在cmd窗口,进入下载包解压文件夹,如d:\grub2
cd /d d:\grub2
再输入
grub-mkimage -O x86_64-efi -p /efi/boot -o bootx64.efi part_msdos fat normal
就生成了一个efi文件bootx64.efi

解读一下上面这个语句:
grub-mkimage   命令本身 grub make image 的简写,意思是grub-生成影像文件
-O x86_64-efi  这个参数设定生成的文件适用于64位uefi平台,同时默认使用x86_64-efi目录中的模块定制,注意是大写O .
-p /efi/boot   设定生成的文件使用/efi/boot 作为默认目录,会在此目录查找菜单文件,注意是小写字母p 。
-o bootx64.efi   设定生成的文件名称是bootx64.efi 。注意是小写字母o 。
part_msdos fat normal   设定使用的模块,这是最基本的三个模块
    part_msdos 基本分区模块,有它就可以识别mbr分区,如果要识别gpt分区还要加上part_gpt模块
    fat 基本文件系统,有它就可以识别fat16和fat32文件系统(efi分区),如果要识别ntfs文件系统还要加上ntfs模块
    normal 基本命令集,有它就可以使用一些基本的grub2命令。

回看前面用到的命令,menuentry 需要normal模块,search需要search模块,chainloader需要chain模块,reboot需要reboot模块,halt需要halt模块,help需要help模块。这些命令与模块的关系,在模块目录里有个命令模块清单文件command.lst,可以使用notepad2等工具打开查看。
此外还有分区模块清单partmap.lst,文件系统模块清单fs.lst等等,目前九个模块清单。

当提示Can't find command 'xxx'. 时说明缺少相应的模块,这时就需要添加模块重新生成启动文件。

上面生成启动文件的命令我们可以保存在一个脚本文件中,避免每次输入。如 定制grub2.cmd 。
wintoflash的grub2中就提供了一个定制脚本 build_grub.bat 。
使用notepad2 打开这个脚本会发现它会一次性生成3个平台的启动文件,模块使用变量的形式,引用的是arch中的模块列表。它比我前面说的参数多了一个,那就是-d ,设定定制使用的模块目录。仔细看其实跟-O 参数的内容一样的,只要设定了-O参数,就会自动使用相应的目录,所以-d 参数不是必需的。

附件是我使用的脚本,可以放到grub2文件夹中使用。
定制grub2.7z (898 Bytes, 下载次数: 503)

使用我这个脚本的话,要添加模块请修改相应的模块列表文件:
x64.txt 是64位EFI使用的模块表
x32.txt 是32位EFI使用的模块表
xpc.txt 是BIOS引导使用的模块表
当然,也可以直接修改脚本。


作者: hilsonma    时间: 2019-12-27 16:17
本帖最后由 hilsonma 于 2020-1-20 00:20 编辑

经过wintoflash的努力,grub2现在有了wimboot、mapntboot这几个强大的模块,并提供了强大的grubfm应用,使得我们能更灵活地各种折腾。经过wintoflash的提示指导,我仿照他的grubfm.cfg,修改分拆成三个cfg文件,定义了一个近似g4d下的run/siso的run命令,可以多功能启动,并为grub2主引导添加了一个自动菜单。

附件模板分享给大家。其中的自动菜单项 menu /pe 很方便折腾。

自用的折腾模版
espg2.7z (822.78 KB, 下载次数: 1800)


另附最终修改完成的简单模版,适合给小白装机用
espg2s.7z (719.35 KB, 下载次数: 1033)


新做单文件模板,取代上面两个模板。因为封装成了单文件,好用但不利于学习,建议使用上两个模板学习。
单文件模板内容跟上面自用模板是一样的。制作方法看这里
espg2单文件.7z (956.78 KB, 下载次数: 698)

以上模板中的pe.wim都是空文件,请以实际wim文件改名为pe.wim替换。

作者: 20160618    时间: 2019-12-27 17:21
膜拜并学习。

作者: xuxuezeng    时间: 2019-12-27 18:56
确实 ,GRUB2很少有简单的教程,楼主辛苦了!
作者: 879792799    时间: 2019-12-27 19:58
本帖最后由 879792799 于 2019-12-27 20:03 编辑

确实 ,GRUB2很少有简单的教程,楼主辛苦了!说实话G4D中已经无限完美的5大的siso模块,GRUB2要是有类似的就好了!!

作者: wangziqiang    时间: 2019-12-27 20:10
真勤快啊 新思想
作者: 2010fbb    时间: 2019-12-27 20:13
感谢分享,学习了!!
作者: 2010sya    时间: 2019-12-27 20:33
谢谢
作者: wplin    时间: 2019-12-27 20:40
學習中感謝大大分享
作者: 创新科技2015    时间: 2019-12-27 21:17
很给力!
作者: hilsonma    时间: 2019-12-27 21:20
本帖最后由 hilsonma 于 2019-12-27 21:42 编辑
879792799 发表于 2019-12-27 19:58
确实 ,GRUB2很少有简单的教程,楼主辛苦了!说实话G4D中已经无限完美的5大的siso模块,GRUB2要是有类似的 ...

你可以尝试我的自用模板,其中的grubfm菜单功能与siso比较接近,没有那么强大,但uefi平台下的wim/vhd/iso/efi/cfg基本都可以一键启动。

可以将临时要测试的一些菜单项保存为cfg文件放到pe目录下自动菜单一键执行。这样不用每次修改ESP的启动菜单。要测试的PE也可以提取wim或者直接iso放在pe目录下自动菜单一键启动。这个PE目录可以放在任一分区的根目录下。

也可以将自动菜单目录名改成diy等等,只是要相应地修改grub2主菜单。

作者: gnuxwy    时间: 2019-12-27 21:40
楼主辛苦了。。。非常简明实用の grub2 上手教程啊。。。
哪怕氏 grub2 の初接触者,也能照着楼主的一楼楼的指导,学会 grub2 的一般应用了。。。

作者: 2012kwy    时间: 2019-12-27 22:59
也准备静下心照着一楼楼的指导学点真本事
作者: wdtx    时间: 2019-12-28 01:48
学到了很多知识,谢谢老师!
作者: liuzhaoyzz    时间: 2019-12-28 07:45
很明显,楼主占楼太少了,应该最少占前10楼!支持楼主发布的教程!
作者: 2012kwy    时间: 2019-12-28 13:35
H大,有时间的话能不能再举几个函数的例子?有点不明白。另外假如我已经安装了旧版某个mod,现在临时想换成W大修改的同名模块,我需要先卸载旧版,还是可以直接安装新版就能替换?
作者: wangziqiang    时间: 2019-12-28 13:52
hilsonma 发表于 2019-12-27 16:17
前2条菜单的命令相对较长,我们可以自己定义一个命令来简化。
自定义命令(函数)的命令是function,用法是
...

能不能把启动vhd和wim做成像4dos里面用的run模块一样,只要是g2环境拿来就可以用,那就完美了!
作者: 江南一根葱    时间: 2019-12-28 14:00
可以的,修改版支持参数运行,不过我倒是懒得折腾,想冬眠
要不楼主搞个算了
作者: hilsonma    时间: 2019-12-28 14:38
本帖最后由 hilsonma 于 2019-12-28 14:39 编辑
2012kwy 发表于 2019-12-28 13:35
H大,有时间的话能不能再举几个函数的例子?有点不明白。另外假如我已经安装了旧版某个mod,现在临时想换成 ...

临时换同名模块:先删除已加载模块,再插入想使用的模块
rmmod chain
insmod /boot/grub/chain.mod
头脑中要保持全路径意识,即所有文件路径都要求从所在分区开始直至文件全名,凡是没有写出来的要想到是使用默认值,以上模块路径实际是 ($root)/boot/grub/chain.mod ,保持全路径意识可以减少路径错误。

函数的例子如:
function run1 {search -n -s -f $1; chainloader $1;}
function run2 {export grub_find=$1; configfile $prefix/grubfm.cfg;}

多行的例子如:
function grubfm_main {
        if test -z $grub_path; then
                set default=0
                set all="(*)"
        else
                set default=1
                set all="/*"
                menuentry "回设备表 Esc回上一层 当前$grub_path/" {listdev;}
        fi
        enum_all
}

我的模板中grubfm.cfg 这个配置文件里除了主进程其他都是函数,你可以参考
记住命令以分号或换行结束。
作者: hilsonma    时间: 2019-12-28 15:05
本帖最后由 hilsonma 于 2019-12-29 12:15 编辑
wangziqiang 发表于 2019-12-28 13:52
能不能把启动vhd和wim做成像4dos里面用的run模块一样,只要是g2环境拿来就可以用,那就完美了!

我不懂c语言,搞不来模块文件。
所以我只能通过使用配置文件来折衷实现,请参见我的模板。
我的模板中grubfm.cfg 就是实现自动菜单一键启动的
直接调用grubfm.cfg 就是一个简单的自动菜单文件浏览器,相当于run --automenu-all
先将某镜像或某目录设置为grub_find变量,再调用grubfm.cfg 就相当于带文件或目录参数的run

我在grub.cfg 中这样定义出一个run函数,就相当于g4d的run:
function run2 {export grub_find=$1; configfile $prefix/grubfm.cfg;}

这样就可以将run2函数当作g4d的run使用了:
run2 /pe
run2 /diy/mype.wimrun2 /pe/mype.iso
run2 /pe/myvhd.vhd
run2 /pe/test.cfg
诸如此类,定义好的函数用起来比G4D的run还要简便。

因为我在grub.cfg中还定义了一个run1,所以这个自动菜单函数叫run2,你喜欢的话可以直接叫run,这样grub2就有了run的功能了。

在我的grub.cfg中差不多每种启动方法我都定义成run函数,如run1, run2, run3, run4等等,这样我就有了全能的run函数。

作者: wintoflash    时间: 2019-12-28 15:48
hilsonma 发表于 2019-12-28 15:05
我不懂c语言,搞不来模块文件。
所以我只能通过使用配置文件来折衷实现,请参见我的模板。
我的模板中g ...

我觉得可以通过两种方法制作类似run/siso的东西。

把run函数单独放一个cfg里面。
通过source /run.cfg加载函数,然后使用。
这样只要特供run.cfg的下载就可以了。

作者: wintoflash    时间: 2019-12-28 15:52

现在grub2的efi文件可以接收cmdline了,可以考虑将run等功能封装成efi文件。
比如
chainloader /run.efi --file=(hd0,1)/test.iso --mem
在run.efi里面可以通过环境变量 grub_cmdline 获取后面的全部参数,自己解析。
也可以用getargs命令辅助解析。

作者: hilsonma    时间: 2019-12-28 16:12
wintoflash 发表于 2019-12-28 15:52

现在grub2的efi文件可以接收cmdline了,可以考虑将run等功能封装成efi文件。
比如

感谢指点。

还要请教一下怎样封装成efi文件,是使用-c 数将cfg 作为内置配置文件来buid一个efi文件吗?
作者: 江南一根葱    时间: 2019-12-28 16:16
hilsonma 发表于 2019-12-28 16:12
感谢指点。

还要请教一下怎样封装成efi文件,是使用-c 数将cfg 作为内置配置文件来buid一个efi文件吗 ...

最简单是下Grubfm源码,删光主题和其它用不到的模块,改一下内痣脚本,我就只弄过接受ipxe参数
很久以前搞过搜索特定文件,然后启动,grub2搜索文件实在是。。。。。慢死了,就不折腾了。
作者: hilsonma    时间: 2019-12-28 16:39
江南一根葱 发表于 2019-12-28 16:16
最简单是下Grubfm源码,删光主题和其它用不到的模块,改一下内痣脚本,我就只弄过接受ipxe参数
...

源码我不会改啊,改了也不懂编译啊,会的话早就动手了

grub2搜索文件在qemu里是很慢,不过实机操作我觉得还可以接受。反正我用开了,感觉还可以。
作者: 江南一根葱    时间: 2019-12-28 17:25
hilsonma 发表于 2019-12-28 16:39
源码我不会改啊,改了也不懂编译啊,会的话早就动手了

grub2搜索文件在qemu里是很慢,不过实机操作我 ...

grubfm是grub2和lua的脚本源码
就是个grub2定制包
作者: hilsonma    时间: 2019-12-28 17:32
江南一根葱 发表于 2019-12-28 17:25
grubfm是grub2和lua的脚本源码
就是个grub2定制包

感谢指点,等我静下心再看看。
作者: wangziqiang    时间: 2019-12-28 18:47
hilsonma 发表于 2019-12-28 15:05
我不懂c语言,搞不来模块文件。
所以我只能通过使用配置文件来折衷实现,请参见我的模板。
我的模板中g ...

辛苦了,不过我觉得W大说的很有道理,做成菜单文件也不错,
作者: wangziqiang    时间: 2019-12-28 19:00
hilsonma 发表于 2019-12-28 15:05
我不懂c语言,搞不来模块文件。
所以我只能通过使用配置文件来折衷实现,请参见我的模板。
我的模板中g ...

怎么样在菜单中实现依次查找菜单,先查到哪个,就先加载哪个。谢了!
作者: hilsonma    时间: 2019-12-28 19:13
wangziqiang 发表于 2019-12-28 19:00
怎么样在菜单中实现依次查找菜单,先查到哪个,就先加载哪个。谢了!

不明白你的问题
作者: wangziqiang    时间: 2019-12-28 19:27
hilsonma 发表于 2019-12-28 19:13
不明白你的问题

在不同的目录中查找菜单,先找到哪个,就加载哪个。
作者: 2012kwy    时间: 2019-12-28 19:41
感谢楼主解答,感觉还是有点吃力,只能慢慢消化。顺借贵宝地问问江南老大,lua是什么格式?能不能转成cfg?或有什么办法将其转成cfg?目前我只会用cfg进行简单修改。
作者: hilsonma    时间: 2019-12-28 20:08
wintoflash 发表于 2019-12-28 19:59
写了个原型

非常感谢。
现阶段我不需要启动安装镜像,我都是拿到镜像直接释放到系统盘然后用自己的bcd来启动的,什么时候这个办法不行了再考虑走安装。
作者: hilsonma    时间: 2019-12-29 07:08
本帖最后由 hilsonma 于 2019-12-29 07:12 编辑
wangziqiang 发表于 2019-12-28 19:27
在不同的目录中查找菜单,先找到哪个,就加载哪个。

如果你的意思是目录不确定,也不固定层级的,那就要进行遍历,我们现在讲的类siso,就有类似的功能,你也可以参考grubfm.cfg,反正目前一两句是实现不了的。

如果是固定路径的几个可能的菜单,倒是可以一次search一个可能菜单,这样来搞定。g4d的预设内置菜单就是这样的,一次find一个菜单,一找到就启用,找完几个可能的菜单都没有就到命令行。
作者: 2012fengxi    时间: 2019-12-29 09:36
楼主的grub2支持exfat分区吗?
作者: hilsonma    时间: 2019-12-29 09:39
2012fengxi 发表于 2019-12-29 09:36
楼主的grub2支持exfat分区吗?

支持exfat分区的
作者: wangziqiang    时间: 2019-12-29 09:44
谢谢!
作者: sansan3    时间: 2019-12-29 11:03
谢谢分享
作者: hilsonma    时间: 2019-12-29 17:01
本帖最后由 hilsonma 于 2019-12-29 17:06 编辑
2012fengxi 发表于 2019-12-29 09:36
楼主的grub2支持exfat分区吗?

自用版支持exfat,简单版不支持。
简单版我用来给别人装系统用的,在别人的硬盘上使用,所以没有加exfat模块。你看启动文件大小,简单版比自用版小很多。
作者: wangziqiang    时间: 2019-12-30 09:29
菜单中有没有类似goto的判断命令
作者: hilsonma    时间: 2019-12-30 13:09
wangziqiang 发表于 2019-12-30 09:29
菜单中有没有类似goto的判断命令

判断用if

goto 不是要用标签吗,goto:标签 然后需要定义一个:标签
在grub2脚本和大多数编程语言里,直接使用标签,只是换个名字,叫函数。

例如:
goto:label

:label
cls
dir



换成函数:
label

function label {
cls
dir
}

当然,函数不能象goto那样可以随意安插到脚本各个地方,因为从编程角度看这样比较容易发生错误,所以除了早期的编程语言有些含有goto语句,后来的编程语言都没有goto语句。
作者: wangziqiang    时间: 2019-12-30 23:18
hilsonma 发表于 2019-12-30 13:09
判断用if

goto 不是要用标签吗,goto:标签 然后需要定义一个:标签

谢谢了,辛苦
作者: wangziqiang    时间: 2019-12-30 23:37
定制PC模式时提示 Decompressor is too big 是什么意思,搞了半天没搞明白
作者: hilsonma    时间: 2019-12-31 07:18
wangziqiang 发表于 2019-12-30 23:37
定制PC模式时提示 Decompressor is too big 是什么意思,搞了半天没搞明白

定制语句是怎样的?
作者: wangziqiang    时间: 2019-12-31 07:57
和你的一样,我定制的是官网下的2.04
作者: hilsonma    时间: 2019-12-31 08:33
wangziqiang 发表于 2019-12-31 07:57
和你的一样,我定制的是官网下的2.04

我想知道你具体的参数,如:
  1. grub-mkimage -O i386-pc -p /boot/grub -o core.img part_msdos part_gpt fat exfat ntfs ext2 normal chain configfile search probe regexp test halt reboot help linux blocklist vhd
  2. Copy /B i386-pc\boot.img+core.img g2ldr
复制代码


作者: jasonwang    时间: 2019-12-31 09:25
我就想写个直接安装WIN10,ISO格式的
作者: zhangmi    时间: 2019-12-31 09:33
请教大佬一个问题,启动另一个grub2.efi,能够指定配置文件,而不是自动搜寻吗?
我记得论坛里曾经看到过解答,实在想不起来
作者: 江南一根葱    时间: 2019-12-31 09:50
jasonwang 发表于 2019-12-31 09:25
我就想写个直接安装WIN10,ISO格式的

grubfm直接用啊,
作者: wangziqiang    时间: 2019-12-31 10:07
hilsonma 发表于 2019-12-31 08:33
我想知道你具体的参数,如:

手机上网,有电脑了,再发!定制官网2.04的有问题,非官网好像没事
作者: hilsonma    时间: 2019-12-31 10:16
wangziqiang 发表于 2019-12-31 10:07
手机上网,有电脑了,再发!定制官网2.04的有问题,非官网好像没事

我刚试了,这样定制没有问题:
  1. grub-mkimage -O i386-pc -p /boot/grub -o core.img part_msdos part_gpt fat exfat ntfs ext2 normal chain configfile search probe regexp test halt reboot help linux
  2. Copy /B i386-pc\boot.img+core.img g2ldr
复制代码

作者: hilsonma    时间: 2019-12-31 10:23
本帖最后由 hilsonma 于 2019-12-31 16:32 编辑
jasonwang 发表于 2019-12-31 09:25
我就想写个直接安装WIN10,ISO格式的

我修改的PE,把ISO里的esd提取出来,拖放到桌面的一键还原。
或者把我的一键还原脚本(wimlib.cmd+bin文件夹)放到你的PE中,把ISO里的esd提取出来,拖放到脚本上。
我就是这样安装的。
作者: hilsonma    时间: 2019-12-31 10:33
zhangmi 发表于 2019-12-31 09:33
请教大佬一个问题,启动另一个grub2.efi,能够指定配置文件,而不是自动搜寻吗?
我记得论坛里曾经看到过 ...

grub2.efi在定制生成的时候就指定了配置文件的,可以在启动之后重新指定,不过是有特殊需要才这样的,一般不建议这样操作。
当你重新引导grub2.ef或者引导新的grub2.efii时,又会使用其定制生成时指定的配置文件。
作者: hilsonma    时间: 2019-12-31 10:39
江南一根葱 发表于 2019-12-31 09:50
grubfm直接用啊,

是啊,现在grub2支持map启动iso.
不过我没有走过安装程序,不知走安装程序会不会改写efi引导
作者: wintoflash    时间: 2019-12-31 12:01
hilsonma 发表于 2019-12-31 10:39
是啊,现在grub2支持map启动iso.
不过我没有走过安装程序,不知走安装程序会不会改写efi引导

win原版安装镜像没有你说的那么简单。
作者: hilsonma    时间: 2019-12-31 14:48
wintoflash 发表于 2019-12-31 12:01
win原版安装镜像没有你说的那么简单。

哦。因为我一直是用别人的精简版,没有装过原版镜像,所以不知道。受教了,谢谢。
作者: zhangmi    时间: 2019-12-31 15:26
hilsonma 发表于 2019-12-31 10:33
grub2.efi在定制生成的时候就指定了配置文件的,可以在启动之后重新指定,不过是有特殊需要才这样的,一 ...

多谢,也就是说,只能启动以后再更改
作者: hilsonma    时间: 2019-12-31 17:58
本帖最后由 hilsonma 于 2019-12-31 19:25 编辑

请今天早上8:47后下载过我的自用grub2启动模板的朋友,重新下载。

我更改文件夹结构后忘记更新bcd文件了,会导致grub2引导主菜单第二菜单项启动PE出错,因为boot.sdi的存放位置改变了。现在已更新为正确位置的bcd,请重新下载。

造成不便敬请原谅。

作者: wangziqiang    时间: 2019-12-31 19:06
hilsonma 发表于 2019-12-31 10:16
我刚试了,这样定制没有问题:

估计是个案,官网2.02版没问题,w
大的试了几个版本也都没问题,不知官网的的2.04版怎么回事!谢谢你耐心的指导!
作者: lshao    时间: 2020-1-2 11:06
好好好
作者: xj888xj    时间: 2020-1-2 20:02

膜拜并学习
作者: wsjweng    时间: 2020-1-8 21:20
支持教程
作者: zhxy9804    时间: 2020-1-11 21:46
你好,楼主,我有个问题向你请教
1,能否做个双启动的ISO模板?
2,g2ldr哪里下载?
光盘引导grub2的文件哪里下载?
3.里面那么多文件,能否集成到一个文件里面,有洁癖,
谢谢楼主能抽空给回复一下!
作者: hilsonma    时间: 2020-1-11 23:12
zhxy9804 发表于 2020-1-11 21:46
你好,楼主,我有个问题向你请教
1,能否做个双启动的ISO模板?
2,g2ldr哪里下载?
1,能否做个双启动的ISO模板?

我不使用ISO模板,所以没有学会做ISO模板
如果是做启动U盘,就用8楼的模板做uefi启动,用附件的模板做bios启动
g4d.7z (2.06 MB, 下载次数: 134)
2,g2ldr哪里下载?

g2ldr找别人的模板下载,或自己编译生成,参看7楼,可使用我的脚本定制。
我在bios下使用g4d的grldr,不使用grub2的g2ldr.
3.里面那么多文件,能否集成到一个文件里面,有洁癖,

你是指grub2下载包还是指哪里,如果是grub2下载包的话,只要包含你要用到的模块去定制efi文件,那样在使用grub2引导的时候是只需要efi文件和grub.cfg这2个就可以了的。
如果你是指我的模板,那没有办法,我已经尽量减少文件了,要集成到一个文件目前我做不到。

作者: wangziqiang    时间: 2020-1-12 17:07
h能不能把所有文件打包,放到内存用,
作者: wangziqiang    时间: 2020-1-12 17:11
我好像在哪里见过,这种方式,定制时把所有文件打包,加载到内存,然后从内存加载,前几天我试了一下,失败了,水平有限,没办法,等高手支招
作者: hilsonma    时间: 2020-1-12 18:56
wangziqiang 发表于 2020-1-12 17:11
我好像在哪里见过,这种方式,定制时把所有文件打包,加载到内存,然后从内存加载,前几天我试了一下,失败 ...

wintoflash那个run.efi应该就是你说的那个方式,所有文件封装成一个efi文件。
他的贴子里也附了源码,你可以学着做。

grub2作为一款启动器,我谋求的是最快地启动操作系统,我觉得我目前的方式是最有效率的,什么时候我发现更有效率的方式我再作改进。
作者: wangziqiang    时间: 2020-1-12 21:06
hilsonma 发表于 2020-1-12 18:56
wintoflash那个run.efi应该就是你说的那个方式,所有文件封装成一个efi文件。
他的贴子里也附了源码,你 ...

w大神的我在用,确实是挺方便的。你的菜单我也在用,两者各有千秋!顺便请教个问题,grub2菜单中当前目录,怎么写。?
作者: hilsonma    时间: 2020-1-12 22:25
wangziqiang 发表于 2020-1-12 21:06
w大神的我在用,确实是挺方便的。你的菜单我也在用,两者各有千秋!顺便请教个问题,grub2菜单中当前目录 ...

grub2现在没有当前目录的变量,只有当前分区的变量root,grub2中叫root设备。
你在grub2命令行中输入set就可以看到当前grub2有哪些环境变量。
其中prefix是配置文件grub.cfg所在目录,cmdpath是启动文件bootx64.efi(grubx64.efi)所在目录,这两个变量在合适的时候可以使用。

在grub2中一般都是要使用全路径的,即设备名(分区)开始直到文件扩展名为止。多数时候可以省略设备名,这时默认根设备即root变量所指分区。部分命令可以使用相对路径,这时没有写全的部分都是使用命令默认值,如果不知道默认值就老实写全路径,这样可以减少路径出错。
作者: wangziqiang    时间: 2020-1-13 02:34
hilsonma 发表于 2020-1-12 22:25
grub2现在没有当前目录的变量,只有当前分区的变量root,grub2中叫root设备。
你在grub2命令行中输入set ...

谢谢!

作者: hilsonma    时间: 2020-1-16 20:34
本帖最后由 hilsonma 于 2020-1-16 20:45 编辑
wangziqiang 发表于 2020-1-12 17:11
我好像在哪里见过,这种方式,定制时把所有文件打包,加载到内存,然后从内存加载,前几天我试了一下,失败 ...
@zhxy9804 @wangziqiang
附件就是你要的全打包方式。将附件的bootx64.efi替换到 \efi\boot\bootx64.efi 就是我的启动模板。
第一个菜单项启动Windows需要将附件的bcd放到 Windows分区 \Windows\Boot\EFI
第二个菜单项启动WinPE需要将你的PE镜像wim文件命名为pe.wim放到任一分区的根目录,包括藏到ESP.
第三个菜单项将任意分区根目录下的pe目录列为自动菜单,你也可以将你的菜单文件放到pe目录自动成为子菜单
boot.7z (833.71 KB, 下载次数: 83)


作者: wangziqiang    时间: 2020-1-16 21:36
hilsonma 发表于 2020-1-16 20:34
@zhxy9804 @wangziqiang
附件就是你要的全打包方式。将附件的bootx64.efi替换到 \efi\boot\bootx64.efi  ...

收到了,感谢啊
作者: zhxy9804    时间: 2020-1-17 08:36
本帖最后由 zhxy9804 于 2020-1-17 08:42 编辑
hilsonma 发表于 2020-1-16 20:34
@zhxy9804 @wangziqiang
附件就是你要的全打包方式。将附件的bootx64.efi替换到 \efi\boot\bootx64.efi  ...

你好,我想你还是没明白我说的意思,我的意思就是想要个模板
模板的作用就是搞明白逻辑结构,谁启动谁,谁引导谁
你也看到,我做过bootmgr的双启动模板,已经搞清了逻辑结构
现在这个uefi的grub2好搞,bios的呢,还是一头雾水
所以我想要个双启动的bios模板,搞明白文件结构,尤其是bios版本的光盘启动逻辑

作者: wintoflash    时间: 2020-1-17 09:10
zhxy9804 发表于 2020-1-17 08:36
你好,我想你还是没明白我说的意思,我的意思就是想要个模板
模板的作用就是搞明白逻辑结构,谁启动谁,谁引 ...

BIOS下为啥非得用GRUB2?
GRUB4DOS 不好吗。
作者: zhxy9804    时间: 2020-1-17 10:13
wintoflash 发表于 2020-1-17 09:10
BIOS下为啥非得用GRUB2?
GRUB4DOS 不好吗。

感谢大神回话
是这样子的,我看你开发的grub2,可以载入硬盘img,就是那种海蜘蛛 爱快等公司做的那种硬盘img

作者: wintoflash    时间: 2020-1-17 10:14
zhxy9804 发表于 2020-1-17 10:13
感谢大神回话
是这样子的,我看你开发的grub2,可以载入硬盘img,就是那种海蜘蛛 爱快等公司做的那种硬盘im ...

BIOS下有这功能?我咋不知道。
作者: zhxy9804    时间: 2020-1-17 10:33
wintoflash 发表于 2020-1-17 10:14
BIOS下有这功能?我咋不知道。

http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1
你写的这篇,既然uefi下能用,bios下不能用吗?
盼回复!
作者: wintoflash    时间: 2020-1-17 10:56
zhxy9804 发表于 2020-1-17 10:33
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=417233&extra=page%3D1
你写的这篇,既然uefi下能用 ...

???
不是很懂你的逻辑。
当然不行。
作者: zhxy9804    时间: 2020-1-17 14:45
wintoflash 发表于 2020-1-17 10:56
???
不是很懂你的逻辑。
当然不行。

好,明白
那还是麻烦告诉一下grub2双启动光盘的做法吧,我想了解一下结构跟原理
作者: hilsonma    时间: 2020-1-17 16:07
zhxy9804 发表于 2020-1-17 08:36
你好,我想你还是没明白我说的意思,我的意思就是想要个模板
模板的作用就是搞明白逻辑结构,谁启动谁,谁引 ...

其实我没有看到你做的bootmgr的双启动模板,所以不太明白你的意思。
bootmgr是ms在bios平台下的启动管理器,哪来的双启,如果是指bios/uefi双启,那ms的就是bootmgr/bootmgfw.efi,grub2的就是g2ldr/grubx64.efi/grubia32.efi
但你下面又来个双启动的bios模板,我就又不明白你的真实意愿了,我搞不清楚你的概念。

bios是之前的电脑主板rom上的基本开机程序,现在的一般是uefi,由于习惯上的原因,也有人把现在的uefi叫做uefi-bios,如果非要这样叫,就要带上传统bios和uefi-bios这样对应着叫,让人明白。我建议就叫bios和uefi,传统的bios就叫bios,新的bios其实是uefi就叫uefi.

如果你是指这两个平台的启动叫双启,那我现在是bios下用g4d,uefi下用grub2, 不是一定要双平台都用同一种启动软件。
作者: hilsonma    时间: 2020-1-17 16:44
zhxy9804 发表于 2020-1-17 10:33
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=417233&extra=page%3D1
你写的这篇,既然uefi下能用 ...

磁盘仿真,本来就是g4d早就有了,而grub2没有,所以wintoflash就开发出来的,是应用在uefi平台的。
如果你留意并学习wintoflash的grubfm的话就能发现,他的grubfm在bios平台下也是调用g4d的.

bios是基于中断的,就是int13, int9 之类。而uefi 是没有这些概念的,所以两个平台下的引导是并不能相通的。
有人已经在bios下模拟uefi并成功,而uefi下模拟bios还没有应该也没有必要。毕竟现在新出的电脑都是uefi,bios随着旧电脑的淘汰会逐渐消失。
作者: zhxy9804    时间: 2020-1-17 17:00
本帖最后由 zhxy9804 于 2020-1-17 17:08 编辑

双启动,就是bios跟uefi都适应,的确是两套文件比如我做的双启动光盘都是bootmgr,只是bootgmr分两种形式罢了

我要的就是grub2的两种形式,
我看那个core.img,

作者: hilsonma    时间: 2020-1-17 17:02
zhxy9804 发表于 2020-1-17 14:45
好,明白
那还是麻烦告诉一下grub2双启动光盘的做法吧,我想了解一下结构跟原理

基于我前面的表达,如果你的双启是指bios/uefi双启的话,就没有必要一定做grub2双启,虽然也可以做到。在bios下我始终觉得g4d比grub2好,双启都用grub2的话唯一的好处就是可以共用一个菜单文件,菜单文件而已,有必要一定用同一个吗?一个菜单文件的内容,将其不同平台的部分,分成两个菜单文件来表达,或者会更简单更清晰吧。

所以真的做双启光盘,可以bootmgr/bootmgfw.efi,也可以g4d/grub2 (grldr/grubx64.efi)
你可以参考微PE的双启光盘,就是bootmgr/bootmgfw.efi的
将bootmgr换成grldr,将bootmgfw.efi换成grubx64.efi 就可以了,当然菜单文件(配置文件)要相应更改(包括路径)
同理,如果你硬要bios下用grub2引导,就把bootmgr换成g2ldr就可以了
要注意的是,bootmgr是支持udf文件系统的,而grldr/g2ldr是不支持的。
作者: hhh333    时间: 2020-1-17 17:33
hilsonma 发表于 2020-1-17 17:02
基于我前面的表达,如果你的双启是指bios/uefi双启的话,就没有必要一定做grub2双启,虽然也可以做到。在 ...

bios下g2确实不能与g4d比,efi下那没得比。但网络启动g2不行,无论是bios还是efi,网启应该来说是ipxe的天下。
作者: hilsonma    时间: 2020-1-17 17:41
zhxy9804 发表于 2020-1-17 17:00
双启动,就是bios跟uefi都适应,的确是两套文件比如我做的双启动光盘都是bootmgr,只是bootgmr分两种形式罢了
...

core.img,就是bios平台下的引导镜像,相当于uefi下的grubx64.efi
由于bios平台是基于扇区引导,所以还要加一个与扇区引导对应的引导镜像,就是grub2下载包里i386-pc目录下的boot.img ,如果你看我7楼中的定制脚本就会明白,我的定制脚本是直接生成g2ldr 的。
作者: hilsonma    时间: 2020-1-17 17:48
hhh333 发表于 2020-1-17 17:33
bios下g2确实不能与g4d比,efi下那没得比。但网络启动g2不行,无论是bios还是efi,网启应该来说是ipxe的 ...

明白,谢谢。我前面的表达不包括网启,我对网启不熟悉。目前我只对本地启动有一定的了解,网启还没有涉及。
作者: wintoflash    时间: 2020-1-17 18:47
zhxy9804 发表于 2020-1-17 17:00
双启动,就是bios跟uefi都适应,的确是两套文件比如我做的双启动光盘都是bootmgr,只是bootgmr分两种形式罢了
...
的确是两套文件比如我做的双启动光盘都是bootmgr,只是bootgmr分两种形式罢了


bootmgr 和 bootmgfw.efi 是完全不同的两个东西。只是让你感觉在使用方法上差不多。core.img 和 grubx64.efi 也是如此。虽然用的都是同一套菜单,但内在完全不同。

core.img 就是 bios 下生成的 multiboot 格式内核,文件加上cdboot.img做文件头,就变成了光盘引导文件。前面加 diskboot.img,就变成类似 grldr 的东西。前面加 lnxboot.img,就变成 linux 格式内核。

作者: zhxy9804    时间: 2020-1-17 18:50
感谢各位的指导,心中有谱了!
作者: zhxy9804    时间: 2020-1-17 19:40
wintoflash 发表于 2020-1-17 18:47
bootmgr 和 bootmgfw.efi 是完全不同的两个东西。只是让你感觉在使用方法上差不多。core.img 和 grub ...

你看,uefi下,只需要把对应的文件放到指定的位置,然后就一切ok
bios下,这个core.img,谁来引导它呢?
作者: wintoflash    时间: 2020-1-17 19:43
本帖最后由 wintoflash 于 2020-1-17 19:52 编辑
zhxy9804 发表于 2020-1-17 19:40
你看,uefi下,只需要把对应的文件放到指定的位置,然后就一切ok
bios下,这个core.img,谁来引导它呢?

需要向磁盘mbr写入启动代码。
这是最基本的啊,这个论坛上的人都应该知道mbr是啥吧。


作者: hilsonma    时间: 2020-1-17 20:28
zhxy9804 发表于 2020-1-17 19:40
你看,uefi下,只需要把对应的文件放到指定的位置,然后就一切ok
bios下,这个core.img,谁来引导它呢?

uefi 基于文件引导,uefi在完成初始化后就到启动序列,通常默认引导efi分区的 \efi\boot\bootx64.efi
bios 基于扇区引导,bios在完成初始化后就到启动序列,通常默认引导第一硬盘的第一扇区,也就是该硬盘的MBR,再由MBR进行下一步引导

所以bios平台需要处理扇区引导。当安装windows时,windows会将其主引导记录写入mbr,分区引导记录写入dbr,引导的时候就是mbr引导dbr,dbr引导bootmgr这样一个过程。

core.img的引导,我也不是很清楚,我想象的是,boot.img引导core.img,将boot.img与core.img合在一起成为g2ldr, 可以将它当作g4d的grldr来引导,我是使用wee来引导grldr的,所以我会改让wee引导g2ldr,而wee是安装到mbr上的。
操作上就是将wee安装到mbr,将boot.img和core.img合成g2ldr,让wee引导g2ldr.

至于光盘上,我原本想象的是grldr_cd.bin 引导g2ldr,,上面wintoflash提过是cdboot.img引导core.img, 这样我就不是很了解了,不知cdboot.img 的作用会不会类似grldr_cd.bin,又是怎样变成光盘引导。反正我都不使用grub2做bios引导,所以就不去关心了,也帮不到你。
作者: zhxy9804    时间: 2020-1-17 20:35
hilsonma 发表于 2020-1-17 20:28
uefi 基于文件引导,uefi在完成初始化后就到启动序列,通常默认引导efi分区的 \efi\boot\bootx64.efi
bi ...

好的,明白了,谢谢,大体了解的差不多了
g2ldr如何生成呢?
作者: hilsonma    时间: 2020-1-17 21:18
zhxy9804 发表于 2020-1-17 20:35
好的,明白了,谢谢,大体了解的差不多了
g2ldr如何生成呢?

用我7楼的脚本。
也可以自行输入命令:
Copy /B i386-pc\boot.img+core.img g2ldr
作者: zhxy9804    时间: 2020-1-17 22:06
hilsonma 发表于 2020-1-17 21:18
用我7楼的脚本。
也可以自行输入命令:
Copy /B i386-pc\boot.img+core.img g2ldr

明白了!嘿嘿,其实啊,有时候莫名其妙就想不通呢
特别想追根究底搞个明白不行




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