无忧启动论坛

标题: 感觉应该仿照 multimbr 的方式改造内置菜单使其适应那些只有 “单扇区” 访问的电脑 [打印本页]

作者: 不点    时间: 2014-10-27 19:33
标题: 感觉应该仿照 multimbr 的方式改造内置菜单使其适应那些只有 “单扇区” 访问的电脑
有极少数电脑在 USB 启动时,其 LBA 支持是有毛病的,如果进行多扇区访问(一次 int13 读取扇区数大于 1),则立即死机。

对于这样的电脑,常规的 grub4dos 接管控制后必然立即死机。任何访问 U 盘的动作,都会导致死机。比如查找 menu.lst 的动作就要死机(不管是否找到)。

因此,我觉得应该仿照 multimbr 项目的处理方式,来改进目前的内置菜单。

我把改进后的内置菜单贴出来,供 chenall、yaya 等维护者们研究、参考。


  1. pxe detect
  2. geometry --lba1sector
  3. default 0
  4. timeout 1

  5. title find menu.lst (fast, with geometry --lba127sector)
  6.         geometry --lba127sector
  7.         errorcheck off
  8.         configfile /menu.lst
  9.         configfile /boot/grub/menu.lst
  10.         configfile /grub/menu.lst
  11.         if "%@root%"=="(ud)" && calc *0x82A0=*0x82b9&0xff
  12.         if "%@root:~1,1%"=="f" && find --set-root --devices=f /menu.lst && configfile /menu.lst
  13.         find --set-root --ignore-floppies --ignore-cd /menu.lst && configfile /menu.lst
  14.         find --set-root --ignore-floppies --ignore-cd /boot/grub/menu.lst && configfile /boot/grub/menu.lst
  15.         find --set-root --ignore-floppies --ignore-cd /grub/menu.lst && configfile /grub/menu.lst
  16.         errorcheck on
  17.         commandline

  18. title find menu.lst (slow, failsafe, without geometry --lba127sector)
  19.         errorcheck off
  20.         configfile /menu.lst
  21.         configfile /boot/grub/menu.lst
  22.         configfile /grub/menu.lst
  23.         if "%@root%"=="(ud)" && calc *0x82A0=*0x82b9&0xff
  24.         if "%@root:~1,1%"=="f" && find --set-root --devices=f /menu.lst && configfile /menu.lst
  25.         find --set-root --ignore-floppies --ignore-cd /menu.lst && configfile /menu.lst
  26.         find --set-root --ignore-floppies --ignore-cd /boot/grub/menu.lst && configfile /boot/grub/menu.lst
  27.         find --set-root --ignore-floppies --ignore-cd /grub/menu.lst && configfile /grub/menu.lst
  28.         errorcheck on
  29.         commandline

  30. title commandline
  31.         commandline

  32. title reboot
  33.         reboot

  34. title halt
  35.         halt

复制代码


默认的菜单适用于绝大多数情况。但是默认的菜单在 buggy 机器上会死机。如果用户遇到死机,那么在下次启动时,有机会选择慢速的、可靠的单扇区访问菜单项,从而成功进入 grub4dos,并完成后续一系列启动任务。

上述菜单所可能带来的兼容性问题,有待研究者们深入考察和检验。


作者: pseudo    时间: 2014-10-28 13:40
简化一下
title find menu.lst (fast, with geometry --lba127sector)
geometry --lba127sector
goto 1
commandline
title find menu.lst (slow, failsafe, without geometry --lba127sector)
......
作者: 不点    时间: 2014-10-28 15:37
pseudo 发表于 2014-10-28 13:40
简化一下
title find menu.lst (fast, with geometry --lba127sector)
geometry --lba127sector

不愧是高手,确实更好。

另外,fallback 命令有 “+1” 参数的用法,意思是进入紧接着的下一个菜单项的命令序列中。那么类似地,goto 命令也应该支持 “+1” 参数,也是相对于本菜单项,进入下一个紧接着的菜单项之中。我不知道 chenall 是否已经实现了,如果没有实现,我觉得倒是值得加以实现。大概 pseudo 了解目前的版本是否实现了 goto +1 的用法。


