不点 发表于 2015-7-22 21:58:19

menu.wee 的一点微调,chenall 留意一下

本帖最后由 不点 于 2015-7-22 21:59 编辑

背景:我用 diskgen 调整 C 盘分区大小之后,C 盘 PBR 代码(是微软的代码)失效。如果是 GRLDR 的代码,则不会失效。但微软的代码就可能失效了。用失效的代码启动,则必定是死机。我已经遇到好几次死机了。修复的办法是用 BootICE 重新建立 PBR(修复后可以正常启动)。

目前的 menu.wee 的默认启动项目如下:
title 1. Windows
find --set-root --active
+1
find --set-root /bootmgr
/bootmgr
find --set-root /ntldr
/ntldr

它首先查找活动分区,只要发现了活动分区,就加载并启动活动分区的 PBR。

另外,上述代码在 find 活动分区失败时,也要执行一个扇区,这个扇区就是 MBR。这样就成无限循环了:反复执行 MBR,反复找不到活动分区。这应该也是一个 bug。

确实有可能存在没有活动分区的情况。在纯粹 Linux 环境下(当用户没有安装微软的操作系统时),这就有可能不存在活动分区了。



言归正传。当存在活动分区,并且活动分区的 PBR 导致死机时,执行 +1 就是执行这个 PBR,此时必然死机。

可以改进一下,仅当活动分区中存在 bootmgr 或 ntldr 时,才启动它。

改进后的代码如下(未经测试),供 chenall 研究。改进的要点是,避免执行“+1”这个容易引起失败的引导扇区代码。

title 1. Windows
find --set-root --active /bootmgr
/bootmgr
find --set-root --active /ntldr
/ntldr
find --set-root /bootmgr
/bootmgr
find --set-root /ntldr
/ntldr

下面这个是不是更好?请 chenall 确认一下:

title 1. DOS/Windows
find --set-root --active /bootmgr /bootmgr
find --set-root --active /ntldr /ntldr
find --set-root --active /io.sys /io.sys
find --set-root /bootmgr /bootmgr
find --set-root /ntldr /ntldr
find --set-root /io.sys /io.sys

另外,再增加一个进入 command line 的菜单项:

title 6. Command Line
exit

其好处是,可以提醒那些不太了解 Wee 的用户,此时可以进入命令行,来对付那些启动失败的情况。

这是“用户友好”的。其实也是个善意的广告,让用户知道此时有命令行可以进入。

邪恶海盗 发表于 2015-7-22 22:26:43

我在PE下用DiskGenius调整过C盘插屁大小,暂时没发现引导问题,不过不记得有没有重建过引导了...

wylgogogo 发表于 2015-7-22 23:24:34

了解下,不点大师指点。

不点 发表于 2015-12-12 12:28:31

本帖最后由 不点 于 2015-12-12 12:53 编辑

又作了少量微调,贴出完整的菜单:
find --set-root /boot/grub/grldr
/boot/grub/grldr
timeout 1
default 0

title 1. DOS/Windows
    find --set-root --active /bootmgr /bootmgr
    find --set-root --active /ntldr /ntldr
    find --set-root --active /io.sys /io.sys
    find --set-root /bootmgr /bootmgr
    find --set-root /ntldr /ntldr
    find --set-root /io.sys /io.sys

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

title 6. Previous MBR
    (hd0)1+1

title 7. Command Line
    exit


解释一下。第一项菜单,是默认要执行的。先从活动分区查找 DOS、Windows 的启动文件。如果存在,就启动它。如果活动分区没有找到 Windows 的启动文件,那就在其他分区寻找。如果找到,也会试图启动它。如果都没找到,则属于启动失败。当 wee 的某个菜单项失败时,都是进入命令行,等待用户的进一步调试和处理。

第六项菜单,启动保存在第二扇区上的“先前的 MBR 代码”。如果这个扇区不含 55 AA 合法启动标志,那将拒绝启动,给出失败信息。失败后进入命令行等待用户干预。如果这个扇区含有 55 AA 合法启动标志,则把控制权交给这个扇区。

