无忧启动论坛

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

[求助] grub2能否查找活动分区的bootmgr?

[复制链接]
发表于 2021-12-14 12:21:00 | 显示全部楼层 |阅读模式
本帖最后由 liuzhaoyzz 于 2021-12-14 21:43 编辑

grub2能否查找活动分区的bootmgr?
menuentry "0.Windows" "/bootmgr" --hotkey=0 {
search --no-floppy --set --file /bootmgr
ntldr /bootmgr
}


上面的菜单,如果找到的是非活动分区的/bootmgr,就无法启动,有没有办法让grub2找到活动分区的/bootmgr?
强制删除非活动分区的bootmgr是一个办法,但在grub2菜单中不好实施。
发表于 2021-12-14 12:38:04 | 显示全部楼层
probe --bootable hdx,y -s aaa
检测分区是否为可启动分区(对于mbr分区表,指的是已激活分区,对于gpt分区表,指的是ESP分区)
若有可启动标志,则将变量aaa的值设为bootable,否则设为none。
使用for循环遍历分区,即可满足要求。参考代码:
https://github.com/a1ive/grub2-f ... fm/osdetect.sh#L131

点评

感觉还是有点复杂,还要考虑ntldr的情况,我看还是绕弯解决吧。 menuentry "0.Windows" "/bootmgr" --hotkey=0 { if search --no-floppy --set --file /bootmgr ; then chainloader +1 elif search --no-flopp  详情 回复 发表于 2021-12-14 14:05
回复

使用道具 举报

 楼主| 发表于 2021-12-14 14:05:34 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-12-14 21:25 编辑
wintoflash 发表于 2021-12-14 12:38
probe --bootable hdx,y -s aaa
检测分区是否为可启动分区(对于mbr分区表,指的是已激活分区,对于gpt分区 ...

感觉还是有点复杂,还要考虑ntldr的情况,我看还是绕弯解决吧。

menuentry "0.Windows" "/bootmgr" --hotkey=0 {
if search --no-floppy --set --file /bootmgr ; then
ntldr /bootmgr
elif search --no-floppy --set --file /ntldr ; then
ntldr /ntldr
fi
}
或者等你有兴趣有空的时候写个实现上面的菜单,我照搬照抄。

回复

使用道具 举报

发表于 2021-12-14 14:35:22 | 显示全部楼层
顶帖
回复

使用道具 举报

发表于 2021-12-14 15:03:10 | 显示全部楼层
本帖最后由 wintoflash 于 2021-12-14 15:05 编辑

没有你想像的那么难。以下是伪代码,仅供参考:
for d in (hd*,msdos*) do
  if [ -e ${d} ] then
    regexp --set=disk '\((.*)\)' "${d}"
  else
    continue
  fi
  probe --set=flag -b ${disk}
  if [ "${flag}" = "none" ] then
    continue
  fi
  if [ -f "(${disk})/ntldr" ] then
    menuentry "BOOT NTLDR" { ... }
  elif [ -f "(${disk})/bootmgr" ] then
    menuentry "BOOT BOOTMGR" { ... }
  fi
done

点评

menuentry "01.Windows" "/bootmgr" --hotkey=0 { for d in (hd*,msdos*) do if [ -e ${d} ] then regexp --set=disk '\((.*)\)' "${d}" else continue fi probe --set=flag -b ${disk} i  详情 回复 发表于 2021-12-14 21:42
回复

使用道具 举报

 楼主| 发表于 2021-12-14 21:42:08 | 显示全部楼层
wintoflash 发表于 2021-12-14 15:03
没有你想像的那么难。以下是伪代码,仅供参考:
for d in (hd*,msdos*) do
  if [ -e ${d} ] then

menuentry "01.Windows" "/bootmgr" --hotkey=0 {
for d in (hd*,msdos*) do
  if [ -e ${d} ] then
    regexp --set=disk '\((.*)\)' "${d}"
  else
    continue
  fi
  probe --set=flag -b ${disk}
  if [ "${flag}" = "none" ] then
    continue
  fi
  if [ -f "(${disk})/ntldr" ] then
    menuentry "BOOT NTLDR" { ntldr /ntldr }
  elif [ -f "(${disk})/bootmgr" ] then
    menuentry "BOOT BOOTMGR" { ntldr /bootmgr }
  fi
done
}

我瞎改了下,上面的菜单不能重入,比如说grub4dos→grub2→grub4dos→grub2,第一次可以,第二次就不行了,好像菜单直接被简化成了:
    menuentry "BOOT NTLDR" { ntldr /ntldr }
或者
    menuentry "BOOT BOOTMGR" { ntldr /bootmgr }



点评

用 grub-script-check 可以检查脚本的语法错误。 不能 menuentry 套 menuentry。  详情 回复 发表于 2021-12-16 08:20
回复

使用道具 举报

发表于 2021-12-15 08:20:40 | 显示全部楼层
menuentry "01.Windows" "/bootmgr" --hotkey=0 {
  set file1=$2
  for d in (hd*,msdos*) do
    if test -f $d$file1; then
      probe --set=flag -b $d
      if [ "${flag}" = "bootable" ] then
        set ldr=$d$file1
      fi
    fi
  done
  ntldr $ldr
}

点评

怎么这个显示不了菜单?是不是有哪里书写错误?我没找出来。  详情 回复 发表于 2021-12-15 14:37
回复

使用道具 举报

 楼主| 发表于 2021-12-15 14:37:02 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-12-15 14:44 编辑
hilsonma 发表于 2021-12-15 08:20
menuentry "01.Windows" "/bootmgr" --hotkey=0 {
  set file1=$2
  for d in (hd*,msdos*) do

怎么这个显示不了菜单?是不是有哪里书写错误?我没找出来。

另外,能否实现优先查找/bootmgr,找不到再找/ntldr?

点评

不显示菜单是因为do前面漏了分号。 menuentry "0.Windows" --hotkey=0 { for d in (hd*,msdos*); do if [ -z $ldr];then if [ -f $d/bootmgr ]; then probe --set=flag -b $d i  详情 回复 发表于 2021-12-16 07:48
回复

使用道具 举报

发表于 2021-12-16 07:48:06 | 显示全部楼层
liuzhaoyzz 发表于 2021-12-15 14:37
怎么这个显示不了菜单?是不是有哪里书写错误?我没找出来。

另外,能否实现优先查找/bootmgr,找不到 ...

不显示菜单是因为do前面漏了分号。

menuentry "0.Windows" --hotkey=0 {
  for d in (hd*,msdos*); do
    if [ -z $ldr];then
      if [ -f $d/bootmgr ]; then
        probe --set=flag -b $d
        if [ "${flag}" = "bootable" ]; then
          set ldr=$d/bootmgr
        fi
      elif [ -f $d/ntldr ]; then
        probe --set=flag -b $d
        if [ "${flag}" = "bootable" ]; then
          set ldr=$d/ntldr
        fi
      fi
    fi
  done
  if [ $ldr ];then ntldr $ldr;fi
}

点评

这个菜单,不支持重入,第一次打开没问题,第二次就不行了。  详情 回复 发表于 2021-12-16 13:09
回复

使用道具 举报

发表于 2021-12-16 08:20:00 | 显示全部楼层
liuzhaoyzz 发表于 2021-12-14 21:42
menuentry "01.Windows" "/bootmgr" --hotkey=0 {
for d in (hd*,msdos*) do
  if [ -e ${d} ] then

用 grub-script-check 可以检查脚本的语法错误。

不能 menuentry 套 menuentry。

评分

参与人数 1无忧币 +10 收起 理由
liuzhaoyzz + 10 很给力!

查看全部评分

回复

使用道具 举报

发表于 2021-12-16 08:27:49 | 显示全部楼层
function win {
  if [ -z $ldr ];then
    for d in (hd*,msdos*); do
      if [ -z $ldr];then
        if [ -f $d/bootmgr ]; then
          set ldr1=$d/bootmgr
        elif [ -f $d/ntldr ]; then
          set ldr1=$d/ntldr
        else
          set ldr1=""
        fi
        if [ $ldr1 ];then
          probe --set=bf -b $d
          if [ "$bf" = "bootable" ]; then
            set ldr=$ldr1
          fi
        fi
      fi
    done
  fi
  if [ $ldr ];then ntldr $ldr;fi
}

menuentry "0.Windows" --hotkey=0 {win;}

以上是将菜单里的内容独立出来定义一个子命令
查找前加多一个判断,是避免重复进菜单时重复查找
最里面加多一个变量是加变量来减代码,减少probe语句
回复

使用道具 举报

发表于 2021-12-16 08:56:28 | 显示全部楼层
思考了一下,还是不加变量了。多一句probe,但算法并没有多,而改多一个变量就多了一次判断。
function win {
  if [ -z $ldr ];then
    for d in (hd*,msdos*); do
      if [ -z $ldr];then
        if [ -f $d/bootmgr ]; then
          probe --set=bf -b $d
          if [ "$bf" = "bootable" ]; then set ldr=$d/bootmgr; fi
        elif [ -f $d/ntldr ]; then
          probe --set=bf -b $d
          if [ "$bf" = "bootable" ]; then set ldr=$d/ntldr; fi
        fi
      fi
    done
  fi
  if [ $ldr ];then ntldr $ldr;fi
}

menuentry "0.Windows" --hotkey=0 {win;}

点评

好像这个菜单,也不能重入。  详情 回复 发表于 2021-12-16 13:14
回复

使用道具 举报

发表于 2021-12-16 13:06:14 | 显示全部楼层
这个意思是:
显示菜单前,菜单内的 流程已执行 至 一个 出口类命令处 然后停下来?(config   ntldr chainload 处)

然后 选菜单,回车时,直接 执行 出口类命令断点,加boot

而且  grub2 →g4d →grub2,  还能记着 断点?(liuzhaoyzz  的 g4d 是 用了 返回到 grub2吧)
回复

使用道具 举报

 楼主| 发表于 2021-12-16 13:09:07 | 显示全部楼层
hilsonma 发表于 2021-12-16 07:48
不显示菜单是因为do前面漏了分号。

menuentry "0.Windows" --hotkey=0 {

这个菜单,不支持重入,第一次打开没问题,第二次就不行了。
回复

使用道具 举报

 楼主| 发表于 2021-12-16 13:14:06 | 显示全部楼层
hilsonma 发表于 2021-12-16 08:56
思考了一下,还是不加变量了。多一句probe,但算法并没有多,而改多一个变量就多了一次判断。
function wi ...

好像这个菜单,也不能重入。

点评

我不了解你的重入是指到其他菜单项后再入这个菜单项还是指到其他引导器后再到这个引导器 如果是多个引导软件互相调用,不建议这样操作,实在有需要,也尽量是在同一个引导器中调用另一个,不建议象俄罗斯套娃一样多  详情 回复 发表于 2021-12-16 17:00
回复

使用道具 举报

发表于 2021-12-16 14:44:14 | 显示全部楼层
本帖最后由 2011whp 于 2021-12-16 15:00 编辑

插入  echo   read   (看  有没有 pause 之类的 中断 )

看下 ,   
  重点 在 ntldr 后看 下, ;echo ok1 ; read;

加变量,计数器

grub帮助.chm

点评

你看下吧,我不会折腾,我喜欢偷懒  详情 回复 发表于 2021-12-16 20:41
回复

使用道具 举报

发表于 2021-12-16 17:00:51 | 显示全部楼层
liuzhaoyzz 发表于 2021-12-16 13:14
好像这个菜单,也不能重入。

我不了解你的重入是指到其他菜单项后再入这个菜单项还是指到其他引导器后再到这个引导器
如果是多个引导软件互相调用,不建议这样操作,实在有需要,也尽量是在同一个引导器中调用另一个,不建议象俄罗斯套娃一样多重套用。我的看法是常规的操作系统的内存管理都不是很完善了更何况这些引导器,多重套用应该会有内存管理方面的问题导致崩溃而不是某些菜单项的原因,这是我的估计,我没有办法证实。但少套用就会少问题发生,这是确实的。我的经历告诉我,特别是grub系引导器的重复套用或同一个引导器多次调用自身,特别容易宕机。

点评

这样可能会造成死循环!!!!!  详情 回复 发表于 2023-10-9 10:58
重入,指的是bootmgr→grub2→bootmgr→grub2,grub4dos→grub2→bootmgr→grub2,用你的菜单,第一次可以进入,第二次好像就不行了。 因为有人就反应这样子会出错,我不明所以,所以有此一问。 你分析的很有道  详情 回复 发表于 2021-12-16 20:44
回复

使用道具 举报

 楼主| 发表于 2021-12-16 20:41:27 | 显示全部楼层
2011whp 发表于 2021-12-16 14:44
插入  echo   read   (看  有没有 pause 之类的 中断 )

看下 ,   

你看下吧,我不会折腾,我喜欢偷懒
回复

使用道具 举报

 楼主| 发表于 2021-12-16 20:44:14 | 显示全部楼层
hilsonma 发表于 2021-12-16 17:00
我不了解你的重入是指到其他菜单项后再入这个菜单项还是指到其他引导器后再到这个引导器
如果是多个引导 ...

重入,指的是bootmgr→grub2→bootmgr→grub2,grub4dos→grub2→bootmgr→grub2,用你的菜单,第一次可以进入,第二次好像就不行了。
因为有人就反应这样子会出错,我不明所以,所以有此一问。

你分析的很有道理。
回复

使用道具 举报

发表于 2022-1-18 00:25:56 来自手机 | 显示全部楼层
谢谢分享经验
回复

使用道具 举报

发表于 2023-9-14 21:09:37 | 显示全部楼层
谢谢分享经验
回复

使用道具 举报

发表于 2023-9-17 19:02:05 | 显示全部楼层
直接找  search -n -s -f /Boot/BCD  就好,非活动分区的/bootmgr无法启动,是因为非活动分区的Boot文件夹不存在。

点评

mbr6支持多个活动分区。切换活动分区多系统用自己BCD,互相隔离  详情 回复 发表于 2023-9-17 19:32
回复

使用道具 举报

发表于 2023-9-17 19:32:22 来自手机 | 显示全部楼层
lj249911023 发表于 2023-9-17 19:02
直接找  search -n -s -f /Boot/BCD  就好,非活动分区的/bootmgr无法启动,是因为非活动分区的Boot文件夹 ...

mbr6支持多个活动分区。切换活动分区多系统用自己BCD,互相隔离

点评

很好,能说得更详细些吗???  详情 回复 发表于 2023-10-9 10:58
回复

使用道具 举报

发表于 2023-10-8 09:34:17 | 显示全部楼层
ntldr 是什么命令!!!

点评

用于windows NT的引导器,比如ntldr/bootmgr  详情 回复 发表于 2023-10-9 10:23
回复

使用道具 举报

 楼主| 发表于 2023-10-9 10:23:14 | 显示全部楼层
rbwrbw 发表于 2023-10-8 09:34
ntldr 是什么命令!!!

用于windows NT的引导器,比如ntldr/bootmgr
回复

使用道具 举报

发表于 2023-10-9 10:57:24 | 显示全部楼层
里面果然是高手如云,藏龙卧虎!!!
回复

使用道具 举报

发表于 2023-10-9 10:58:05 | 显示全部楼层
szwp 发表于 2023-9-17 19:32
mbr6支持多个活动分区。切换活动分区多系统用自己BCD,互相隔离

很好,能说得更详细些吗???
回复

使用道具 举报

发表于 2023-10-9 10:58:58 | 显示全部楼层
hilsonma 发表于 2021-12-16 17:00
我不了解你的重入是指到其他菜单项后再入这个菜单项还是指到其他引导器后再到这个引导器
如果是多个引导 ...

这样可能会造成死循环!!!!!
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-29 16:35

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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