liuzhaoyzz 发表于 2021-12-14 12:21:00

grub2能否查找活动分区的bootmgr?

本帖最后由 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菜单中不好实施。

wintoflash 发表于 2021-12-14 12:38:04

probe --bootable hdx,y -s aaa
检测分区是否为可启动分区(对于mbr分区表,指的是已激活分区,对于gpt分区表,指的是ESP分区)
若有可启动标志,则将变量aaa的值设为bootable,否则设为none。
使用for循环遍历分区,即可满足要求。参考代码:
https://github.com/a1ive/grub2-filemanager/blob/4a16f24e0f138e9b96418fe9637e979fb3e0dc69/boot/grubfm/osdetect.sh#L131

liuzhaoyzz 发表于 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
}
或者等你有兴趣有空的时候写个实现上面的菜单,我照搬照抄。

51740 发表于 2021-12-14 14:35:22

顶帖

wintoflash 发表于 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

liuzhaoyzz 发表于 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 }



hilsonma 发表于 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
}

liuzhaoyzz 发表于 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?

hilsonma 发表于 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
}

wintoflash 发表于 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。

hilsonma 发表于 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语句

hilsonma 发表于 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;}

2011whp 发表于 2021-12-16 13:06:14

这个意思是:
显示菜单前,菜单内的 流程已执行 至 一个 出口类命令处 然后停下来?(config   ntldr chainload 处)

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

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

liuzhaoyzz 发表于 2021-12-16 13:09:07

hilsonma 发表于 2021-12-16 07:48
不显示菜单是因为do前面漏了分号。

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


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

liuzhaoyzz 发表于 2021-12-16 13:14:06

hilsonma 发表于 2021-12-16 08:56
思考了一下,还是不加变量了。多一句probe,但算法并没有多,而改多一个变量就多了一次判断。
function wi ...

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

2011whp 发表于 2021-12-16 14:44:14

本帖最后由 2011whp 于 2021-12-16 15:00 编辑

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

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

加变量,计数器

grub帮助.chm

hilsonma 发表于 2021-12-16 17:00:51

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

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

liuzhaoyzz 发表于 2021-12-16 20:41:27

2011whp 发表于 2021-12-16 14:44
插入echo   read   (看有没有 pause 之类的 中断 )

看下 ,   


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

liuzhaoyzz 发表于 2021-12-16 20:44:14

hilsonma 发表于 2021-12-16 17:00
我不了解你的重入是指到其他菜单项后再入这个菜单项还是指到其他引导器后再到这个引导器
如果是多个引导 ...

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

你分析的很有道理。

gxbhlxl 发表于 2022-1-18 00:25:56

谢谢分享经验

hhhhwwww 发表于 2023-9-14 21:09:37

谢谢分享经验

lj249911023 发表于 2023-9-17 19:02:05

直接找search -n -s -f /Boot/BCD就好,非活动分区的/bootmgr无法启动,是因为非活动分区的Boot文件夹不存在。

szwp 发表于 2023-9-17 19:32:22

lj249911023 发表于 2023-9-17 19:02
直接找search -n -s -f /Boot/BCD就好,非活动分区的/bootmgr无法启动,是因为非活动分区的Boot文件夹 ...

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

rbwrbw 发表于 2023-10-8 09:34:17

ntldr 是什么命令!!!

liuzhaoyzz 发表于 2023-10-9 10:23:14

rbwrbw 发表于 2023-10-8 09:34
ntldr 是什么命令!!!

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

rbwrbw 发表于 2023-10-9 10:57:24

里面果然是高手如云,藏龙卧虎!!!

rbwrbw 发表于 2023-10-9 10:58:05

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

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

rbwrbw 发表于 2023-10-9 10:58:58

hilsonma 发表于 2021-12-16 17:00
我不了解你的重入是指到其他菜单项后再入这个菜单项还是指到其他引导器后再到这个引导器
如果是多个引导 ...

这样可能会造成死循环!!!!!
页: [1]
查看完整版本: grub2能否查找活动分区的bootmgr?