修复win7的mbr(zz)
(2010-08-09 10:06:06)
这几天帮人修复win7引导,发现一些规律:
1. BCD里面记录的,确实是分区GUID,而非 C: D: ... 盘符。而通过 bcdedit 或 easyBCD 查看到的
osdevice partition=C:
是经过“翻译”的, bcdedit 把 GUID 翻译成该分区在当前环境下的盘符
2. GUID 确实与 MBR 有关。我试着重现故障,在 dos 用 diskgen 2.0 重写硬盘主引导记录(MBR)后,win7果然不能启动,bootmgr找不到系统盘了。应该是GUID变化导致的。
linux 中,分区 UUID 与MBR无关。而微软把分区 GUID 和 MBR 扯在一起,不知道是怎么想的。或许是出于技术考虑。但客观上给 win7 与 linux 双系统用户造成了麻烦:安装 linux ,可以,安装 GRUB 不会碰触到 MBR 中与 GUID 有关的关键字段,此时 win7 可以正常启动;然而,当 GRUB 出了问题,想恢复微软MBR,可要小心了,过去惯用的 fdisk /mbr 、diskgen重建MBR 方法都有问题了。
3. 我试着把 iso中的 bootmgr 和 boot 目录解压到D盘,在D盘新建文件夹,命名为 sources,把 iso 中 sources 目录下的 boot.wim 解出来 放进去,重启,从 BIOS 设定的默认启动设备进入 GRUB4DOS(这一点很重要,后面详述),chainloader (hd0,4)/bootmgr ,boot ,即可进入 win7 PE ,修复引导。
这一点上比 xp 先进了。xp 的启动器只能从第一活动主分区载入 boot.ini。而从试验结果看, bootmgr 会默认加载同分区中的 boot/BCD ,这借鉴了 grldr 默认加载同分区 menu.lst 的特性 (呵呵,这样说有点吹捧 GRUB4DOS ,不过,的的确确是 GRUB4DOS 最先引入这一特性)。而从ISO中取来的 BCD ,又默认加载同分区中的 sources/boot.wim : 这样一来,bootmgr、boot 、sources 不再限制于主分区,放在逻辑分区也可以启动
4. 从U盘启动修复 win7 引导,有些麻烦。
这是因为 win7 修复程序会把修复的引导记录写入 当前启动分区 。所谓 当前启动分区 也就是 (hd0,0)。举例来说,我有两块内置硬盘 A 和 B,一块移动硬盘,BIOS 设定从 A 启动,那么启动后,硬盘A的第一活动主分区即 win7 认为的“当前启动分区”。假如启动时按 ESC 键进入选择菜单,选了从 移动硬盘 启动,那么,移动硬盘的第一分区就是 “当前启动分区” 。
回到正题,从U盘启动,假如是ZIP模式,即 U盘在 bios 里映射为 0x00,盘符为A,那么, “当前启动分区” 是 BIOS 设定的第一硬盘的第一分区,也就是正常的启动分区,此时修复程序会把 win7 引导写入该盘,重启后,就会进入win7菜单,一切OK。光盘启动与此类似,只不过变成 0xff 。
然而,如果U盘是以HDD模式启动,那么,进入 WIN7 PE后,U盘第一分区将成为 “当前启动分区” ,修复的引导 将被写入U盘第一分区,而内置硬盘上的引导 故障依旧。当你摘下U盘,从内置硬盘启动时,依旧不能进入 win7 。移动硬盘也有类似问题。
1. BCD里面记录的,确实是分区GUID,而非 C: D: ... 盘符。而通过 bcdedit 或 easyBCD 查看到的
osdevice partition=C:
是经过“翻译”的, bcdedit 把 GUID 翻译成该分区在当前环境下的盘符
2. GUID 确实与 MBR 有关。我试着重现故障,在 dos 用 diskgen 2.0 重写硬盘主引导记录(MBR)后,win7果然不能启动,bootmgr找不到系统盘了。应该是GUID变化导致的。
linux 中,分区 UUID 与MBR无关。而微软把分区 GUID 和 MBR 扯在一起,不知道是怎么想的。或许是出于技术考虑。但客观上给 win7 与 linux 双系统用户造成了麻烦:安装 linux ,可以,安装 GRUB 不会碰触到 MBR 中与 GUID 有关的关键字段,此时 win7 可以正常启动;然而,当 GRUB 出了问题,想恢复微软MBR,可要小心了,过去惯用的 fdisk /mbr 、diskgen重建MBR 方法都有问题了。
3. 我试着把 iso中的 bootmgr 和 boot 目录解压到D盘,在D盘新建文件夹,命名为 sources,把 iso 中 sources 目录下的 boot.wim 解出来 放进去,重启,从 BIOS 设定的默认启动设备进入 GRUB4DOS(这一点很重要,后面详述),chainloader (hd0,4)/bootmgr ,boot ,即可进入 win7 PE ,修复引导。
这一点上比 xp 先进了。xp 的启动器只能从第一活动主分区载入 boot.ini。而从试验结果看, bootmgr 会默认加载同分区中的 boot/BCD ,这借鉴了 grldr 默认加载同分区 menu.lst 的特性 (呵呵,这样说有点吹捧 GRUB4DOS ,不过,的的确确是 GRUB4DOS 最先引入这一特性)。而从ISO中取来的 BCD ,又默认加载同分区中的 sources/boot.wim : 这样一来,bootmgr、boot 、sources 不再限制于主分区,放在逻辑分区也可以启动
4. 从U盘启动修复 win7 引导,有些麻烦。
这是因为 win7 修复程序会把修复的引导记录写入 当前启动分区 。所谓 当前启动分区 也就是 (hd0,0)。举例来说,我有两块内置硬盘 A 和 B,一块移动硬盘,BIOS 设定从 A 启动,那么启动后,硬盘A的第一活动主分区即 win7 认为的“当前启动分区”。假如启动时按 ESC 键进入选择菜单,选了从 移动硬盘 启动,那么,移动硬盘的第一分区就是 “当前启动分区” 。
回到正题,从U盘启动,假如是ZIP模式,即 U盘在 bios 里映射为 0x00,盘符为A,那么, “当前启动分区” 是 BIOS 设定的第一硬盘的第一分区,也就是正常的启动分区,此时修复程序会把 win7 引导写入该盘,重启后,就会进入win7菜单,一切OK。光盘启动与此类似,只不过变成 0xff 。
然而,如果U盘是以HDD模式启动,那么,进入 WIN7 PE后,U盘第一分区将成为 “当前启动分区” ,修复的引导 将被写入U盘第一分区,而内置硬盘上的引导 故障依旧。当你摘下U盘,从内置硬盘启动时,依旧不能进入 win7 。移动硬盘也有类似问题。
回复1:
我试着重现故障,在 dos 用 diskgen 2.0 重写硬盘主引导记录(MBR)后,win7果然不能启动
---
这个应该是跟mbr引导代码有关,diskgen用的是Nt 5.x
而vistat以后用的是Nt 6.x
好像boot.wim是iso自带的pe环境...
---
这个应该是跟mbr引导代码有关,diskgen用的是Nt 5.x
而vistat以后用的是Nt 6.x
好像boot.wim是iso自带的pe环境...
回复2:
VISTA 以上系统启动都要检查 MBR 中的磁盘签名,这个以前讨论过的,磁盘签名变了就不能启动了。DISKGENIUS 重写 MBR 也重写了磁盘签名,所以 WIN7 不能启动了。
回复3:
磁盘签名改变了,HKEY_LOCAL_MACHINE/SYSTEM/MountedDevices下的值未变,就导致WINDOWS找不到用户配置文件,最后就是楼上的情况了。这种情况在XP、2003中也会发生。
该变了系统分区大小后,系统分区上的系统启动后也会发什这种情况。
一般重写硬盘MBR后,还要加载系统的注册表,把MountedDevices下的值删掉,WINDOWS启动后会自动创建的。
但有些系统删掉MountedDevices下的值却还是找不到户配置文件(原因不明),解决方法就是进PE,复制MountedDevices下的值,覆盖到原系统的MountedDevices下。
该变了系统分区大小后,系统分区上的系统启动后也会发什这种情况。
一般重写硬盘MBR后,还要加载系统的注册表,把MountedDevices下的值删掉,WINDOWS启动后会自动创建的。
但有些系统删掉MountedDevices下的值却还是找不到户配置文件(原因不明),解决方法就是进PE,复制MountedDevices下的值,覆盖到原系统的MountedDevices下。
回复4:
其实用bcdboot这么一条简单的命令就能搞定bcd的修复,不管你是从什么设备启动的winpe,用bcdboot可以搞定上面几种情况
回复5:
回楼上几位,系统登陆时卡住,或者空桌面卡助,都是由于盘磁盘签名变化使得mounteddevice下盘符分配不再有效所造成的。
2000/xp/vista/win7都会碰到这种问题,如果把系统装在第一分区,碰到问题时直接清空mounteddevice重新自动分配盘符就可以了。
但如果系统装在非第一主分区,但系统盘盘符是c:,或者像pt这种系统盘盘符是e:,但该分区按照windows自动盘符分配规则不是e:,则清空mounteddevice不能解决,因为系统自动分配的盘符与系统盘符不一致仍旧会卡助。
解决方法有两种:
1、用paragon partition manager里面的boot corrector,可以离线手动分配mounteddevice中每个分区的盘符
2、在winpe中用微软的这个脚本(我做过一些修改),比如pe中windows分区的盘符为f:,则 driveletter /currentos:f 即可,这个批处理会自动从离线系统注册表的software中找到windows分区的盘符,然后从winpe注册表的mounteddevice下把系统盘对应的项复制到离线系统的mounteddevice中,并把盘符修正为离线系统的盘符。
2000/xp/vista/win7都会碰到这种问题,如果把系统装在第一分区,碰到问题时直接清空mounteddevice重新自动分配盘符就可以了。
但如果系统装在非第一主分区,但系统盘盘符是c:,或者像pt这种系统盘盘符是e:,但该分区按照windows自动盘符分配规则不是e:,则清空mounteddevice不能解决,因为系统自动分配的盘符与系统盘符不一致仍旧会卡助。
解决方法有两种:
1、用paragon partition manager里面的boot corrector,可以离线手动分配mounteddevice中每个分区的盘符
2、在winpe中用微软的这个脚本(我做过一些修改),比如pe中windows分区的盘符为f:,则 driveletter /currentos:f 即可,这个批处理会自动从离线系统注册表的software中找到windows分区的盘符,然后从winpe注册表的mounteddevice下把系统盘对应的项复制到离线系统的mounteddevice中,并把盘符修正为离线系统的盘符。
回复6:
在PE3.0的系统下用RegWorkshop加载win7的SYSTEM到HKEY_LOCAL_MACHINE下,随便起个名如:win7
然后删除HKEY_LOCAL_MACHINE/win7/MountedDevices
复制HKEY_LOCAL_MACHINE/SYSTEM/MountedDevices到HKEY_LOCAL_MACHINE/win7/MountedDevices
然后卸载配置单元就可以了。
然后删除HKEY_LOCAL_MACHINE/win7/MountedDevices
复制HKEY_LOCAL_MACHINE/SYSTEM/MountedDevices到HKEY_LOCAL_MACHINE/win7/MountedDevices
然后卸载配置单元就可以了。
其他测试解决方法:
1.bootsect.exe 通过 bootsect /nt60 SYS 来修复MBR
2.用win7 安装光盘启动,选修复计算机,在命令提示符窗口下运行
bootsect /nt60 c: /mbr
bootsect /nt60 c: /mbr