加载中…
正文 字体大小:

外部MENU.LST调用GRLDR内部菜单

(2009-07-11 22:37:44)
标签:

电脑

hd

map

扇区

cd

杂谈

分类: grub4dos学习笔记

在外部MENU.LST调用GRLDR内部菜单的问题

由于用了FBINST。U盘有了UD独立空间,于是,把基本不变的维护工具放进UD。而在U盘的UD外部存放以后会常更换的维护工具,GRLDR内部菜单负责选择UD内部工具,外部MENU.LST选择外部工具。中间可以在两个菜单间切换。两套菜单如下:
一:GRLDR内置菜单:
background 008080
fontfile (ud)/Fonts.gz
timeout 30
default 2

title                     U盘维护系统
clear

title ---------------------------------------------------------------
clear

title [01] 启动Windows PE预安装环境
map (ud)/winpe.iso (0xFF)        
map --hook                     
chainloader (0xFF)

title [02] 启动MAXDOS工具箱
map (ud)/MAXDOS.IMG (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)

title [03] 启动UD外部GRUB4DOS菜单
errorcheck off
configfile /boot/grub/menu.lst
configfile /menu.lst
configfile /grub/menu.lst
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
errorcheck on
commandline

title ---------------------------------------------------------------
root

title [04] 启动本机Windows NT/2K/XP/2003系统
fallback 7
find --set-root --ignore-floppies --ignore-cd /ntldr
map () (hd0)
map (hd0) ()
map --rehook
find --set-root --ignore-floppies --ignore-cd /ntldr
chainloader /ntldr

title [05] 启动本机VISTA/2008/Windows7系统
fallback 8
find --set-root --ignore-floppies --ignore-cd /bootmgr
map () (hd0)
map (hd0) ()
map --rehook
find --set-root --ignore-floppies --ignore-cd /bootmgr
chainloader /bootmgr

title [06] 启动本机Windows 9x/Me系统
fallback 6
find --set-root /io.sys
chainloader /io.sys

title ---------------------------------------------------------------
root

title [07] 从硬盘引导系统
checkrange 0x80 read 0x8280 && map (hd1) (hd0)
checkrange 0x80 read 0x8280 && map --hook
chainloader (hd0)+1
title [08] 从光驱引导系统
cdrom --init || cdrom --stop
map --rehook
geometry (hd999) || pause --wait=0
root (cd0)  || pause --wait=5 Not found CDROM! 找不到光驱!
chainloader (cd0) && boot
chainloader (cd1) && boot
chainloader (cd2) && boot
chainloader (cd3) && boot
chainloader (cd4) && boot
chainloader (cd5) && boot
chainloader (cd6) && boot
chainloader (cd7) && boot
chainloader (cd8) && boot
chainloader (cd9) && boot

title [R]  重启计算机
reboot

title [X]  关闭计算机
halt

在U在外部U盘中的MENU.LST如下:(注意红色部分)
timeout 30
default 2

title                     U盘维护系统
clear

title ---------------------------------------------------------------
clear

title [01] 启动DM10分区工具
map /boot/imgs/DM10.IMG (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)

title [02] 启动清除COMS密码工具
map /boot/imgs/CMOS.IMG (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)

title [03] 启动内置菜单
errorcheck off
configfile (md)4+1
errorcheck on
commandline

title ---------------------------------------------------------------
root

title [04] 启动本机Windows NT/2K/XP/2003系统
fallback 7
find --set-root --ignore-floppies --ignore-cd /ntldr
map () (hd0)
map (hd0) ()
map --rehook
find --set-root --ignore-floppies --ignore-cd /ntldr
chainloader /ntldr

title [05] 启动本机VISTA/2008/Windows7系统
fallback 8
find --set-root --ignore-floppies --ignore-cd /bootmgr
map () (hd0)
map (hd0) ()
map --rehook
find --set-root --ignore-floppies --ignore-cd /bootmgr
chainloader /bootmgr

title [06] 启动本机Windows 9x/Me系统
fallback 6
find --set-root /io.sys
chainloader /io.sys

title ---------------------------------------------------------------
root

