无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 118115|回复: 286

[分享] Grub2的简单使用

    [复制链接]
发表于 2019-12-27 16:16:20 | 显示全部楼层 |阅读模式
本帖最后由 hilsonma 于 2020-5-30 09:12 编辑

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

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

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

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

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

评分

参与人数 29无忧币 +139 收起 理由
sea2moon + 5
gues1688 + 5 很给力!
cuicongyuan + 5 很给力!
蓝星明月 + 5 赞一个!
amita + 5
wuxin9712 + 5
d9o + 5 赞一个!
ahxx + 1 很给力!感谢分享
qqbab + 5
1qaz + 10 谢谢分享,正在搞安装的深度系统启动win7
有阴也有阳 + 5 很给力!
brook + 5 很给力!
zcheng + 5 赞一个!
long1983 + 1 很给力!
wsasecy + 1 很给力!
jack612 + 1 很给力!
zhxy9804 + 10 赞一个!
lhb9900 + 5
Climbing + 5 很给力!
shan + 5 多谢老大无私传授
2012kwy + 5
某些人 + 5 赞一个!
whyme22 + 5
liuzhaoyzz + 10 很给力!
xq8751 + 5 赞一个!
学习学习 + 1 赞一个!
879792799 + 5 感谢大大!
freesoft00 + 5
xuxuezeng + 4 很给力!

查看全部评分

 楼主| 发表于 2019-12-27 16:16:56 | 显示全部楼层
本帖最后由 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编码保存。
回复

使用道具 举报

 楼主| 发表于 2019-12-27 16:17:00 | 显示全部楼层
本帖最后由 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是关机命令


回复

使用道具 举报

 楼主| 发表于 2019-12-27 16:17:04 | 显示全部楼层
本帖最后由 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;}
复制代码




回复

使用道具 举报

 楼主| 发表于 2019-12-27 16:17:12 | 显示全部楼层
本帖最后由 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命令行来查看各命令的说明。
回复

使用道具 举报

 楼主| 发表于 2019-12-27 16:17:16 | 显示全部楼层
本帖最后由 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变量也可以在菜单项中设置,这样当该菜单项启动失败时就不是返回菜单而是执行后备选项。



回复

使用道具 举报

 楼主| 发表于 2019-12-27 16:17:20 | 显示全部楼层
本帖最后由 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, 下载次数: 471)
回复

使用道具 举报

 楼主| 发表于 2019-12-27 16:17:38 | 显示全部楼层
本帖最后由 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, 下载次数: 1682)

点评

最近换了纯uefi引导的机器,发现这个单文件模板比较合适,可以放在硬盘ESP分区自动生成PE菜单,但却过不了安全启动,请问能否解决?  详情 回复 发表于 2024-1-31 13:43
siso模块可是很强大的,5大大的继承者!厉害  发表于 2022-2-5 16:15
大大好像有弄出新玩具 是不是启动可以选择不同wim或vhd等等之类的选项列表  详情 回复 发表于 2020-9-16 12:01

评分

参与人数 1无忧币 +5 收起 理由
879792799 + 5 杠杠滴 好喜欢!

查看全部评分

回复

使用道具 举报

发表于 2019-12-27 17:21:53 | 显示全部楼层
膜拜并学习。
回复

使用道具 举报

发表于 2019-12-27 18:56:51 | 显示全部楼层
确实 ,GRUB2很少有简单的教程,楼主辛苦了!
回复

使用道具 举报

发表于 2019-12-27 19:58:13 | 显示全部楼层
本帖最后由 879792799 于 2019-12-27 20:03 编辑

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

使用道具 举报

发表于 2019-12-27 20:10:12 来自手机 | 显示全部楼层
真勤快啊 新思想
回复

使用道具 举报

发表于 2019-12-27 20:13:51 | 显示全部楼层
感谢分享,学习了!!
回复

使用道具 举报

发表于 2019-12-27 20:33:29 | 显示全部楼层
谢谢
回复

