页次: 1
参照这个【2017.12.25】deepin安装U盘制作,支持 BIOS+UEFI,deepin_Recovery+Win PE在U盘上安装了多引导,现在想加一条菜单,即让U盘上的GRUB把控制权交让给硬盘上的GRUB,目前想到的是`chainload +1`,以下是我的GRUB配置
menuentry "[d] (实验性) 正常启动" --hotkey=d{
echo "正在启动 chainloader +1,请等待...."
set root=(hd1,1)
chainloader +1
boot
}
但是我遇到了这个错误
错误:invalid EFI file path.
请问有没有办法能做到这样引导呢?
对了,我的硬盘上的GRUB2是UEFI模式
离线
EFI 引导信息怕不是在 +1 block 上吧,那是 MBR 的吧。
https://www.gnu.org/software/grub/manua … ist-syntax
https://bbs.archlinux.org/viewtopic.php?id=169328
https://wiki.archlinux.org/index.php/GR … _UEFI_mode
另外你要做在 U 盘上那应该是比较通用的,在你这台电脑是 (hd1,gpt1),在其他电脑也不一定啊……用 search --set root 更合适吧。
离线
如果你是 UEFI 引导的,那么可以,否则不行。不过你可以继续用现在这个 grub 啊,读取那边的配置文件就可以了(configfile 命令)。
在线
EFI 引导信息怕不是在 +1 block 上吧,那是 MBR 的吧。
https://www.gnu.org/software/grub/manua … ist-syntax
https://bbs.archlinux.org/viewtopic.php?id=169328
https://wiki.archlinux.org/index.php/GR … _UEFI_mode另外你要做在 U 盘上那应该是比较通用的,在你这台电脑是 (hd1,gpt1),在其他电脑也不一定啊……用 search --set root 更合适吧。
啊 所以+1是一个很硬件的操作啊 懂了懂了
现在是
menuentry "[d] (实验性) 正常启动" --hotkey=d{
echo "正在链式启动,请等待...."
insmod ntfs
insmod part_gpt
insmod fat
set root=(hd1,1)
chainloader (${root})/EFI/deepin/grubx64.efi
boot
}
已经能启动了,接下来就啃一啃你说的 search --set root,争取做到通用吧!
十分感谢!!
最近编辑记录 erickwok (2018-04-25 20:36:36)
离线
如果你是 UEFI 引导的,那么可以,否则不行。不过你可以继续用现在这个 grub 啊,读取那边的配置文件就可以了(configfile 命令)。
U盘是UEFI引导,硬盘也是,已经成功进入系统了
MBR的话……手头没有MBR的设备……没法调
离线
你硬盘上的grub是作为UEFI Application存在的,而chainloader +1是直接读磁盘头。
如果目标机器UEFI固件能处理MBR磁盘的话,U盘上建立一个EFI分区(另外的分区自己考虑要不要,如果没有大文件其实一个FAT32也完全可以用,省下很多麻烦)。然后在MBR里写入GRUB2并设定boot-directory为EFI目录,UEFI版安装的时候设定bootloader-id为grub(因为BIOS版的目录名字是写死的grub,UEFI版就只好这么跟着),到时候UEFI Application版本跟BIOS版本就能放到一起利于维护。cfg两版本可以共享一份。
可以用QEMU测试。
反社会,精神极其不稳定,随时可能炸碎身边所有人
离线
zsrkmyn 说:EFI 引导信息怕不是在 +1 block 上吧,那是 MBR 的吧。
https://www.gnu.org/software/grub/manua … ist-syntax
https://bbs.archlinux.org/viewtopic.php?id=169328
https://wiki.archlinux.org/index.php/GR … _UEFI_mode另外你要做在 U 盘上那应该是比较通用的,在你这台电脑是 (hd1,gpt1),在其他电脑也不一定啊……用 search --set root 更合适吧。
啊 所以+1是一个很硬件的操作啊 懂了懂了
现在是menuentry "[d] (实验性) 正常启动" --hotkey=d{ echo "正在链式启动,请等待...." insmod ntfs insmod part_gpt insmod fat set root=(hd1,1) chainloader (${root})/EFI/deepin/grubx64.efi boot }
已经能启动了,接下来就啃一啃你说的 search --set root,争取做到通用吧!
十分感谢!!
自己琢磨出了一个解决方案
menuentry "[d] (实验性) 正常启动" --hotkey=d{
echo "正在链式启动,请等待...."
insmod part_gpt
insmod fat
set root=(hd1,1)
search --label --no-floppy --set=root EFI
search --file --no-floppy --set=root /EFI/ubuntu/grubx64.efi
search --file --no-floppy --set=root /EFI/Microsoft/Boot/bootmgfw.efi
#若存在深度安装的grub则引导
if [ -e /EFI/deepin/grubx64.efi ]; then
chainloader (${root})/EFI/deepin/grubx64.efi
#否则,若存在Ubuntu安装的grub则引导
elif [ -e /EFI/ubuntu/grubx64.efi ]; then
chainloader (${root})/EFI/ubuntu/grubx64.efi
#否则,若存在Windows则引导
elif [ -e /EFI/Microsoft/Boot/bootmgfw.efi ]; then
chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi
else
echo "找不到主硬盘中的grub2,请拔下U盘,按Ctrl+Alt+Del重启电脑!"
echo "Couln't find Grub2 in HDD, please remove the flash disk and press CTRL+ALT+DEL to reboot!"
fi
boot
}
BTW,记得把U盘上的 efi/microsoft 改名为 efi/ms,grub 的 search 似乎不区分大小写,在搜索硬盘上的efi分区的时候可能会错误地把U盘设置为root,最终结果就是chainloader引导了U盘上的bootloader……
离线
grub 的 search 似乎不区分大小写
是 UEFI 分区用的 FAT32 文件系统不区分大小写。
在线
erickwok 说:grub 的 search 似乎不区分大小写
是 UEFI 分区用的 FAT32 文件系统不区分大小写。
soga!
离线
更新:使用configfile代替了chainloader,避免重新载入grub,并且大幅减少了代码量
#########################
# 06_pc.cfg
# UEFI 模式启动
if [ 'efi' == $grub_platform ] ; then
menuentry "[b] (实验性) 正常启动" --hotkey=b{
configfile "${prefix}/Config/NormalBootList.cfg"
}
fi
#############################
# NormalBootList.cfg
set timeout=10
set default=0
search --file --no-floppy --set=root /efi/deepin/grub.cfg
search --file --no-floppy --set=root /efi/Microsoft/Boot/bootmgfw.efi
if [ -e /efi/deepin/grub.cfg ] ; then
menuentry "[g] 启动 grub" --hotkey=g{
configfile ($root)/efi/deepin/grub.cfg
}
fi
if [ -e /efi/Microsoft/Boot/bootmgfw.efi ] ; then
menuentry "[w] 启动 Windows" --hotkey=w{
chainloader ($root)/efi/Microsoft/Boot/bootmgfw.efi
boot
}
fi
最近编辑记录 erickwok (2018-04-28 01:17:54)
离线
页次: 1