无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 9902|回复: 51
打印 上一主题 下一主题

grub菜单实现条件选择

[复制链接]
跳转到指定楼层
1#
发表于 2009-4-27 10:14:16 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本人的U盘在笔记本上识别为FD0,在台式机上识别为HD0,0,在启动菜单上有一项是启动本机默认的WIN系统,那么这里能不能改写代码,让grub根据不同的情况来执行启动。

如果U盘被识别为FD0,那么就执行
title 启动 默认Microsoft Windows----启动盘识别为软盘
rootnoverify (hd0,0)
makeactive
chainloader +1

如果U盘识别为HD0,0,那么就执行
title 启动 默认Microsoft Windows----启动盘识别为硬盘
rootnoverify (hd1,0)
map (hd0) (hd1)
map (hd1) (hd0)
makeactive
chainloader +1

不知道上面的代码能合并吗?用条件语句来实现。类似下面的语法:

title 启动 默认Microsoft Windows
IF(...=(FD0))    DO(rootnoverify (hd0,0) makeactive chainloader +1)
ELSE               DO(rootnoverify (hd1,0) map (hd0) (hd1) map (hd1) (hd0) makeactive chainloader +1)
2#
 楼主| 发表于 2009-4-28 10:26:37 | 显示全部楼层
谢谢一楼的回答

弄不明白,为什么U盘在不同的机器上被识别成不同的磁盘

有什么办法可以用让U盘固定识别为软盘吗?
回复

使用道具 举报

3#
 楼主| 发表于 2009-4-28 22:41:47 | 显示全部楼层
看得出CHENALL对技术是有研究之人,本人佩服,也谢谢您的解答

对于方法2,本人还是有不理解的地方
default 0
timeout 5
title 启动 默认Microsoft Windows
#hd0
#检测启动磁盘如果是(hd0){HDD模式]就交换磁盘映射.
checkrange 0x80 read 0x8280 && map (hd0) (hd1)
checkrange 0x80 read 0x8280 && map (hd1) (hd0)
checkrange 0x80 read 0x8280 && map --hook
rootnoverify (hd0,0)
makeactive
chainloader +1

那么如果是检测不是HDD模式,那执行什么代码呢,下面好想都是执行HDD模式的代码

请CHENALL指教


对于YJD的问题,我是怎么理解的:

如果U盘被是被为HDD,那么那么应该就有HD1,因为U盘已经是HD0,除非你的电脑里没有硬盘,这种情况就是U盘启动后只存在一个U盘并被识别为HD0,不知道我的理解适合你的问题吗
回复

使用道具 举报

4#
 楼主| 发表于 2009-4-28 22:55:15 | 显示全部楼层
再认真的看了CHENALL的技术答贴,感觉是自己没有完全理解

当U盘被识别为硬盘,那么通过磁盘交换后,原硬盘(HD1就变成HD0),然后执行rootnoverify (hd0,0)

如果U盘被识别为软盘,那么就直接执行下面的rootnoverify (hd0,0)

看来CHENALL真是高手,高手一般是孤独的,很多东西不用心看还不能理解

再次谢谢CHENALL
回复

使用道具 举报

5#
 楼主| 发表于 2009-4-29 09:06:43 | 显示全部楼层
经过本人的实践,CHENALL给出的代码在笔记本和虚拟机中测试成功

笔记本把U盘识别为软盘,而虚拟机中U盘被识别为硬盘

我是用CHENALL第二种方法测试测,第一种方法没有测试,但是看代码就知道和我最初菜单中分两种情况的代码比较相似,所以我想应该没有什么问题吧

一直以来比较欣赏严谨,简洁的逻辑,CHENALL给出的答案恰恰是这一逻辑的具体表达

谢谢CHENALL
回复

使用道具 举报

6#
 楼主| 发表于 2009-4-29 09:48:53 | 显示全部楼层
对事物的了解是有一个过程的,我是最近在弄U盘PE的时候才知道无忧论坛的,所以对无忧论坛的前辈们不是很熟悉,但是通过这个帖子,意识到CHENALL是一个相当具有功力的人,并且有些孤独,通过不才兄弟的介绍,才知道CHENALL对GRUB有专攻。谢谢不才兄弟,让我认识一个“GRUB大碗”。