作者: zhaohj    时间: 2014-10-31 10:29
一次 int13 读取扇区数大于 1则立即死机的电脑,geometry --lba127sector不会死机吗?
作者: 不点    时间: 2014-10-31 12:18
zhaohj 发表于 2014-10-31 10:29
一次 int13 读取扇区数大于 1则立即死机的电脑,geometry --lba127sector不会死机吗?

当然死机了。你没看到差别在哪里。差别在这里:死机后,用户下次启动时,有机会 “不” 选择 geometry --lba127sector,从而 “不” 死机。这就是改进之处。

其实我在考虑,可以不改动现有的菜单框架,只在菜单初始化命令中增加一条

geometry --lba1sector

的命令即可,这条命令是有条件执行的,用 pause 命令给用户提示,当键入某个按键的时候,这条命令才执行,否则,这条命令默认时不执行。这样,即可应付这些 buggy BIOS,又不影响大家正常使用的方便快捷。

至于如何设计,我想,chenall 应该可以弄好。条件命令是 chenall 设计的。


作者: chenall    时间: 2014-10-31 14:02
可以给个提示在3秒以内按某个按键比如(空格)时执行这条命令,否则默认不执行。

作者: chenall    时间: 2014-10-31 14:42
问一下不点,目前的initrd加载多个文件是什么格式的??

是不可以改成cpio格式?
作者: 不点    时间: 2014-10-31 15:42
chenall 发表于 2014-10-31 14:02
可以给个提示在3秒以内按某个按键比如(空格)时执行这条命令,否则默认不执行。

如果不想改 geometry 命令,可以像我提到的那样,用 pause 命令再配合 && 或 || 来弄。

如果要改 geometry 命令,则不需要 pause 命令了。总之,你权衡着看吧。


作者: 不点    时间: 2014-10-31 15:47
chenall 发表于 2014-10-31 14:42
问一下不点,目前的initrd加载多个文件是什么格式的??

是不可以改成cpio格式?

initrd 命令本身不知道、不认识、也不管要加载的文件是什么格式。这些文件是由 Linux 内核来处理的。

linux 内核通常支持 cpio 格式。所以,initrd 可以加载多个 cpio 格式的文件。

我还没听说过 linux 内核支持别的 initrd 格式,所以,cpio 是我所了解的、仅有的、可以多个文件同时用于 initrd 的格式。


作者: chenall    时间: 2014-10-31 17:38
不点 发表于 2014-10-31 15:47
initrd 命令本身不知道、不认识、也不管要加载的文件是什么格式。这些文件是由 Linux 内核来处理的。

...

试了下目前grub4dos使用以下命令加载
initrd /xxx.gz /yyy.gz

之后查看(0x22)的内容,好像只是简单的拼接起来的。

如果是单行执行的则只保留最后一个。我打算改进一下。

让GRUB4DOS执行多个initrd命令时自动把加载的文件处理成cpio格式

不知好不好处理,我先去查一下CPIO的文件格式。
作者: x9tian    时间: 2014-11-12 13:54
       find --set-root --ignore-floppies --ignore-cd /menu.lst && configfile /menu.lst         find --set-root --ignore-floppies --ignore-cd /boot/grub/menu.lst && configfile /boot/grub/menu.lst         find --set-root --ignore-floppies --ignore-cd /grub/menu.lst && configfile /grub/menu.lst       应当可以这样写      find --set-root --ignore-floppies --ignore-cd /grub/menu.lst && “## ”  && configfile /menu.lst || configfile /boot/grub/menu.lst || configfile /grub/menu.lst    以上这条命令的 “##”   为g4d  支持的任意命令,  它的作用只是启着 让 第二个管道符 &&  成立 时生效。也就是说  它是为了排除 find --set-root  这句没有找到时 不会 运行 否定 管道符 ||  (必须是find 成功了,先找不到/menu.lst  才会找||后面的复合语句)     
作者: x9tian    时间: 2014-11-12 13:56
不点大,不好意思 因为是手机输入的  所以工整性几乎无法直视,让大家不好阅读了见谅见谅




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