第七项菜单,进入命令行。当默认菜单会产生死机或其他不正常情况时,这个菜单就是有用的了。


不点 发表于 2015-12-16 11:09:12

今天给别人装机时,刚好证实了,上述菜单解决了 NTLDR is missing 的问题。

BOOTICE 里面的 Wee 的默认菜单,会导致 NTLDR is missing 启动失败,把菜单更改为上述菜单之后,顺利启动 Windows。

因此,建议 BOOTICE 的作者更新 Wee 的默认菜单。

chenall 发表于 2015-12-16 19:45:54

源码已同步更新.

https://github.com/chenall/grubutils/commit/2467d7f315be672dd8adb102dd173d76a6bed065

2013abcdefg 发表于 2015-12-16 21:08:39

wee最新版本在那里下了? 以前的都不能下了. 最新的可以做个release的吗?

cchessbd 发表于 2015-12-17 09:33:00

本帖最后由 cchessbd 于 2015-12-17 09:45 编辑

不点 发表于 2015-12-12 12:28
又作了少量微调,贴出完整的菜单:




如果MBR安装的是wee,(hd0)1+1用法有没有问题?

第六项菜单,启动保存在第二扇区上的“先前的 MBR 代码”。如果这个扇区不含 55 AA 合法启动标志,那将拒绝启动,给出失败信息。失败后进入命令行等待用户干预。如果这个扇区含有 55 AA 合法启动标志,则把控制权交给这个扇区。

用winhex看了保存下来的wee.bin,明白了,不会启动这个扇区。

qaz10533 发表于 2015-12-21 00:30:25

支持wee做的更好,让我们多一个更好的选择~

cchessbd 发表于 2016-1-27 13:25:51

本帖最后由 cchessbd 于 2016-1-27 13:28 编辑

不点大大,第一、二行代码代码是应该合并为一行还是本来就是两行?

find --set-root /boot/grub/grldr /boot/grub/grldr
timeout 1
default 0

title 1. DOS/Windows
find --set-root --active /bootmgr /bootmgr
find --set-root --active /ntldr /ntldr
find --set-root --active /io.sys /io.sys
find --set-root /bootmgr /bootmgr
find --set-root /ntldr /ntldr
find --set-root /io.sys /io.sys

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

title 6. Previous MBR
(hd0)1+1

title 7. Command Line
exit

不点 发表于 2016-1-27 15:41:25

cchessbd 发表于 2016-1-27 13:25
不点大大,第一、二行代码代码是应该合并为一行还是本来就是两行?

此处一行和两行,有细微差别,差别不是很大,应该都行吧。

各菜单项里面的文件名和路径,都应该是小写字母,而我年纪大了疏忽大意,有些就弄成了大写。最好都统一成小写。

qj_tzy 发表于 2016-1-29 10:12:31

本帖最后由 qj_tzy 于 2016-1-29 10:20 编辑

chenall 发表于 2015-12-16 19:45
源码已同步更新.

https://github.com/chenall/grubutils/commit/2467d7f315be672dd8adb102dd173d76a6bed ...

请教:

1.在https://github.com/chenall/grubu ... 102dd173d76a6bed065贴出的用法中,每行前有一个+号或-号,不知是何意,想请解释下。另如何下载此新版的wee,用bootice进行安装。

2.wee在gpt分区硬盘上测试未成功的问题:

我用bootice将以下菜单写入到MBR分区硬盘的主引导记录中,保存63个扇区到wee_63.bin中;将wee_63.bin及g4d目录下的文件保存到GPT分区硬盘ESP分区中;用您发布的umbr,用umbr -d=0 (hd0,0)/g4d/grldr 写入引导;在grub4dos中,用chainloader (hd0,0)/g4d/wee_63.bin 调用之,能出现菜单,但在菜单项处按下回车键时未执行,仍显示该菜单。