title [07] 从硬盘引导系统
checkrange 0x80 read 0x8280 && map (hd1) (hd0)
checkrange 0x80 read 0x8280 && map --hook
chainloader (hd0)+1
title [08] 从光驱引导系统
cdrom --init || cdrom --stop
map --rehook
geometry (hd999) || pause --wait=0
root (cd0)  || pause --wait=5 Not found CDROM! 找不到光驱!
chainloader (cd0) && boot
chainloader (cd1) && boot
chainloader (cd2) && boot
chainloader (cd3) && boot
chainloader (cd4) && boot
chainloader (cd5) && boot
chainloader (cd6) && boot
chainloader (cd7) && boot
chainloader (cd8) && boot
chainloader (cd9) && boot

title [R]  重启计算机
reboot

title [X]  关闭计算机
halt
调用内部菜单的方法在论坛中找到的。好像官方说明没有说明有此法。
问题:调用外部的MENU.LST正常,但外部的MENU.LST调用内部的菜单无法显示“title [04] 启动本机Windows NT/2K/XP/2003系统”选项及以下的选项。不知是我调用写法不行,还是GRUB4DOS本身功能上支持不完善,如果是这样,希望能够完善。
 
试用
configfile (md)4+2成功
 
 
这个(md)4+8中的4和8分别是什么意思啊?
用cat --hex (md)4+1
 cat --hex (md)4+2
 ……
 查看一下,就应该大概明白了。
 
在grub4中,通常是通过使用文件系统中的文件名来表示文件,比如ntldr ,io.sys等。
不过,对于文件的表示方法,还有另一种重要的等价的表示方法,即块清单(blocklist)表达法 ,简单说就是根据文件在设备上存储的扇区序列来表示文件,常用的例如有 (hd0,0)+1 ,(md)4+8 等等。

grub4有个命令 blocklist ,可以较方便的列出文件的块列表。例如执行 blocklist  /ntldr 看看。(注,该命令对空字节文件暂时无效)

以 (md)4+8 为例来说,它表示了(md) 设备上,跳过4个扇区(即从第5个扇区起始的),且,连续8个扇区大的扇区块所组成的文件。
显然,其中(md)代表了文件所在的设备为grub4dos全内存设备(md),4 代表了文件在此设备上的起始扇区位置(起始扇区都从零计数,取零时可省略,如(hd0,0)+1   ),而 8  则代表此文件为8个扇区大。

由于grub4dos的内置菜单固定大小为4 K (即相当于8 个扇区大)。在启动后,又会被固定加载于内存物理地址 0x800  处。0x800 转换为十进制是2048(相当于4个扇区)。
因此,(md)4+8通常就表示了加载到内存0x800处的4k大的内置菜单文件。
(默认内置菜单的数据是小于512字节的,因此对于默认内置菜单,逻辑上一般情况下(md)4+1也可引用它)

扇区序列表达法(或叫块清单表达法)对于灵活表示,引用文件相当有用。特别是对那些位于文件系统外的扇区,而又要将它看做文件使用时,比如(hd0)1+1等。

以上的例子都是文件存储时扇区连续的情况,实际块列表表达法也可以表示不连续存放的文件。例如,(hd0,0)2+20,33+5,87+300  。可以看出,实际只是将不连续的块用逗号隔开,数值的意义和前面说的是相同的,即分别标示了各块的起始扇区和大小。

(关于文件表达法的一些高级部分,可以参见不点大人的这个贴http://bbs.znpc.net/viewthread.php?tid=4532 ,注:未公开特性并非在每个命令下都适用,使用时请自行验证)

--------------------
注意两个 +1 特例:
以下,形式是块清单表达法,但实际意义却是特殊定义的:
1.在 map 命令中,例如map --mem (hd0,0)+1 (fd0) ; 这时(即map命令中使用+1 时),其中的(hd0,0)+1 是表示第一硬盘的整个第一分区,而不只是第一分区的第一个扇区。
2. (rd)+1 ,在任何时候也是表示包含内存设备(rd) 的全部内容,而不只是(rd)设备的第一个扇区。
 

阅读 评论 收藏 转载 喜欢 打印举报
已投稿到:
  • 评论加载中,请稍候...
发评论

       

    验证码: 请点击后输入验证码 收听验证码

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有