无忧启动论坛

标题: 支持UEFI及BIOS主板的启动U盘,GRUB2菜单如何自动显示和隐藏? [打印本页]

作者: zengq    时间: 2015-12-10 20:39
标题: 支持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
如果我没记错 Uefi启动跟MBR启动grub2的启动配置文件是分开的 本来就是两套配置文件 参考下ubuntu X64的配置文件
作者: zengq    时间: 2015-12-10 21:47
本帖最后由 zengq 于 2015-12-10 21:52 编辑

我用winly引导已实現了两者只调用winly.cfg这个菜单,就不知道if......,then
fi     如何写.現在只能在菜单上标注UEFI来区分.
作者: dos时代菜鸟    时间: 2015-12-11 08:22
看这个 详解.7z (31.93 KB, 下载次数: 45)

grub2 有内部变量 来区分 是否 ufi
作者: lbw2007    时间: 2015-12-11 09:12
这个应该简单。将mbr做成grub4dos,然后在fat分区内同时放置grub4dos和grub2的引导文件。
这样在BIOS下,BIOS会查找mbr然后启动grub4dos,
在UEFI下,UEFI会直接查找booti32.efi或bootx64.efi。
两者不冲突。
作者: zengq    时间: 2015-12-11 09:57
本帖最后由 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
}

if  search --file /boot/gparted-live-0.24.0-2-amd64.iso; then
menuentry "gparted-live-0.24.0-2-amd64.iso  UEFI&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 quiet  live-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

if  search --file /boot/LuoBo_GhostXP_SP3_v2012.07.iso; then
menuentry "用grub4dos启动install  LuoBo_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

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

原来是隐藏菜单里面的内容。
建议用4楼的办法
作者: zengq    时间: 2015-12-11 21:49
本帖最后由 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 ... 4%B8%AD%E6%96%87%29
作者: dos时代菜鸟    时间: 2015-12-11 23:22
zengq 发表于 2015-12-11 21:49
谢谢!大概明白了:
比如这样:
if [ "${grub_platform}" == "pc" ]; then

就是这个意思,用 if [ 需要 insmod test ,在 grub2 中 [ 是一条命令,存在于 test.mod 中  。
作者: zengq    时间: 2015-12-13 12:29
本帖最后由 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" ]  和  if  search --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
zengq 发表于 2015-12-13 12:29
请问一下:
menuentry "用memdisk启动boot目录下的Win8PE "{
search --file --set=root "/boot/win8P ...

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

  
作者: zengq    时间: 2015-12-14 11:01
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
跟着学习了,谢谢dos

作者: shan    时间: 2016-1-26 08:30
zengq 发表于 2015-12-14 11:01
谢谢!!!!弄好了:
if  [ "${grub_platform}" == "pc" ]; then
if search --file /boot/win8PE.iso  ...

学习一下,云里雾里啊!




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