无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 11603|回复: 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)
52#
 楼主| 发表于 2009-8-17 17:30:10 | 只看该作者
我用命令查看,软盘的代码是0x04,硬盘是0x07,那么前面的条件代码启动失败,出现无限的循环。
回复

使用道具 举报

51#
发表于 2009-5-22 06:59:06 | 只看该作者
title 启动 默认Microsoft Windows
checkrange 0x80 read 0x8280 && map (hd1) (hd0)
checkrange 0x80 read 0x8280 && map --hook
chainloader (hd0)+1
用了上面的配置之后启动不成功。
电脑配置
BIOS为Award的,可以认成硬盘和usb-hdd
硬盘为ide接口的一块,sata接口的raid0(两块硬盘组成)及jbod的一块,系统装在raid0上。
请各位帮下忙。
回复

使用道具 举报

50#
发表于 2009-5-14 12:01:00 | 只看该作者
上次看到maxdos的men.ls感到这一句很奇怪,原来来自这里!!
硬件还是很复杂的,mp3的主芯片应该不能和u盘等同吧
回复

使用道具 举报

49#
发表于 2009-5-12 10:12:07 | 只看该作者
原帖由 xiyaxi 于 2009-5-5 07:42 发表
奇怪的事情再次颠覆本贴所有人的理论,真是事出蹊跷!!!

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

奇怪了?你的代码怎么是hd2
那应该是第三个硬盘。

等于说map (hd2) (hd0)才对。。。
回复

使用道具 举报

48#
 楼主| 发表于 2009-5-5 07:42:44 | 只看该作者
奇怪的事情再次颠覆本贴所有人的理论,真是事出蹊跷!!!

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

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

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


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

使用道具 举报

47#
发表于 2009-5-5 00:10:40 | 只看该作者
title Boot From HD0
rootnoverify && map (hd1) (hd0)
rootnoverify && map --hook
rootnoverify (hd0,0)
chainloader +1
回复

使用道具 举报

46#
发表于 2009-5-1 00:41:59 | 只看该作者
在grub4dos 语句中 &&和||到底是什么含义呢,期望给位给我详细说一下,我有点晕了!
回复

使用道具 举报

45#
发表于 2009-4-30 22:02:15 | 只看该作者
u盘认成hd0,fd0都能启动老毛桃 pe  试成功。  谢谢高人们!!
checkrange 0x80 read 0x8280  ||  map (hd0) (fd0)
checkrange 0x80 read 0x8280 || map (fd0) (hd0)
checkrange 0x80 read 0x8280 || map --hook
find --set-root /krldr
chainloader /krldr

[ 本帖最后由 aoskas 于 2009-4-30 22:03 编辑 ]
回复

使用道具 举报

44#
发表于 2009-4-30 15:36:24 | 只看该作者
原帖由 Climbing 于 2009-4-30 06:55 发表
两个对Grub4dos使用的比较变态的人都在这里出现了:chenall和pseudo。

我虽然搞grub4dos这么多年,却从来没有用过这些变态的用法,例如dd、checkrange之类的命令。

可以这样试试:

[Copy to clipboard] [ - ]
CODE:
title 启动 默认Microsoft Windows
checkrange 0x80 read 0x8280 && map (hd1) (hd0)
checkrange 0x80 read 0x8280 && map --hook
find --set-root /ntldr
chainloader /ntldr


这应该是兼容性较好的启动方式了。

Climbing兄的菜单我没试过,前面大家的菜单我也没试过。实践经验不多,只是纸上谈兵。

如果ntldr仅出现在物理盘hd0,且checkrange 0x80 read 0x8280为真,
则这个菜单的find将找不到ntldr,这时chainloader /ntldr可能失败。
回复

使用道具 举报

43#
发表于 2009-4-30 12:02:47 | 只看该作者
知道了启动过程,实在不行就c进入命令行自己打命令。根据不同环境及时变更。。
毕竟世界没万能的东西。。
回复

使用道具 举报

42#
发表于 2009-4-30 10:13:53 | 只看该作者
指定ntldr文件的话,我觉得似乎不太好。要是遇到一些不是XP或者2003的电脑,从菜单进行硬盘启动就可能做不到了。
回复

使用道具 举报

41#
 楼主| 发表于 2009-4-30 08:07:05 | 只看该作者
在无忧众多高手的探讨中,我似乎对GRUB的认识更上一层楼。

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

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

使用道具 举报

40#
发表于 2009-4-30 06:55:58 | 只看该作者
两个对Grub4dos使用的比较变态的人都在这里出现了:chenall和pseudo。