请教:wee在gpt分区硬盘上如何才能引导成功。

谢谢!


find --set-root /g4d/pwins
timeout 10
default 0
title
title                   ** Wee Menu **
title -----------------------------------------------
title 0.Search Boot Partition Windows nt6/nt5 System
command /g4d/pwins
title 1.Boot windows 8 PE
command /g4d/gw8pe
title 3.grub4dos menu
command /g4d/grldr

不点 发表于 2016-1-29 11:49:40

顺便说点感想。

BOOTICE 有两个需要改进的地方:

其一,BOOTICE 里面的 wee 的菜单需要更新,否则 wee 安装后会(有很大的概率)碰上启动失败(无法启动 Windows)的情况。这个是比较紧迫的。

其二,BOOTICE 应该能够纠正 (U 盘或硬盘)分区表以及 BPB 表上的 “总扇区数” 错误。如果能够纠正的话,就大大方便了 multimbr 的安装部署了。

希望 BOOTICE 的开发者能够改进这两点,应该都不困难的。

不点 发表于 2016-1-29 12:05:37

qj_tzy 发表于 2016-1-29 10:12
请教:

1.在https://github.com/chenall/grubu ... 102dd173d76a6bed065贴出的用法中,每行前有一个 ...

wee 是针对 MBR 框架而开发的启动工具。它识别 MBR 格式的分区,不一定能够识别 GPT 分区。

况且也无法把 wee 安装在 GPT 格式的硬盘的引导区上,因为 GPT 不存在 63 扇区的空闲空间可以用来安装 wee。

如果想要 wee 用于 GPT,那么就需要首先改造 wee 才行,就是专门出个 for GPT 的 wee。但这究竟有多大的必要性?究竟有多高的可行性?都需要考量一番,权衡之后才能决定。


我个人觉得当务之急是在 GPT 格式的分区架构里面找到一个可以存放代码的空间,好让 UMBR 能够有较大的腾挪空间。否则的话,UMBR 只能在 512 字节中记录固定的(GRLDR)地址,不具有通用性,也就是说,没有一个通用的 UMBR.mbr 可以让 BOOT.INI 或者 BOOTMGR 来直接调用。必须嵌入固定的 GRLDR 地址才能被 BOOTMGR 调用,这是个不小的问题。我不知道 chenall 有没有意识到这个问题。

chenall 发表于 2016-1-29 14:04:13

qj_tzy 发表于 2016-1-29 10:12
请教:

1.在https://github.com/chenall/grubu ... 102dd173d76a6bed065贴出的用法中,每行前有一个 ...

能出现菜单就是已经成功了.
不能执行有很多原因
比如文件不存在,格式错误等,具体的要看错误的提示信息是什么.

只要能成功启动WEE就是已经成功了,其它的是使用的问题.

chenall 发表于 2016-1-29 14:09:04

不点 发表于 2016-1-29 12:05
wee 是针对 MBR 框架而开发的启动工具。它识别 MBR 格式的分区,不一定能够识别 GPT 分区。

况且也无 ...

我没有考虑那么多.

umbr主要是针对像GPT格式这样的,

当然了在MBR磁盘上代替WEE63来启动GRLDR也是可以的.功能单一但是启动速度快在某些场合很适合.

另外一点,由于只有一个扇区所以不会出现由于其它扇区的问题导致启动失败的情况.

用WEE/GRLDR.MBR等我就碰到过好几次,可能是由于某些软件的原因,没有处理好完整的MBR,所以启动失败了.

总之各有各的用途主要是应用的场合不同.

qj_tzy 发表于 2016-1-29 14:43:12

chenall 发表于 2016-1-29 14:04
能出现菜单就是已经成功了.
不能执行有很多原因
比如文件不存在,格式错误等,具体的要看错误的提示信息 ...

谢谢指点,要执行的文件确认是存在的,此菜单在mbr分区硬盘上执行一切正常。
在GPT分区硬盘上执行时,wee菜单出现后在回车执行菜单项时无任何反应,WEE菜单仍保留在屏幕上,似很快地闪了一下。

