无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 4038|回复: 8
打印 上一主题 下一主题

[求助] 关于map命令的问题

[复制链接]
跳转到指定楼层
1#
发表于 2016-5-4 07:52:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yjqd 于 2016-5-4 08:31 编辑

从硬盘的grub4dos启动u盘的grub4dos或是从u盘的grub4dos启动硬盘的grub4dos,比如先启动U盘的grub4dos,在grub4dos的命令行输入:
map (hd0) (hd1)
map (hd1) (hd0)
map --hook
find --set-root /grldr
chainloader /grldr
boot
就启动了硬盘的grub4dos,这时我又想启动U盘的grub4dos,于是在命令行输入:
map (hd0) (hd1)
map (hd1) (hd0)
map --hook
这时出现提示:
Refuse to hook int13 because of empty drive map table

为什么此时交换磁盘交换不了呢


2#
发表于 2016-5-4 10:14:57 | 只看该作者
本帖最后由 不点 于 2016-5-4 10:22 编辑

第一次交换磁盘号码,需要 hook 才起作用。

第二次交换磁盘号码,等于恢复了 BIOS “初始未交换” 的状态,用 map --unhook 即可。

以下几个方法都可以:

方法一:

map (hd0) (hd1)
map (hd1) (hd0)
errorcheck off
map --hook
errorcheck on

方法二:

map (hd0) (hd1)
map (hd1) (hd0)
map --rehook

方法三:

map (hd0) (hd1)
map (hd1) (hd0)
map --unhook

方法四:

map (hd0) (hd0)   此命令撤销虚拟盘 hd0,恢复真实盘 hd0
map (hd1) (hd1)   此命令撤销虚拟盘 hd1,恢复真实盘 hd1
map --rehook       让上述撤销的动作生效。也可以用 errorcheck off ; map --hook ; errorcheck on

点评

第二次交换磁盘号码时输入 map (hd0) (hd1) map (hd1) (hd0) map --rehook 再输入find --set-root /grldr chainloader /grldr boot 成功从硬盘的grub4dos启动了U盘的grub4dos 再问一下,--rehook是撤销再  详情 回复 发表于 2016-5-4 10:43
谢谢回复,我去试一试  详情 回复 发表于 2016-5-4 10:25
回复

使用道具 举报

3#
 楼主| 发表于 2016-5-4 10:25:49 | 只看该作者
不点 发表于 2016-5-4 10:14
第一次交换磁盘号码,需要 hook 才起作用。

第二次交换磁盘号码,等于恢复了 BIOS “初始未交换” 的状 ...

谢谢回复,我去试一试
回复

使用道具 举报

4#
 楼主| 发表于 2016-5-4 10:43:57 | 只看该作者
不点 发表于 2016-5-4 10:14
第一次交换磁盘号码,需要 hook 才起作用。

第二次交换磁盘号码,等于恢复了 BIOS “初始未交换” 的状 ...

第二次交换磁盘号码时输入
map (hd0) (hd1)
map (hd1) (hd0)
map --rehook
再输入find --set-root /grldr
chainloader /grldr
boot
成功从硬盘的grub4dos启动了U盘的grub4dos

再问一下,--rehook是撤销再生效的意思,既然是撤销,第二次map时实际上是交换了磁盘还是没交换磁盘,从成功从硬盘的grub4dos启动了U盘的grub4dos来看,又是交换了磁盘的

点评

从U盘的grub4dos启动了硬盘的grub4dos后,在硬盘的grub4dos的命令行输入root,能够显示根目录,输入下面的命令后 map (hd0) (hd1) map (hd1) (hd0) map --rehook 再输入root 出现 no such partition 我以为  详情 回复 发表于 2016-5-4 10:53
回复

使用道具 举报

5#
 楼主| 发表于 2016-5-4 10:53:31 | 只看该作者
yjqd 发表于 2016-5-4 10:43
第二次交换磁盘号码时输入
map (hd0) (hd1)
map (hd1) (hd0)

从U盘的grub4dos启动了硬盘的grub4dos后,在硬盘的grub4dos的命令行输入root,能够显示根目录,输入下面的命令后
map (hd0) (hd1)
map (hd1) (hd0)
map --rehook
再输入root
出现
no such partition

我以为会显示U盘的设备根目录呢

点评

假定硬盘上当前 root 分区是 (hd0,1), 当执行了 map (hd0) (hd1) map (hd1) (hd0) map --rehook 之后,当前 root 的 “记忆” 仍旧是 (hd0,1)。但此时 (hd0,1) 不一定存在(想想为什么?),因此有可能  详情 回复 发表于 2016-5-4 11:30
回复

使用道具 举报

