zengq 发表于 2015-12-10 20:39:30

支持UEFI及BIOS主板的启动U盘,GRUB2菜单如何自动显示和隐藏?

本帖最后由 zengq 于 2015-12-10 20:42 编辑

本人做了一个支持UEFI及BIOS主板的启动U盘,现在不知道如何写GRUB2菜单,让U盘插入不同的主板引导,自动显示不同的菜单。如插入支持UEFI主板的电脑,就只显示UEFI下的菜单,插入支持BIOS主板的电脑,就只显示BIOS下的菜单。哪位知道,谢谢!!!!

kingthen 发表于 2015-12-10 21:23:29

如果我没记错 Uefi启动跟MBR启动grub2的启动配置文件是分开的 本来就是两套配置文件 参考下ubuntu X64的配置文件

zengq 发表于 2015-12-10 21:47:55

本帖最后由 zengq 于 2015-12-10 21:52 编辑

我用winly引导已实現了两者只调用winly.cfg这个菜单,就不知道if......,then
fi   如何写.現在只能在菜单上标注UEFI来区分.

dos时代菜鸟 发表于 2015-12-11 08:22:02

看这个

grub2 有内部变量 来区分 是否 ufi

lbw2007 发表于 2015-12-11 09:12:06

这个应该简单。将mbr做成grub4dos,然后在fat分区内同时放置grub4dos和grub2的引导文件。
这样在BIOS下,BIOS会查找mbr然后启动grub4dos,
在UEFI下,UEFI会直接查找booti32.efi或bootx64.efi。
两者不冲突。

zengq 发表于 2015-12-11 09:57:46

本帖最后由 zengq 于 2016-1-4 11:44 编辑

lbw2007 发表于 2015-12-11 09:12
这个应该简单。将mbr做成grub4dos,然后在fat分区内同时放置grub4dos和grub2的引导文件。
这样在BIOS下,B ...

谢谢!目前我只想维护一个菜单,多了麻烦且容易忘记。以前就是你说的方法,但总要编辑两个菜单文件。
比如下面四个菜单:现在只能用UEFI   UEFI&legacy    legacy表示三种情况:仅支持UEFI,都支持,仅支持 legacy

menuentry "xorboot   UEFI" --class windows --class os {
search --no-floppy --file --set=root /winly/winly.cfg
chainloader /EFI/xorboot/xorboot.efi
}

ifsearch --file /boot/gparted-live-0.24.0-2-amd64.iso; then
menuentry "gparted-live-0.24.0-2-amd64.isoUEFI&legacy " {
set isofile="/boot/gparted-live-0.24.0-2-amd64.iso"
search --set-f $isofile
loopback loop $isofile
#set gfxpayload=1280x800x32,1024x768x32,1440x900x32,1920x1080x32
set gfxpayload='auto'
linux (loop)/live/vmlinuz boot=live union=overlay username=user quietlive-config noswap nolocales edd=on nomodeset ocs_live_run="ocs-live-general" ocs_live_extra_param="" ocs_live_keymap="" ocs_live_batch="no" ocs_lang=""ip=frommedia nosplash toram=filesystem.squashfs findiso=$isofile
initrd (loop)/live/initrd.img
}
fi

ifsearch --file /boot/LuoBo_GhostXP_SP3_v2012.07.iso; then
menuentry "用grub4dos启动installLuoBo_GhostXP_SP3    legacy "{
search --file --set=root"/boot/grub4dos0.4.6a/grub.exe"
set g4d_dir="/boot/grub4dos0.4.6a"
set cfgfile="find --set-root /boot/LuoBo_GhostXP_SP3_v2012.07.iso;map --mem /boot/LuoBo_GhostXP_SP3_v2012.07.iso (0xff);map --hook;chainloader (0xff);boot"
linux $g4d_dir/grub.exe--config-file=$cfgfile
}
fi

ifsearch --file /boot/Win8PE.iso; then
menuentry "用memdisk启动boot目录下的Win8PE   legacy "{
search --file --set=root "/boot/win8PE.iso"
linux16 /boot/memdisk iso raw
initrd16 /boot/Win8PE.iso
}
fi

lbw2007 发表于 2015-12-11 10:27:42

zengq 发表于 2015-12-11 09:57
谢谢!目前我只想维护一个菜单,多了麻烦且容易忘记。以前就是你说的方法,但总要编辑两个菜单。
比如 ...

