无忧启动论坛

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

[讨论] 引导位于逻辑分区的BOOTMGR/NTLDR

[复制链接]
跳转到指定楼层
1#
发表于 2013-4-30 23:20:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 2011GameBoy 于 2013-5-2 01:41 编辑

微软的NTLDR/BOOTMGR是无法像grub2等,能够从逻辑分区启动的。
换句话说,如果不经过特殊处理,我们是没有办法从(hd0,4)之类的逻辑分区成功启动XP/WIN7。
应对这“缺点”,在grub2(ubuntu10.04/12.04)下,可以通过如下命令克服:
  1. set root='(hd0,5)'/set root='hd0,msdos6'##(这个命令因grub2版本不同命名方式不同,这是令人厌烦的)
  2. search --no-floppy --fs-uuid --set=root 68821BE0821BB214
  3. drivemap -s (hd0) ${root}
  4. chainloader +1
复制代码
但是不知到为什么,这个并不是总是行得通,我记得我利用win7安装器把win那个分区格调之后,重新安装并写入正确的BOOTMGR引导扇区(我并不会蠢到让那个安装器覆盖我的MBR的),然后切换到ubuntu10.04下update-grub之后,检查过grub。cfg,语法都是类似上面的,就是行不通了。自从那次,我被迫创建一个主分区来存放BOOTMGR和BOOT。

这次我使用grub4dos作为我的启动管理器:主要原因是因为我升级到了Ubuntu 13.04,其带的grub2的cfg文件过于复杂了,我决定自己维护我的menu.lst了。

我现在的ubuntu13.04带的grub2看来并没有使用drivemap -s (hd0) ${root}那样的语句去对待处于逻辑分区的BOOTMGR,我觉得这会出问题的(见下面代码)。但是我并没有尝试去用Windows 7 (loader) (on /dev/sda6)这个启动过。
  1. menuentry 'Windows 7 (loader) (on /dev/sda2)' --class windows --class os $menuentry_id_option 'osprober-chain-6813-5A57' {
  2.         insmod part_msdos
  3.         insmod fat
  4.         set root='hd0,msdos2'
  5.         if [ x$feature_platform_search_hint = xy ]; then
  6.           search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos2 --hint-efi=hd0,msdos2 --hint-baremetal=ahci0,msdos2  6813-5A57
  7.         else
  8.           search --no-floppy --fs-uuid --set=root 6813-5A57
  9.         fi
  10.         chainloader +1
  11. }
  12. menuentry 'Windows 7 (loader) (on /dev/sda6)' --class windows --class os $menuentry_id_option 'osprober-chain-68821BE0821BB214' {
  13.         insmod part_msdos
  14.         insmod ntfs
  15.         set root='hd0,msdos6'
  16.         if [ x$feature_platform_search_hint = xy ]; then
  17.           search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos6 --hint-efi=hd0,msdos6 --hint-baremetal=ahci0,msdos6  68821BE0821BB214
  18.         else
  19.           search --no-floppy --fs-uuid --set=root 68821BE0821BB214
  20.         fi
  21.         chainloader +1
  22. }
复制代码
无论如何,我都希望可以引导处于逻辑分区的NTLDR和BOOTMGR;

我上网搜索了一些资料,有的说可以这样:
  1. map (hd0,4)+1 (hd0) ##但是出错了,我特意创建了一个虚拟机,也是同样的错误:“Extended partition table is invalid , or its CHS valus confilct with the BPB in a logical partition”。
  2. map --hook
  3. makeactive
  4. chainloader +1
  5. boot
复制代码
之类的可以这样,请问有人通过这个可以引导(hd0,4)或者(hd0,5)上的(bootmgr/ntldr),并成功让其启动WIN7或者XP么?

已知问题:
1、引导位于逻辑分区上的bootmgr,尽管的确启动了bootmgr,但是它会提示找不到BCD类似的错误消息,从而无法启动WIN7。
2、我的电脑执行(hd0,4)+1 (hd0)会出错,提示说“Extended partition table is invalid , or its CHS valus confilct with the BPB in a logical partition”。各位有成功执行这个命令么?为什么我的这里不行呢?
推荐
发表于 2013-5-4 16:33:29 | 只看该作者
本帖最后由 fujianabc 于 2013-5-4 16:37 编辑

曾经我从(hd0,5)上启动过xp,为了避免ntldr寻找主分区boot.ini,第二条map把(hd0)map到(hd1)了。另外你不能像一楼那样chainloader +1,这样直接加载逻辑分区第一扇区会有问题,应该直接chainloader ntldr
map (hd0,5)+1 (hd0)
map (hd0) (hd1)
map --hook
root (hd0,0)
chainloader (hd0,0)/ntldr

最后还要把boot.ini中把rdisk(0)改为rdisk(1),否则切换到保护模式map失效会蓝屏的
回复

使用道具 举报

3#
 楼主| 发表于 2013-5-2 01:46:42 | 只看该作者
本帖最后由 2011GameBoy 于 2013-5-2 01:48 编辑

我的目的就是让BOOTMGR/NTLDR误认为它身处的逻辑分区是主分区,并且在里面找到他的BCD/BOOT.INI并加载系统列表。并成功启动WIN7/XP。