刚才看到另外的一个帖子,基于CHENALL的回贴我都认真看了,有一处问题,还想请CHENALL指点下:

CHENALL发表于 2006-8-28 13:19  资料  主页 短消息  加为好友      

还有.

[Copy to clipboard] [ - ]CODE:
# 从本地磁盘的主分区启动
title 返回系统启动菜单
rootnoverify (hd0,0)
makeactive
chainloader  +1
建议不要这样使用,因为每启动一次就写一次硬盘.久了硬盘容易出问题的.

[Copy to clipboard] [ - ]CODE:
# 从本地磁盘的主分区启动
title 返回系统启动菜单
chainloader (hd0)+1
使用硬盘启动,或者你需要启动(hd0,0)下的WINNT系统也可以这样使用

[Copy to clipboard] [ - ]CODE:
title 返回系统启动菜单
chainloader (hd0,0)/ntldr
#or chainloader (hd0,0)+1


这里说到:建议不要这样使用,因为每启动一次就写一次硬盘.久了硬盘容易出问题的.

请问是不是我的启动菜单也要修改成下面的启动代码呢?
title 启动 默认Microsoft Windows
chainloader (hd0)+1

或者
title 启动 默认Microsoft Windows
chainloader (hd0,0)/ntldr
#or chainloader (hd0,0)+1

请CHENALL给予建设性的指导
回复

使用道具 举报

7#
 楼主| 发表于 2009-4-29 09:51:55 | 显示全部楼层
我完整的启动代码是不是需要修改成下面的样式

title 启动 默认Microsoft Windows
checkrange 0x80 read 0x8280 && map (hd0) (hd1)
checkrange 0x80 read 0x8280 && map (hd1) (hd0)
checkrange 0x80 read 0x8280 && map --hook
chainloader (hd0)+1

或者
title 启动 默认Microsoft Windows
checkrange 0x80 read 0x8280 && map (hd0) (hd1)
checkrange 0x80 read 0x8280 && map (hd1) (hd0)
checkrange 0x80 read 0x8280 && map --hook
chainloader (hd0,0)/ntldr
#or chainloader (hd0,0)+1

麻烦CHENALL
回复

使用道具 举报

8#
 楼主| 发表于 2009-4-29 10:49:39 | 显示全部楼层
修改启动代码如下:

title 启动 默认Microsoft Windows
checkrange 0x80 read 0x8280 && map (hd0) (hd1)
checkrange 0x80 read 0x8280 && map (hd1) (hd0)
chainloader (hd0)+1

在笔记本(U盘被识别为软盘)和虚拟机(U盘被识别为硬盘)双环境下启动圆满成功
回复

使用道具 举报

9#
 楼主| 发表于 2009-4-29 11:37:29 | 显示全部楼层
title 启动 默认Microsoft Windows
checkrange 0x80 read 0x8280 && map (hd0) (hd1)
checkrange 0x80 read 0x8280 && map (hd1) (hd0)
chainloader (hd0)+1

这段代码,没有map --hook命令,测试十分彻底成功

但是在下面的启动项目中缺一不可

title 启动 MS-DOS 7.10
map --mem /boot/dos.ima (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)
回复

使用道具 举报

10#
 楼主| 发表于 2009-4-29 11:53:22 | 显示全部楼层
最终精简代码

title 启动 默认Microsoft Windows
checkrange 0x80 read 0x8280 && map (hd1) (hd0)
chainloader (hd0)+1

测试结果:出色的成功!

请CHENALL看到此代码后,给予技术上的解释,并说明下这样的代码有那些不足及其不安全的地方,谢谢。
回复

使用道具 举报

11#
 楼主| 发表于 2009-4-29 13:11:02 | 显示全部楼层
xianglang 误会了

我的问题是U盘在笔记本上识别为软盘,在台式机上识别为硬盘,我原本两种情况都能启动

我需要解决的是:不管U盘被识别为什么盘,在GRUB启动菜单里只需一个选项就可以实现启动电脑默认的操作系统

这个问题CHENALL已经很好的帮我解决了。
回复

使用道具 举报

12#
 楼主| 发表于 2009-4-29 18:28:44 | 显示全部楼层
再次请教

有些人喜欢实践,有些人喜欢理论,就好比是工科与理科一样,侧重点不一样

