|
发表于 2019-7-8 08:21:52
|
显示全部楼层
关于wee菜单的讨论,在Sysof时空论坛有,不过论坛已经挂了。我贴出来。
http://bbs.znpc.net/forum.php?mo ... &extra=page%3D1
讨论一下什么样的 menu.wee 最合理。
目前,chenall 发布的 weesetup 中的默认菜单是这样的:
复制内容到剪贴板
代码:
find --set-root /boot/grub/grldr
/boot/grub/grldr
timeout 1
default 0
title 1.GRUB4DOS
find --set-root /BOOT/GRUB/GRLDR
/BOOT/GRUB/GRLDR
find --set-root /BOOT/GRLDR
/BOOT/GRLDR
find --set-root /BOOT/GRUB.EXE
/BOOT/GRUB.EXE
find --set-root /grldr
/grldr
title 2.Windows
chainloader (hd0)1+1
find --set-root /bootmgr
/bootmgr
find --set-root /ntldr
/ntldr
title 3.Plop Boot Manager
find --set-root /BOOT/GRUB/PLPBT.BIN
/BOOT/GRUB/PLPBT.BIN
title 4.Vboot
find --set-root /vbootldr
/vbootldr
title 5.Burg
find --set-root /buldr
/buldr
大家讨论一下,怎么样才最好。就是说,希望用默认的菜单,即可满足大多数人的日常需要,无须更改了。
首先,我发现了 default 指向 grub4dos。这不适合大多数人。理由是,绝大多数人日常启动的是 Windows。所以,默认的项目应该是 Windows。
Windows 失败的时候,才会用到 grub4dos。
其次,对于 grub4dos 来说,应该首先搜索 grub.exe,然后才是 grldr。理由是,grldr 常被改名,有些文件虽然也叫做 grldr,但它却可能是别的某个软件。而 grub.exe 这个名字很少被别的软件使用。所以,搜索 grub.exe 更可靠。但也有一个问题:grub.exe 是 Linux 内核格式,它启动的时候,不像 grldr 那样有着“当前分区”的概念,所以,找相应的 menu.lst 是不行的,只好把 menu.lst 内置。不过,如果 wee 能够特别对待 grub.exe ,应该也能传递当前分区号。这在下一个 wee 版本中解决吧。
还有一个小小的问题,title 上的 1,2,3,4,5 序号,与第一个英文字母之间应该有一个空格,这样看着更舒服一些。
大家接着讨论还有什么别的问题,以及相应的改进措施。
我的WEE菜单是下面这样的,以WIN7为默认启动项,毕竟日常主要是用WIN系统。另外,我发觉WEE菜单可以忽略计算只有 title 一行而没有其他命令的,只显示不计算菜单项,这点很好;但是在GRUB4DOS中,则没有那么人性化,希望下次能够修改成一样——比如下面的菜单中,WEE里 default 2 可以正确指向title * 2. Find and boot Windows 7/Vista *,而G4D会指向title * 0. Boot 1st Hard Ddisk *,如果菜单编了数字标号并按数字选择菜单的话,会乱。
default 2
timeout 3
title ************* Xianglang's Wee Menu *************
title * *
title * 0. Boot 1st Hard Ddisk *
root (hd0,0)
+1
root (hd0,1)
+1
root (hd0,2)
+1
root (hd0,3)
+1
title * 1. Find and boot GRUB4DOS *
find --set-root /GRLDR
/GRLDR
find --set-root /GRUB/GRLDR
/GRUB/GRLDR
find --set-root /BOOT/GRLDR
/BOOT/GRLDR
find --set-root /BOOT/GRUB/GRLDR
/BOOT/GRUB/GRLDR
find --set-root /GRUB/GRUB.EXE
/GRUB/GRUB.EXE
find --set-root /BOOT/GRUB.EXE
/BOOT/GRUB.EXE
find --set-root /BOOT/GRUB/GRUB.EXE
/BOOT/GRUB/GRUB.EXE
title * 2. Find and boot Windows 7/Vista *
find --set-root /GRUB/SLIC
/GRUB/SLIC /GRUB/OEM.BIN
find --set-root /BOOTMGR
/BOOTMGR
title * 3. Find and boot Windows 2003/XP *
find --set-root /NTLDR
/NTLDR
title * *
title ********* http://xianglang.blog.163.com ********
发现我的菜单有一个错误。。。
title 2.Windows
chainloader (hd0)1+1
另外,我说一下我的WEE菜单作用。
1.如果没有任何按键的情况下,首先查找并直接启动/boot/grub/grldr(尽快让GRUB4DOS接管控制)
2.有按键(启动时能守寡快速按c键进入WEE命令行)就有可能进入WEE的菜单项选择启动。
3.WEE只是作为一个辅助的启动工具,一般人不需要理会它的菜单,除非有必要。
至于默认启动WINDOWS可以由GRUB4DOS来控制,必竟修改GRUB4DOS的菜单文件很方便。
我在GRUB4DOS接管控制之后再通过PRELOAD.BAT来控制启动项目,默认直接启动备份的MBR或第一个激活的主分区。
可以在指定时间内通过按不同的热键来实现不同的操作。
比如我自己用的设定。
按F9进入QGHO快速备份还原。
按F10进入MODBOOT,等等。
通过在启动时按不同的热键进入不同的系统。
并且通过PRELOAD.BAT,我们可以在WINDOWS或其它系统中通过修改PRELOAD.BAT控制下一次启动时默认的启动操作
比如,还是以QGHO为例。
通过PRELOAD.BAT
可以让系统在下一次重启时自动进入QGHO进行备份或还原操作(一次性的,再下一次启动时恢复默认)。
这样子我觉得比默认直接启动WINDOWS系统方便多了,启动初期我们可以全程控制。
缺省菜单是不是改为:
find --set-root /boot/grldr
/boot/grldr
timeout 1
default 1
title 1. GRUB4DOS
find --set-root /BOOT/GRUB/GRLDR
/BOOT/GRUB/GRLDR
find --set-root /BOOT/GRLDR
/BOOT/GRLDR
find --set-root /BOOT/GRUB.EXE
/BOOT/GRUB.EXE
find --set-root /grldr
/grldr
title 2. Windows
find --set-root /bootmgr
/bootmgr
find --set-root /ntldr
/ntldr
3月4日上载的 grub4dos 和 wee 版本,开始支持在启动 Linux kernel ----- grub.exe 的时候,把当前 grub4dos 的 root 设备传递给 grub.exe 作为它的默认 boot 设备。
我没有测试,但如果一切正常的话,grub4dos 的 kernel 命令以及 wee 下启动 grub.exe,都会把当前 root 设备传递给 grub.exe 作为 grub.exe 的启动设备。
例如,wee 之下执行 grub.exe,那么,grub.exe 接管控制后,会把原先的 wee 环境中的 root 设备当作 grub.exe 的启动设备。因此,在没有其他命令行参数的情况下,grub.exe 启动之后会在启动设备(也就是在 grub.exe 启动之前的 wee 的 root 设备)的根目录("/")之下寻找 menu.lst 文件。
需要说明的是,grub4dos下实际执行传递的时机是在 boot 命令执行时。因此,传递给 grub.exe 的启动设备,实际上是在 boot 命令之前最后设置的当前 root 设备。
补充:以上讨论当然只是在未修改 grub.exe 的预置菜单的情况下成立。如果用户已经定制了(即改动了)预置菜单,当然 grub.exe 就不一定会寻找根目录下的 menu.lst 文件了。
引用:
原帖由 xianglang 于 2011-3-1 01:26 发表
我发觉WEE菜单可以忽略计算只有 title 一行而没有其他命令的,只显示不计算菜单项,这点很好;但是在GRUB4DOS中,则没有那么人性化,希望下次能够修改成一样。
以前 Roy 也提出过这个建议,但我当时给出了否定的回答。
现在想来,也许有改进的余地。多个连续的 title 行,在 grub legacy 中的处理,是完全删除掉了其他的,只保留其中最后一项。因此,实际上没人会设置多余的 title 行。如果我们重新对待多余的 title 行,让它能够显示出来,这应该也不会造成太大的兼容性问题。
然而 grub4dos 已经有现成的显示“非执行性”菜单项的方案,所以,这个问题又不存在了。用户只需要在那些不希望执行的 title 之后插入一条 clear 之类的命令便可。这样做,与原先的 grub legacy 是 100% 兼容的。这样做的缺点是,“非执行性”的title也占用了一个title的项目,被计算在总的title数目之中。如果执意认定这是一个毛病,那也确实无可辩驳。所以,要想改进的话,也确实是可以做的。只是我个人觉得,这不会带来太大的好处,相反,弄不好再制造出点新的什么问题,影响了软件的稳定性,那就不值得了。
grub4dos 是 grub4dos,wee 是 wee,两者可以不同,互相不影响。各自都有自己的一套法则。
说一下我的一些分析和理解。
在大量的普通使用环境下,系统中总是有个 NTLDR 或者 BOOTMGR 的。无论是 GHOST 前,还是 GHOST 后,都有这么一个 NTLDR(BOOTMGR)。因此,启动微软的引导软件,基本上是有保障总是成功的。
而启动 grub4dos,则不一定总是成功。当然了,如果在 GHOST 之前事先把 GRUB4DOS 的文件放在 D: 盘,也是总能成功。然而,grub4dos 启动成功之后,主要还是为了启动微软的系统。因此,从 Wee 拐弯经由 grub4dos 来启动 Windows,似乎还是有点迟滞,虽然只是一眨眼的工夫。
更进一步分析,如果考虑到有些用户不明白 D: 盘之下的 grub4dos 文件都有什么用处,因而他可能会想当然地删掉 grub4dos 的文件,甚至也有可能把 C: 盘上的 grub4dos 也删掉,结果,wee 默认启动 grub4dos 就要失败了。而那些用户可能连简单的紧急应对措施都没有,这样实际上就给这些用户带来了麻烦。实际上,我们经常发现用户删掉启动文件(包括 NTLDR 和 BOOTMGR)造成启动失败,这原因是他们的系统被病毒折磨得厉害,他们企图手动“删除”病毒,胡乱折腾(有病乱投医),就把系统搞死了。如果他们看到grub4dos 的文件,他们更可能怀疑这是病毒,因为他们不了解这些文件有什么用处。在普通人的眼里,grub4dos 的地位,一定比 Windows 低,这点还是得承认的。
开发人员应该尽可能考虑周全,尽量避免给用户带来任何可能的不舒服的体验。
NTLDR 和 BOOTMGR 毕竟是微软的东西,熟悉它们的人是大量的,我们姑且假定没有人去删除微软的文件。
因此,综合考虑,我个人还是感觉让 wee 默认启动 Windows 较好。
新的版本准备改成如下默认菜单
1、首先尝试启动/boot/grub/grldr。
2、失败了就直接启动默认的WINDOWS菜单。
现在的问题是:
1.有没有必要显示WEE的菜单?
2.windows菜单
ntldr优先还是bootmgr优先?
还是备份的MBR优先。
按下面的WINDOWS菜单我觉得应该可行,不知还有没有其它情况。。
find --set-root /boot/grub/grldr
/boot/grub/grldr
timeout 0
default 0
title 1. Windows
find --set-root /bootmgr
/bootmgr
find --set-root /ntldr
/ntldr
(hd0)1+1
title 2. GRUB4DOS
find --set-root /BOOT/GRUB/GRLDR
/BOOT/GRUB/GRLDR
find --set-root /BOOT/GRUB.EXE
/BOOT/GRUB.EXE
find --set-root /BOOT/GRLDR
/BOOT/GRLDR
find --set-root /grldr
/grldr
title 3. Plop Boot Manager
find --set-root /BOOT/GRUB/PLPBT.BIN
/BOOT/GRUB/PLPBT.BIN
title 4. Vboot
find --set-root /vbootldr
/vbootldr
title 5. Burg
find --set-root /buldr
/buldr
想了想,觉得优先启动备份的MBR也许会比较好(但也有可能会因为备份的MBR是错误的,造成启动失败)。
wee有没有办法不通过MBR来启动第一个激活的分区?这样也许比较好。
grub4dos可以通过makeactive --status来确定。
我觉得应该是BOOTMGR优先,因为BOOTMGR是未来的趋势,况且BOOTMGR也可以认出BOOT.INI里面的启动项进而可以去启动2003/XP。我又修改了下自己的WEE菜单如下,默认还是WIN7优先,有菜单等1-3秒,可以方便正常启动和维护时要进入G4D——我觉得自己的菜单还是比较适合最广泛的使用和维护要求的:
default 1
timeout 3
title ************* Xianglang's Wee Menu *************
title * *
title * 0. Find and boot GRUB4DOS *
find --set-root /GRLDR
/GRLDR
find --set-root /GRUB/GRLDR
/GRUB/GRLDR
find --set-root /BOOT/GRLDR
/BOOT/GRLDR
find --set-root /BOOT/GRUB/GRLDR
/BOOT/GRUB/GRLDR
find --set-root /GRUB/GRUB.EXE
/GRUB/GRUB.EXE
find --set-root /BOOT/GRUB.EXE
/BOOT/GRUB.EXE
find --set-root /BOOT/GRUB/GRUB.EXE
/BOOT/GRUB/GRUB.EXE
title * 1. Find and boot Windows 7/Vista/2003/XP *
find --set-root /BOOTMGR
/BOOTMGR
find --set-root /NTLDR
/NTLDR
title * 2. Boot 1st Hard Disk *
root (hd0,0)
+1
root (hd0,1)
+1
root (hd0,2)
+1
root (hd0,3)
+1
title * *
title ********* http://xianglang.blog.163.com ********
关于启动的顺序,这个改进比较合理。
timeout 为 0 ,似乎 wee 目前的处理是直接跳过键盘,这样就不能事先敲入箭头键来选择菜单了。
个人感觉,似乎 timeout 为 1 给一个选择的机会比较好。
一秒种的菜单显示,也提醒用户有菜单存在,可以有机会选择启动。否则,如果完全没有菜单,用户可能根本意识不到有菜单存在,也就不会想到失败的时候有挽救的方法了。
如果 /boot/grub/grldr 存在,则根本不会等待,直接执行 grldr 了。所以,设置 timeout 为 1 没有什么坏处。
关于 bootmgr 优先还是 ntldr 优先的问题,我觉得大家还可以讨论。
我曾经遇到一例,用户的 win7 出现故障无法使用了。但用户说这个 win7 是正版的,不能删去,所以,分区还得保留。用户已经完全使用 XP 了,win7 实际上永远也不会进入了。但 bootmgr 仍然存在。如果 bootmgr 接管控制,它并不能正常引导 XP,因为它里面的 XP 的设置没弄好。在这种情况下,进入 bootmgr 就等于进入了死胡同。只有进入 ntldr 才能启动 XP。当然了,高手可以通过设置 bootmgr 的配置文件来成功启动 XP,但有许多人不愿意掌握这个技术,认为很复杂。
http://bbs.znpc.net/forum.php?mo ... muid=12697#pid47350
正常情况下使用我前面的菜单启动WINDOWS是没有什么问题。
但是也有特殊情况。比如多系统多个主分区时。会导致问题。
所以能不能修改一下WEE的find命令,加一个参数,让它可以查找活动分区。这样就可以适应所有的情况了
直接用FIND定位活动分区,然后加载该分区的引导扇区。不管它是BOOTMGR/NTLDR都没有什么影响。
这个应该不难,我一会看一下。
试了一下比较容易。
不过这个参数要如何命名呢?先用--actived,不点看一下怎么样比较好。
复制内容到剪贴板
代码:
Index: builtins.c
===================================================================
--- builtins.c (revision 57)
+++ builtins.c (working copy)
@@ -1468,6 +1468,7 @@
// unsigned long ignore_cd = 0;
unsigned long ignore_floppies = 0;
unsigned long ignore_oem = 0;
+ unsigned long actived = 0;
//char *in_drives = NULL; /* search in drive list */
char root_found[16];
@@ -1495,6 +1496,10 @@
{
ignore_oem = 1;
}
+ else if (grub_memcmp(arg,"--actived", 9) == 0)
+ {
+ actived = 1;
+ }
else
break;
arg = skip_to (arg);
@@ -1576,6 +1581,10 @@
next_partition_buf = mbr,
next_partition ())) */
{
+ if (actived && pi.boot_indicator != 0x80)
+ {
+ continue;
+ }
type = pi.part_type;
if (type != PC_SLICE_TYPE_NONE
&& ! (ignore_oem == 1 && (type & ~PC_SLICE_TYPE_HIDDEN_FLAG) == 0x02)
行啊,这个问题没什么要紧的。对于 wee 来说,空间的节约比较紧迫。而名称什么的,都靠边站了,不太重要。
不过,active 本身就是形容词,而actived 好像不是一个正确的单词。所以,还是用 active 比较好。
另外,在 --active 的时候,要求有 0x80 引导指示符,所以,扩展分区中的逻辑分区,就可以跳过了。只需查找主分区。
引用:
原帖由 不点 于 2011-3-5 18:15 发表
行啊,这个问题没什么要紧的。对于 wee 来说,空间的节约比较紧迫。而名称什么的,都靠边站了,不太重要。
不过,active 本身就是形容词,而actived 好像不是一个正确的单词。所以,还是用 active 比较好。
另外,在 --active 的时候 ...
嗯.
另外看了新版
if (active && (pi.part_num > 3 || pi.boot_indicator != 0x80))
continue;
我觉得改成如下会好一些
if (active)
{
if (pi.part_num > 3)
break;
else if (pi.boot_indicator != 0x80)
continue;
}
贴个目前wee默认的菜单。wee-2011-06-27
find --set-root /boot/grub/grldr /boot/grub/grldr
timeout 1
default 0
title 1. Windows
find --set-root --active command +1
find --set-root /bootmgr /bootmgr
find --set-root /ntldr /ntldr
title 2. Grub4dos
find --set-root /boot/grub/grldr /boot/grub/grldr
find --set-root /boot/grub.exe /boot/grub.exe
find --set-root /boot/grldr /boot/grldr
find --set-root /grub.exe /grub.exe
find --set-root /grldr /grldr
title 3. Plop Boot Manager
find --set-root /boot/grub/plpbt.bin /boot/grub/plpbt.bin
title 4. Vboot
find --set-root /vbootldr /vbootldr
title 5. Burg
find --set-root /buldr /buldr
|
|