我虽然搞grub4dos这么多年,却从来没有用过这些变态的用法,例如dd、checkrange之类的命令。

可以这样试试:

  1. title 启动 默认Microsoft Windows
  2. checkrange 0x80 read 0x8280 && map (hd1) (hd0)
  3. checkrange 0x80 read 0x8280 && map --hook
  4. find --set-root /ntldr
  5. chainloader /ntldr
复制代码


这应该是兼容性较好的启动方式了。
回复

使用道具 举报

39#
发表于 2009-4-29 23:53:54 | 只看该作者
我想是这样的:
map (hd1) (hd0)
chainloader (hd0)+1
可能等价于
map (hd1) (hd0)
chainloader (hd0)+1
map --hook(这行有被隐式加上的可能,我没验证,但建议总是显式写出为好)
但与
map (hd1) (hd0)
map --hook
chainloader (hd0)+1
不同。
区别在于chainloader (hd0)+1中的hd0,前者对应物理盘hd0,后者对应物理盘hd1。后者hd0是hd1仿真得来的,真正物理盘hd0被暂时屏蔽不可访问。

仿真确实map --hook后才生效。

[ 本帖最后由 pseudo 于 2009-4-29 23:56 编辑 ]
回复

使用道具 举报

38#
发表于 2009-4-29 23:44:03 | 只看该作者
汗……我以为MAP之后,启动IMG与HD是一样的,一定要HOOK才行——菜单中可以BOOT我倒是知道。
回复

使用道具 举报

37#
发表于 2009-4-29 21:49:50 | 只看该作者
GRUB4DOS启动命令默认隐藏map --hook
就像菜单条最后默认执行boot一样.

执行boot时如果发现有仿真盘未hook就会自动执行map --hook

测试方法.只使用以下菜单,会再次进入grub4dos环境这时再查看map的状态就知道了.
title test
map (hd0) (hd1)
chainloader /grldr

[ 本帖最后由 chenall 于 2009-4-29 21:51 编辑 ]
回复

使用道具 举报

36#
 楼主| 发表于 2009-4-29 21:49:45 | 只看该作者
楼上,不是启动镜像文件,是启动硬盘的系统,镜像的需要MAP --HOOK
回复

使用道具 举报

35#
发表于 2009-4-29 21:49:18 | 只看该作者
原帖由 xianglang 于 2009-4-29 21:42 发表
印象中,G4D如果没有map --hook的话,map 的内容是不起作用的,应该不存在不使用命令就能够自动 map --hook 吧。我觉得楼主能成功,还是怀疑是不是U盘没有默认为HD0启动?反正我试过map 磁盘镜像之后,不做 map ...


没看前面的帖子吗?呵呵。
img与hd是比一样的。
回复

使用道具 举报

34#
发表于 2009-4-29 21:42:15 | 只看该作者
印象中,G4D如果没有map --hook的话,map 的内容是不起作用的,应该不存在不使用命令就能够自动 map --hook 吧。我觉得楼主能成功,还是怀疑是不是U盘没有默认为HD0启动?反正我试过map 磁盘镜像之后,不做 map --hook 的话,是不能成功启动镜像里的系统的。
回复

使用道具 举报

33#
 楼主| 发表于 2009-4-29 19:58:49 | 只看该作者
呵呵,看了CHENALL的回帖,真是似曾相识

谢谢CHENALL,相见恨晚
回复

使用道具 举报

32#
 楼主| 发表于 2009-4-29 19:55:38 | 只看该作者
谢谢CHENALL的解答

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

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

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

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

使用道具 举报

31#
发表于 2009-4-29 19:03:38 | 只看该作者
刚刚又想到一点.

chainloader可能是等系统启动时再加载指向的内容的.

如果这样子的话上面的写法也算是正确的.

title 启动 默认Microsoft Windows
checkrange 0x80 read 0x8280 && map (hd1) (hd0)
#或许这个只是作一个标记(具体我也不清楚^_^).
chainloader (hd0)+1
#最后默认map --hook

在正式启动系统的时候才加载chainloader的内容.所以就会启动成功了.
回复

使用道具 举报

30#
发表于 2009-4-29 18:47:09 | 只看该作者
checkrange 0x80 read 0x8280 && map (hd1) (hd0)
#读取内存0x8280位置的值(GRUB4DOS内置变量,启动磁盘号,具体请看GRUB4DOS说明).如果是0x80(也就是hd0)就执行后面的语句.