使用道具 举报

发表于 2019-12-27 20:40:57 | 显示全部楼层
學習中感謝大大分享
回复

使用道具 举报

发表于 2019-12-27 21:17:18 | 显示全部楼层
很给力!
回复

使用道具 举报

 楼主| 发表于 2019-12-27 21:20:32 | 显示全部楼层
本帖最后由 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主菜单。

评分

参与人数 1无忧币 +5 收起 理由
879792799 + 5 多谢 那我一定要试试大作!

查看全部评分

回复

使用道具 举报

发表于 2019-12-27 21:40:01 | 显示全部楼层
楼主辛苦了。。。非常简明实用の grub2 上手教程啊。。。
哪怕氏 grub2 の初接触者,也能照着楼主的一楼楼的指导,学会 grub2 的一般应用了。。。
回复

使用道具 举报

发表于 2019-12-27 22:59:10 来自手机 | 显示全部楼层
也准备静下心照着一楼楼的指导学点真本事
回复

使用道具 举报

发表于 2019-12-28 01:48:17 | 显示全部楼层
学到了很多知识,谢谢老师!
回复

使用道具 举报

发表于 2019-12-28 07:45:22 | 显示全部楼层
很明显,楼主占楼太少了,应该最少占前10楼!支持楼主发布的教程!
回复

使用道具 举报

发表于 2019-12-28 13:35:39 | 显示全部楼层
H大,有时间的话能不能再举几个函数的例子?有点不明白。另外假如我已经安装了旧版某个mod,现在临时想换成W大修改的同名模块,我需要先卸载旧版,还是可以直接安装新版就能替换?
回复

使用道具 举报

发表于 2019-12-28 13:52:13 来自手机 | 显示全部楼层
hilsonma 发表于 2019-12-27 16:17
前2条菜单的命令相对较长,我们可以自己定义一个命令来简化。
自定义命令(函数)的命令是function,用法是
...

能不能把启动vhd和wim做成像4dos里面用的run模块一样,只要是g2环境拿来就可以用,那就完美了!
回复

使用道具 举报

发表于 2019-12-28 14:00:43 | 显示全部楼层
可以的,修改版支持参数运行,不过我倒是懒得折腾,想冬眠
要不楼主搞个算了
回复

使用道具 举报

 楼主| 发表于 2019-12-28 14:38:07 | 显示全部楼层
本帖最后由 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 这个配置文件里除了主进程其他都是函数,你可以参考
记住命令以分号或换行结束。
回复

使用道具 举报

 楼主| 发表于 2019-12-28 15:05:38 | 显示全部楼层
本帖最后由 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函数。

评分

参与人数 2无忧币 +10 收起 理由
shan + 5 很给力!
879792799 + 5 很给力!

查看全部评分

回复

使用道具 举报

发表于 2019-12-28 15:48:45 | 显示全部楼层
hilsonma 发表于 2019-12-28 15:05
我不懂c语言,搞不来模块文件。
所以我只能通过使用配置文件来折衷实现,请参见我的模板。
我的模板中g ...

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

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

评分

参与人数 1无忧币 +5 收起 理由
879792799 + 5 赶紧搞起了大大!

查看全部评分

回复

使用道具 举报

发表于 2019-12-28 15:52:07 | 显示全部楼层

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

使用道具 举报

 楼主| 发表于 2019-12-28 16:12:51 | 显示全部楼层
wintoflash 发表于 2019-12-28 15:52

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

感谢指点。

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

使用道具 举报

发表于 2019-12-28 16:16:39 | 显示全部楼层
hilsonma 发表于 2019-12-28 16:12
感谢指点。

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

最简单是下Grubfm源码,删光主题和其它用不到的模块,改一下内痣脚本,我就只弄过接受ipxe参数
很久以前搞过搜索特定文件,然后启动,grub2搜索文件实在是。。。。。慢死了,就不折腾了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-3-29 05:54

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表