qj_tzy 发表于 2016-1-29 14:45:52

chenall 发表于 2016-1-29 14:09
我没有考虑那么多.

umbr主要是针对像GPT格式这样的,


谢谢指点,回复详见上楼

另外:新版的wee63.mbr在何处下载

不点 发表于 2016-1-29 14:50:04

wee 不支持查找 GPT 分区格式下的文件。这就可以解释上述失败现象了。不用再纠结了。

chenall 发表于 2016-1-29 14:56:40

qj_tzy 发表于 2016-1-29 14:45
谢谢指点,回复详见上楼

另外:新版的wee63.mbr在何处下载

bootice里面的WEE63.mbr就最版的.

最新版本只是修改了内置菜单内容,需要的自己改一下菜单就行了.

可以在菜单按C进入命令行,手动输入命令看看报错的提示信息是什么(wee命令后面的数字).




chenall 发表于 2016-1-29 14:57:34

不点 发表于 2016-1-29 14:50
wee 不支持查找 GPT 分区格式下的文件。这就可以解释上述失败现象了。不用再纠结了。

wee有支持GPT分区的吧,好像??我印像中是有支持的,刚刚在QEMU中试了下可以找到GPT分区.

不点 发表于 2016-1-29 15:15:59

chenall 发表于 2016-1-29 14:57
wee有支持GPT分区的吧,好像??我印像中是有支持的,刚刚在QEMU中试了下可以找到GPT分区.

wee 应该是不支持 GPT 的。

说支持的,应该是假象。

比如,你可能不是纯 GPT,而是 GPT 和 MBR 双重格式,此时 wee 用 MBR 格式来访问分区。

chenall 发表于 2016-1-29 15:39:01

不点 发表于 2016-1-29 15:15
wee 应该是不支持 GPT 的。

说支持的,应该是假象。


这一段代码应该就是探测GPT分区的.
        cmpb        $0xee, 4(%esi)
        jne        100f
        movl        $1,%eax
        call        101f
        testl        %eax, %eax
        jz        9f
        movl        $PART_TABLE_TMPBUF,%esi
        cmpl        $0x20494645,(%esi)
        jne        9f
        movl        72(%esi),%eax
        movl        %eax,PART_TABLE_BUF + 0xC
110:
        movl        PART_TABLE_BUF + 0xC,%eax
        incl        PART_TABLE_BUF + 0xC
        call        101f
        testl        %eax, %eax
        jz        9f
        movl        $PART_TABLE_TMPBUF,%esi
        movl        $3,%ecx
111:
        movl        32(%esi),%eax
        testl        %eax,%eax
        jz 9f
        stosl
        subl        %eax,40(%esi)
        movl        40(%esi),%eax
        stosl
        xorb        %al,%al
        stosb
        movb        $0xee,%al
        stosb
        incb        -4(%ebp)
        movl        -4(%ebp), %eax
        stosw
        xorl        %eax,%eax
        stosl
        addl        $0x80,%esi
        loop 111b
        jmp 110b

不点 发表于 2016-1-29 16:06:23

本帖最后由 不点 于 2016-1-29 16:22 编辑

chenall 发表于 2016-1-29 15:39
这一段代码应该就是探测GPT分区的.

看来是你增强了 wee,让它支持 GPT,我确实不曾注意到。

我原来的 asm 代码里面,从来没有支持 GPT 的。

如果支持的话,又怎会找不到文件呢?难道 find 命令有 bug?

------------

更新:明白了,也许是碰到 BIOS 的访问能力极限了,因此找不到文件。

也有可能像 chenall 提到的那样,文件格式是不可执行的格式,因此无法启动。

chenall 发表于 2016-1-29 16:24:59

不点 发表于 2016-1-29 16:06
看来是你增强了 wee,让它支持 GPT,我确实不曾注意到。

我原来的 asm 代码里面,从来没有支持 GPT...