原来是隐藏菜单里面的内容。
建议用4楼的办法

zengq 发表于 2015-12-11 21:49:43

本帖最后由 zengq 于 2015-12-11 21:57 编辑

dos时代菜鸟 发表于 2015-12-11 08:22
看这个

grub2 有内部变量 来区分 是否 ufi

谢谢!大概明白了:
比如这样:
if [ "${grub_platform}" == "pc" ]; then
menuentry "Microsoft Windows Vista/7/8 BIOS-MBR" {
    insmod part_msdos
    insmod ntfs
    insmod search_fs_uuid
    insmod ntldr   
    search --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 69B235F6749E84CE
    ntldr /bootmgr
}
fi

if [ "${grub_platform}" == "efi" ]; then
        menuentry "Microsoft Windows Vista/7/8/8.1 UEFI-GPT" {
                insmod part_gpt
                insmod fat
                insmod search_fs_uuid
                insmod chain
                search --fs-uuid --set=root $hints_string $fs_uuid
                chainloader /EFI/Microsoft/Boot/bootmgfw.efi
        }
fi

参考自:https://wiki.archlinux.org/index.php/GRUB_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29

dos时代菜鸟 发表于 2015-12-11 23:22:59

zengq 发表于 2015-12-11 21:49
谢谢!大概明白了:
比如这样:
if [ "${grub_platform}" == "pc" ]; then


就是这个意思,用 if [ 需要 insmod test ,在 grub2 中 [ 是一条命令,存在于 test.mod 中。

zengq 发表于 2015-12-13 12:29:37

本帖最后由 zengq 于 2015-12-13 12:52 编辑

dos时代菜鸟 发表于 2015-12-11 23:22
就是这个意思,用 if [ 需要 insmod test ,在 grub2 中 [ 是一条命令,存在于 test.mod 中。

请问一下:
menuentry "用memdisk启动boot目录下的Win8PE "{
search --file --set=root "/boot/win8PE.iso"
linux16 /boot/memdisk iso raw
initrd16 /boot/Win8PE.iso
}
现在要同时满足if [ "${grub_platform}" == "pc" ]和ifsearch --file /boot/Win8PE.iso这两个条件才显示用memdisk启动boot目录下的Win8PE这个菜单,要怎么写:


if [ "${grub_platform}" == "pc" ]这两个条件间用什么符号联结才同时生效    search --file /boot/Win8PE.iso ;then
menuentry "用memdisk启动boot目录的Win8PE "{
   search --file --set=root "/boot/win8PE.iso"
linux16 /boot/memdisk iso raw
initrd16 /boot/Win8PE.iso
}
fi
我的意思是只有同时满足BIOS-MBR平台及在boot目录中存在Win8PE.iso文件,才显示菜单,否则不显示。
这两个条件间用什么符号联结才同时生效:尝试了and && || or 等都不成功,可能我写法有错误。。。

dos时代菜鸟 发表于 2015-12-13 21:51:41

zengq 发表于 2015-12-13 12:29
请问一下:
menuentry "用memdisk启动boot目录下的Win8PE "{
search --file --set=root "/boot/win8P ...

如此简单的工具你能要求他 有多么复杂的语法?用 两个 if 不就得了 ?

zengq 发表于 2015-12-14 11:01:25

dos时代菜鸟 发表于 2015-12-13 21:51
如此简单的工具你能要求他 有多么复杂的语法?用 两个 if 不就得了 ?

谢谢!!!!弄好了:
if[ "${grub_platform}" == "pc" ]; then
if search --file /boot/win8PE.iso ; then
menuentry "用memdisk启动boot目录下的Win8PE "{
search --file --set=root "/boot/win8PE.iso"
linux16 /boot/memdisk iso raw
initrd16 /boot/Win8PE.iso
}
fi
fi

devilma 发表于 2015-12-20 15:16:25

跟着学习了,谢谢dos

shan 发表于 2016-1-26 08:30:31

zengq 发表于 2015-12-14 11:01
谢谢!!!!弄好了:
if[ "${grub_platform}" == "pc" ]; then
if search --file /boot/win8PE.iso...

学习一下,云里雾里啊!
页: [1]
查看完整版本: 支持UEFI及BIOS主板的启动U盘,GRUB2菜单如何自动显示和隐藏?