6#
发表于 2016-5-4 11:30:10 | 只看该作者
yjqd 发表于 2016-5-4 10:53
从U盘的grub4dos启动了硬盘的grub4dos后,在硬盘的grub4dos的命令行输入root,能够显示根目录,输入下面 ...

假定硬盘上当前 root 分区是 (hd0,1),

当执行了

map (hd0) (hd1)
map (hd1) (hd0)
map --rehook

之后,当前 root 的 “记忆” 仍旧是 (hd0,1)。但此时 (hd0,1) 不一定存在(想想为什么?),因此有可能显示 no such partition。

因为更换 hd0 (并生效)之后,(hd0,1) 这个分区也就不一定存在了。它可能有 (hd0,0) 或别的分区,不一定恰好就有 (hd0,1) 这个分区。

点评

谢谢回复,原来从root 的 “记忆” 来思考这个问题,就渐渐明白了  详情 回复 发表于 2016-5-4 12:27
回复

使用道具 举报

7#
发表于 2016-5-4 11:57:59 | 只看该作者
本帖最后由 不点 于 2016-5-4 12:09 编辑
再问一下,--rehook是撤销再生效的意思,既然是撤销,第二次map时实际上是交换了磁盘还是没交换磁盘,从成功从硬盘的grub4dos启动了U盘的grub4dos来看,又是交换了磁盘的


map --hook 和 map --rehook 和 map --unhook 这三条命令都能重新计算磁盘的 “变更” 状态(【补充】并让变更生效)。变更的依据是先前下达的 map (磁盘仿真或磁盘交换)命令。

主要不同点如下:

1、map --hook 会先尝试执行 map --unhook 的动作,然后再执行一次 hook 的动作。但当发现磁盘映射表为空(即已经与 BIOS 原始状态相同)时,会报错。为了不让它报错,用户可以先执行 errorcheck off,在执行完 map --hook 之后,再恢复为 errorcheck on 的默认报错状态。
2、map --rehook 与 map --hook 大致相同,但当发现磁盘映射表为空(即已经与 BIOS 原始状态相同)时,不报错。map --rehook 还有重新安排内存盘物理位置的功能,这一点是 map --hook 所不具有的。map --rehook 在大多数情况下都能合理安排内存盘的位置。如果用户不希望 map --rehook 自作聪明地调整内存盘的物理位置,那应该使用 map --hook,不应该使用 map --rehook。而且,map --rehook 可能有 bug,比如说,用户有内存盘映射在 4G 以上的高位空间,此时用 map --rehook 之后,有可能被重新调整到低于 4G 的内存空间上,这是不合理的,是个 bug,希望将来 chenall 或 yaya 予以排除。
3、map --unhook 会先更新磁盘映射表,然后将 int13 脱钩。如果更新后的磁盘映射表为空,那么此时已经恢复为 BIOS 初始状态。如果更新后的磁盘映射表不是空的,那么由于 map 此时处于脱钩状态,因而磁盘映射表暂时不起作用,需要再执行一条 map --hook 或 map --rehook 之后才能让更新后的磁盘映射表起作用。

map --status 命令可以报告磁盘映射表的详细情况。



回复

使用道具 举报

8#
 楼主| 发表于 2016-5-4 12:27:19 | 只看该作者
不点 发表于 2016-5-4 11:30
假定硬盘上当前 root 分区是 (hd0,1),

当执行了

谢谢回复,原来从root 的 “记忆” 来思考这个问题,就渐渐明白了

点评

我正在为来回启动硬盘和U盘的grub4dos的批处理发愁呢,正好把 map (hd0) (hd1) map (hd1) (hd0) errorcheck off map --hook errorcheck on 制作成批处理,第一次交换磁盘用它,第二次交换磁盘也用它 把批处理  详情 回复 发表于 2016-5-4 13:07
回复

使用道具 举报

9#
 楼主| 发表于 2016-5-4 13:07:16 | 只看该作者
本帖最后由 yjqd 于 2016-5-4 14:24 编辑
yjqd 发表于 2016-5-4 12:27
谢谢回复,原来从root 的 “记忆” 来思考这个问题,就渐渐明白了


我正在为来回启动硬盘和U盘的grub4dos的批处理发愁呢,正好把
map (hd0) (hd1)
map (hd1) (hd0)
errorcheck off
map --hook
errorcheck on
find --set-root /grldr
chainloader /grldr
boot
制作成批处理,第一次交换磁盘用它,第二次交换磁盘也用它
把批处理在U盘里放一个,在硬盘里放一个
运行测试都成功了

这里errorcheck错误检查关闭只是在map --hook这里,后面又开启了,不影响其它错误检查,太好了
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-13 17:22

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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