我记得之前,无论是XP还是Win7,都可以
drivemap -s (hd0) ${root}
这样启动的,但是现在貌似不行了,grub4dos我也没想到类似的解决方案。
回复

使用道具 举报

4#
 楼主| 发表于 2013-5-4 00:34:40 | 只看该作者
据测试,
1、BOOTMGR可以在任意的逻辑分区启动,但是可能要求当前硬盘上没有激活的主分区(否则会到该主分区寻找BCD而不是逻辑分区);
2、NTLDR可以在(hd0,4)这个逻辑分区启动,但是如果是(hd0,5)等其他逻辑分区,虽然能够启动,但是它会寻找主分区上的boot.ini,而不是它身处的逻辑分区上的boot.ini。
回复

使用道具 举报

5#
 楼主| 发表于 2013-5-5 01:20:42 | 只看该作者
本帖最后由 2011GameBoy 于 2013-5-5 01:22 编辑
fujianabc 发表于 2013-5-4 16:33
曾经我从(hd0,5)上启动过xp,为了避免ntldr寻找主分区boot.ini,第二条map把(hd0)map到(hd1)了。另外你不能 ...


但是map (hd0,5)+1 (hd0)这个命令本身就无法执行,
其提示:
  1. Extended partition table is invalid , or its CHS valus confilct with the BPB in a logical partition
复制代码
这个错误,我新创建的虚拟机也会出现。
对此你有什么解决方法没有?
回复

使用道具 举报

6#
 楼主| 发表于 2013-5-5 03:53:11 | 只看该作者
fujianabc 发表于 2013-5-4 16:33
曾经我从(hd0,5)上启动过xp,为了避免ntldr寻找主分区boot.ini,第二条map把(hd0)map到(hd1)了。另外你不能 ...


此处省略一百字,我才发现:分区的开始柱面、扇区和结束柱面和扇区有要求的!必须是:1 1 和 254 63的!
才可以使map (hd0,5)+1 (hd0)之类的命令成功;
回复

使用道具 举报

7#
 楼主| 发表于 2013-5-5 04:19:32 | 只看该作者
本帖最后由 2011GameBoy 于 2013-5-5 04:38 编辑

成功了:
1、关于HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices的修改这里不赘述了。
2、尽管我的XP是从IMG文件里复制过来的(即装有winvblock驱动,能够从img里面启动),但是以下面的的方法
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
并不能从磁盘 1 中启动,在启动过程中蓝屏了,蓝屏代码我看不清楚了。
(如果是从IMG里面启动,那么C盘真的是IMG映射出来的磁盘1,而且成功启动了。)
3、使用方法
multi(0)disk(0)rdisk(1)partition(6)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
即可启动XP,(rdisk(1)partition(6)是因为进行了磁盘位置交换,所以就是这样了。)
4、明明进入之后,可以在磁盘管理中看到 磁盘 1,但是为什么第2点中的方法其实失败我也不清楚原因了。

5、关于那个“多余的”磁盘 1,估计是删掉winvblock驱动就可以搞掉了。

6、这的确是不失为一个好方法。但是我还是希望找到某个方法,这个方法是:使ntldr能够把它身处的逻辑分区看作是主分区(或者至少在它身处的分区寻找boot.ini),然后按照boot.ini说明寻找WINDOWS的位置然后启动它。

7、令我奇怪的是,在C盘的修改,磁盘1 在换其盘符后出现。反过来,在磁盘1上的修改,却不会反映在C盘,而且更换其盘符之后修改消失了。
(“修改”指的是创建文件/文件夹,并不是找什么软件去格式化或者磁盘碎片整理类似的拉)
而且,每次启动这个XP的时候,都会提示那个“多余”的磁盘1可能存在错误倒数10秒来进行chkdsk呢。

当然了,感谢4楼给出给力的提示!!!

未命名.JPG (87.83 KB, 下载次数: 44)

未命名.JPG
回复

使用道具 举报

8#
发表于 2013-5-6 17:54:09 | 只看该作者

我记得很久以前,在逻辑分区上全新安装过WIN7,启动过WIN7的。。

关键是修改 BCD:去除BCD签名后,在BCD中必须指定启动分区partition 例如partition=f:   path  \Windows\system32\winload.exe   

。。。。。。还有就是device位置 和 osdivice位置,boot.sdi位置等

所谓指定的启动分区partition,可能是主分区,或逻辑分区

记得与启动逻辑分区的ntldr不同,bootmgr是不用map的,直接chainloader /bootmgr即可

时间比较长,大概只记得这么多了,仅供参考,

另外,请问1楼菜单中加载insmod part_msdos是什么意思?加载一个MS-DOS格式的分区?没看明白,谢谢!
回复

使用道具 举报

9#
 楼主| 发表于 2013-5-6 18:21:53 | 只看该作者
的确,对于BOOTMGR来说,只要调整partition(或者还有其他)选项就行了;
但是对于NTLDR来说就不行了。
insmod那个是grub2加载MS-DOS分区支持模块的命令语句。
回复

使用道具 举报

10#
 楼主| 发表于 2013-5-6 18:53:46 | 只看该作者
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-1 14:30

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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