所有我让它报告一下错误代码是什么.

qj_tzy 发表于 2016-1-29 16:28:45

chenall 发表于 2016-1-29 14:56
bootice里面的WEE63.mbr就最版的.

最新版本只是修改了内置菜单内容,需要的自己改一下菜单就行了.


按C进入命令行后
执行find --set-root /g4d/grldr,出现wee 15 >
执行/g4d/grldr,出现wee 17 >

不点 发表于 2016-1-29 16:29:32

chenall 发表于 2016-1-29 16:24
所有我让它报告一下错误代码是什么.

是的,进入命令行测试很重要。

用户应该明白 128G 之后的扇区都有可能无法访问。这应该是个基本知识了,印在脑子里。即使不碰到失败,也应该牢记这一点。更不用说,碰到了失败之后,还不能意识到这一点,那就该打 PP 了。(开个玩笑)。

不点 发表于 2016-1-29 17:18:06

本帖最后由 不点 于 2016-1-29 17:42 编辑

qj_tzy 发表于 2016-1-29 16:28
按C进入命令行后
执行find --set-root /g4d/grldr,出现wee 15 >
执行/g4d/grldr,出现wee 17 >
15 号错误是 ERR_FILE_NOT_FOUND,即找不到文件
17 号错误是 ERR_FSYS_MOUNT,即 文件系统挂载出错,无法挂载文件系统。

这需要你自己确定是什么原因了。

你可以在 wee 命令行下用 tab 键来自动补全,看看究竟是什么情况。

你也可以执行 root 命令,看看当前设备是什么。比如,究竟是 (hd0),还是 (hd0,0)?

如果 root 是 (hd0) 或 (hd0,-1),那么,这就代表整个磁盘(含分区表的整个磁盘),而不是代表某个分区(例如 (hd0,0)),因此,你无法挂上文件系统。

你可以试着执行 root (hd0,0) 之类的命令,然后再尝试挂载文件系统。



总之,出错之后,要在命令行调试和观察,了解更多信息,这样才容易判断其根源。


补充:

能否报告一下你的分区布局?各个分区的大小?有可能你要访问的分区已经超出 BIOS 的访问能力了。

不点 发表于 2016-1-29 18:04:50

本帖最后由 不点 于 2016-1-29 18:09 编辑

我再解释一下如下菜单的执行细节:

find --set-root /g4d/pwins

如果由于某种原因,find 命令失败,则此时 root 分区仍旧是 (hd0) 或 等价的 (hd0,-1),也等价于 (hd0,255),它们都代表 “全盘”,而不是某个分区的 Volume 卷。

wee 上的 find 命令也有可能在 GPT 上出现 bug。

wee 的用户毕竟没有 grub4dos 用户多,因此,其 find 命令出现 bug 的几率要比 grub4dos 的大。

timeout 10
default 0
title
title                   ** Wee Menu **
title -----------------------------------------------
title 0.Search Boot Partition Windows nt6/nt5 System
command /g4d/pwins

这条命令是执行当前 root 分区下的文件 pwins。但如果当前分区是 “全盘” (hd0),则显然无法找到文件,因为文件可能是在 (hd0,0) 里面。

出错后,会继续显示菜单。下同。

title 1.Boot windows 8 PE
command /g4d/gw8pe
title 3.grub4dos menu
command /g4d/grldr

qj_tzy 发表于 2016-1-29 19:02:36

不点 发表于 2016-1-29 18:04
我再解释一下如下菜单的执行细节:

find --set-root /g4d/pwins


非常谢谢您的祥细指点!

我的硬盘为500G,为GPT分区结构,分为ESP分区、NTFS(win7)分区、NTFS(winxp)、NTFS(数据分区1)、NTFS(数据分区2)。g4d的文件全部存放在esp分区中。

等会空了,再按您说的方法看看,到时再报告。
页: [1] 2
查看完整版本: menu.wee 的一点微调,chenall 留意一下