另外我前面说的"U盘刚好的引导扇区"是因为你之前使用的菜单.

title 启动 默认Microsoft Windows
checkrange 0x80 read 0x8280 && map (hd1) (hd0)
因为这时上面的映射还没有生效,执行chainloader实际上是加载了U盘上的mbr的内容.
chainloader (hd0)+1
到后面默认map --hook生效后U盘原来的位置被硬盘取代了,所以就启动成功了.

你可以尝试使用GRUBINST之类的工具把GRUB4DOS引导写到U盘上再试试使用这样的菜单,或许就会发现这其中的问题了.(我自己没有试过.^_^,只是理论)

http://bbs.wuyou.net/forum.php?mod=viewthread&tid=139062&extra=page%3D2
这里就有一个这样的工具.

你可以测试下具体的结果.


另外一点.
chainloader (hd0,0)/ntldr

建议还是使用chainloader (hd0)+1

因为系统不一定是装在(hd0,0)上的,也有可能是(hd0,1).
总之只要chainloader (hd0)+1让它自己去找就OK了.

[ 本帖最后由 chenall 于 2009-4-29 18:58 编辑 ]
回复

使用道具 举报

29#
 楼主| 发表于 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清理下我的思路并指正这个启动的基本原理。谢谢
回复

使用道具 举报

28#
发表于 2009-4-29 14:28:22 | 只看该作者
原帖由 pseudo 于 2009-4-29 14:17 发表
1的hd0将会不见还是?比如进入pe或dos

dos下不见,pe下可见。

多谢pseudo 大解答。
看来加载dos工具箱还是要2条都用上,现在上班时间,有点偷懒直接就发问没动手实践^_^
回复

使用道具 举报

27#
发表于 2009-4-29 14:17:58 | 只看该作者

回复 #26 yjd 的帖子

1的hd0将会不见还是?比如进入pe或dos

dos下不见,pe下可见。
回复

使用道具 举报

26#
发表于 2009-4-29 14:12:16 | 只看该作者
map (hd1) (hd0)
map --hook
我原来U盘上写启动硬盘的windows也是用到这2句。

到现在对这个也有点迷糊
1,
map (hd1) (hd0)    //把hd1换为hd0
map --hook           //生效
2,
map (hd1) (hd0)    //把hd1换为hd0
map (hd0) (hd1)    //把hd0换为hd1
map --hook           //生效

1的hd0将会不见还是?比如进入pe或dos
2是2个互换位置。这个理解。
回复

使用道具 举报

25#
发表于 2009-4-29 14:08:49 | 只看该作者
grub4dos功能强大。借助它,PE可以做到:
1、一个菜单项,不分USB-ZIP、USB-HDD,USB-CDROM,统一处理。
2、一个ISO映像。不分U盘、光盘、量产、移动盘、硬盘版,发布时只提供一个版本(一个iso映像文件)。
3、ISO映像可不解开。ISO映像可以解开来用,也可以整体使用(盘上只看到iso文件),解开与不解开之间无需修改任何配置。不担心找不到外置程序。
4、pxe启动与本地启动统一。无需结构调整、无需配置即可直接用于pxe启动,拷贝式安装。支持本地加远程混合快速启动。
5、随意增删。PE被分解为多个组件(包括“内核”也被分解),组件可以随意增删(“内核”也可删,最小可只剩3M),不用修改配置。
6、位置灵活。组件可以分散放置到各分区,典型地:U盘量产区放一些,非量产区放一点,硬盘C区放一点,D区放一点,pxe服务器端放一点。
7、目录清爽。因为努力遵循了这样的原则:用于启动的文件尽量少,可以只有一个;几乎每个用户看到的文件都是组件,一个文件没有与其它文件合并打包,往往意味着它是可以删除的,所以才独立出来作为组件。

参考0PE和chenall的PE。
另外,这里有些实现技术的参考资料http://bbs.wuyou.net/forum.php?m ... 7686&highlight=
回复

使用道具 举报

24#
发表于 2009-4-29 13:59:33 | 只看该作者
原帖由 chenall 于 2009-4-28 22:35 发表
当然是出错了.
执行到checkrange 0x80 read 0x8280 && map (hd1) (hd0)就会出错.

为了防止这种情况可以改成如下语句.

errorcheck off
checkrange 0x80 xxxx
checkrange 0x80 xxx..
checkrange 0x80 . ...

^_^。多谢chenall大解答。昨天就把你的方法用到我的U盘上了。
感谢
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2025-2-26 07:21

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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