本人也不是在研究什么,只是把问题摆出来,就想问题搞得更清楚,或者是追求一种思想上的愉悦。

CHENALL指出:
代码可以启动成功,是因为grub4dos最后是默认执行map --hook命令,
而且你的U盘上刚好有引导扇区.否则就会失败.

第一句好理解,第二句对于我这样的菜鸟有些困惑
而且你的U盘上刚好有引导扇区.否则就会失败,怎么说不管有没有执行map --hook,只要U盘上没有引导扇区,就必然启动失败。或者说执行map --hook后,程序还要去引导扇区做点什么事情?(请允许我这么不专业的描述)

不知道CHENALL能不能形象的描述下这个启动详细过程,好让我更加清楚这个启动的原理。在此先说声谢谢。

我对下面代码的理解(不对的地方还请指正)

title 启动 默认Microsoft Windows
checkrange 0x80 read 0x8280 && map (hd1) (hd0)
checkrange 0x80 read 0x8280 && map --hook
chainloader (hd0,0)/ntldr

在启动菜单中选择这个选项后,首先GRUB程序去检查BIOS(抑或是磁盘引导区)0x80位置的代码,如果是0x8280,那么就执行后面的map (hd1) (hd0),也就是进行磁盘虚拟交换,接着再次重复检查,并执行map --hook,将虚拟的(hd0)挂载即让磁盘虚拟交换生效,最后执行chainloader (hd0,0)/ntldr,就是把ntldr载入内存并运行它。

我上面的理解里并没有与CHENALL所说的“U盘上刚好有引导扇区”相关联,显然是不对的,请CHENALL清理下我的思路并指正这个启动的基本原理。谢谢
回复

使用道具 举报

13#
 楼主| 发表于 2009-4-29 19:55:38 | 显示全部楼层
谢谢CHENALL的解答

我刚才在吃饭的时候有回想这个问题,如果一定要与引导扇区关联,那么我就大胆的假设:

执行chainloader的时候可能是:GRUB程序去引导扇区寻找启动代码,启动代码去引导NTLDR,这样就和引导扇区关联起来

现在再来解释我上面的思路,如果有MAP---HOOK,那么GRUB就去刚激活盘(原HD1)的引导扇区寻找启动代码,如果没有MAP---HOOK,那么GRUB就去当前盘(HD0即U盘)的引导扇区寻找启动代码。

那么CHENALL说的默认执行MAP---HOOK,在这里又遇到理论上的困难。
回复

使用道具 举报

14#
 楼主| 发表于 2009-4-29 19:58:49 | 显示全部楼层
呵呵,看了CHENALL的回帖,真是似曾相识

谢谢CHENALL,相见恨晚
回复

使用道具 举报

15#
 楼主| 发表于 2009-4-29 21:49:45 | 显示全部楼层
楼上,不是启动镜像文件,是启动硬盘的系统,镜像的需要MAP --HOOK
回复

使用道具 举报

16#
 楼主| 发表于 2009-4-30 08:07:05 | 显示全部楼层
在无忧众多高手的探讨中,我似乎对GRUB的认识更上一层楼。

特别是第四页中,chenallpseudoClimbing 总结式发言让问题最终浮出水面。

在此,特别鸣谢CHENALL的悉心指教与各位网友的互动。
回复

使用道具 举报

17#
 楼主| 发表于 2009-5-5 07:42:44 | 显示全部楼层
奇怪的事情再次颠覆本贴所有人的理论,真是事出蹊跷!!!

朋友拿来一个MP3,我把它做成启动U盘。依据本贴所有高手给出的答案经过无数次的测试,都不能成功,出现的结果就是无尽的循环,看表象预计原因是不能进行磁盘交换。

只有我当初发帖时的代码能够启动,我的代码如下:

rootnoverify (hd2,0)
map (hd0) (hd2)
map (hd2) (hd0)
makeactive
chainloader +1


可惜这段代码不能够实现软盘和硬盘双重选择,请各位高手支招。
回复

使用道具 举报

18#
 楼主| 发表于 2009-8-17 17:30:10 | 显示全部楼层
我用命令查看,软盘的代码是0x04,硬盘是0x07,那么前面的条件代码启动失败,出现无限的循环。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-2 09:31

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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