2023年11月24日发(作者:)

Windows7_引导修复

Windows7 引导修复

⼀、Windows7引导概述

(⼀)术语说明

Bootmgr(Windows Boot Manager)Windows启动管理器

BCD(Boot Configuration Data):启动配置数据存储

(⼆)双分区Windows7与单分区Windows7

1、双分区Windows7Win7安装后默认占⽤两个主分区,⼀个C(windows⽂件夹所在的盘,硬盘的第⼀个分区,不是活动

)和⼀个隐藏分区(引导⽂件所在的盘,硬盘的第⼆个分区,真正的活动分区)

2、单分区Windows7:可以将Win7默认安装出的两个分区合⼆为⼀,合并⽅法是:将两个分区的⽂件合并到C(即硬盘第

⼀个分区)C盘设为活动分区;执⾏"bootsect /nt60 c:"C盘写⼊兼容bootmgr的引导代码;Windows7的安装光盘

启动计算机,进⼊光盘后选择修复计算机,光盘中的系统恢复选项就开始⼯作了,稍等提⽰完成,重启OK

(三)Windows7的引导过程

1BIOS按设置的存储介质次序轮询到硬盘后,⾸先寻找硬盘的MBR(主引导记录)DPT(分区表),然后根据MBRDPT中的

信息寻找系统分区。

2、硬盘MBR中有两个重要信息(引导代码):⼀个是⽬标分区,⼀个是系统类型。带/MBR参数的bootsect能向MBR中同时

写⼊活动标记系统类型

3DPT就像是⼀副地图,MBR中的⽬标分区就像是⽬的地地名,⼀般的分区⼯具都将这个地名写成活动分区,但有些软

件会对地名进⾏特殊改写,⽐如⼀键还原精灵就将地名改写为⾃⼰的备份/恢复分区,⽽这个备份/恢复分区并不是活动的。

4、活动分区的PBR(分区引导记录,也叫OBRDBR)中也有⼀个重要信息(引导代码),即引导⽂件名称。对于WinXP

导⽂件名称“ntldr”。对于Win7引导⽂件名称“bootmgr”BIOS根据MBRDPT找到活动分区后,就按PBR中的引导

⽂件名称在该分区根⽬录下寻找ntldr(bootmgr)⽂件,如果找到就将控制权交给ntldr(bootmgr),如果找不到就提⽰

ntldr(bootmgr)丢失,终⽌引导。带不同参数的bootsect能向PBR中写⼊不同的引导⽂件名称

5ntldr(bootmgr)接管控制权后,就在根⽬录下寻找并加载启动环境⽂件(字体⽂件等)和启动配置⽂件,然后按启动配置⽂件

中的指令继续下⼀步引导。对于WinXP,启动配置⽂件是活动分区根⽬录下的内容单⼀,它指令ntldr直接加

载系统内核。对于Win7,启动配置⽂件是活动分区根⽬录下的bootBCDBCD内容复杂,它会指令bootmgr 对系统配置进⾏

多项验证,⾸先验证硬盘MBR中是否有兼容bootmgr系统类型信息,验证⼀致就接着引导,验证不⼀致就给出提⽰,终⽌

引导。

6Win7启动失败后,通常会有五种提⽰:找不着设备——活动分区PBR空⽩,引导进程根本没加载到bootmgr——格式化

活动分区造成的;找不着操作系统——MBR中没有

兼容bootmgr系统类型信息——FDISK /MBR造成的;开机⾃动启动“Windows启动修复”——其他都没问题,但分区表局

部紊乱——GHOST不对等恢复造成的。Windows 启动管理器弹出0xc000000f错误——其他都没问题,但分区表局部紊乱

——GHOST不对等恢复+误删/Recovery⽬录造成的;Windows启动管理器弹出0xc000000e错误——bootmgr 找不到BCD

dvice选项指定的分区——起因详见四、⼿⼯解决0xc000000e错误7、关于GHOSTGHOST的对象包括整个PBR

⽂件系统和⽤户数据。GHOST不对等恢复不会改变⽬标分区的⼤⼩,但会造成分区表局部紊乱。

⼆、Windows7引导代码的维护

(⼀)Windows7引导代码维护概述

引导代码的维护的⽬的是更新硬盘的MBR(主引导记录)和分区的PBR(分区引导记录)以在识别bootmgr和识别ntldr之间切换。

更新MBRPBR最⽅便、最通⽤、最专业的⼯具是Bootsect是⼀个单⽂件程序(附含在Windows vista/7安装光

盘的boot⽬录下),⽀持Windows命令⾏运⾏(包括WinPE命令⾏)。推荐⽤光盘启动WinPE执⾏,硬盘操作系统下

执⾏有时会因⽆法锁定⽬标卷造成PBR更新失败。另外要注意的是,Vista没有/mbr参数,因⽽它

只能更新PBR,⽽不能更新MBR

(⼆)Bootsect命令参数

{/help | /nt52 | /nt60} {SYS | ALL | }[/force] /mbr

(三)Bootsect应⽤⽰例

bootsect /nt52 E: E盘写⼊兼容WindowsXPPBR

bootsect /nt60 sys /mbr 给硬盘写⼊兼容Windows7V istaMBR,给活动分区写⼊兼容Windows7V istaPBR

bootsect /nt52 sys /mbr 给硬盘写⼊兼容WindowsXPMBR,给活动分区写⼊兼容WindowsXPPBR

(四)Bootsect返回信息释义

下图是WinPE下给双分区的Win7重写PBRMBR成功后的返回信息。

1T arget volumes will be updated with NTLDR compatible bootcode

(⽬标卷将被与NTLDR兼容的引导代码更新)

2X:

(本地计算机上标识符为{···}的卷(分区)X: 是该卷的盘符,未分配时不显⽰X: < > 。此处要特别注意,Bootsect识别出的标

识符多半是错的)

3Successfully updated NTFS filesystem bootcode

(成功更新了NTFS⽂件系统引导代码)

4Updated NTFS filesystem bootcodeThe update may be unreliable since the volume could not be locked during the

update

(更新NTFS⽂件系统引导代码。更新可能⽆效,因为该卷在更新时⽆法锁定)

5Bootcode was successfully updated on all targeted volumes

(所有⽬标卷上的引导代码已被成功更新)

6??PhysicalDrive0

本地计算机物理驱动器0,⼀般指主硬盘)

7DeviceHarddisk0DR0

设备硬盘0数据记录器0

8Successfully updated disk bootcode

(成功更新了磁盘引导代码)

三、Windows7引导⽂件的维护

(⼀)Windows7引导⽂件维护概述

Windows7的引导⽂件包括bootmgr和整个boot⽬录(内含BCD),若其中某个⽂件丢失或损坏,Windows7将⽆法启动。引导

⽂件维护的办法有以下三种:

1、完全备份法:就是将引导⽂件复制⼀份保存起来,有需要时再复制回去。

2Bcdedit编辑法:只能⽤于维护BCD,由于BCD不能像XP那样直接⽤记事本打开编辑启动选项,⽽且⽬前尚没有

简单易⾏的第三⽅编辑⼯具,所以在BCD中⾃定义启动选项只能使⽤BcdeditBcdedit是⼀个编辑BCD(启动配置数据)的命令

⾏⼯具。它有多种功能,包括创建新的BCD、修改现有BCD以及添加启动菜单选项等。该⼯具与分发⼀起包含

%WINDIR%System32⽂件夹中。你需要有管理员权限才能使⽤Bcdedit。注意Bcdedit 默认操作的是活动分区下的

bootBCD,即使活动分区没有盘符或者是隐藏分区,操作都仍然有效。要操作其它路径的BCD,请⽤bcdedit /store参数指

定。

3、完全创建法:必须使⽤,该⼯具与分发⼀起包含在%WINDIR%System32⽂件夹中,利⽤它可以从已有的

Windows映像(%WINDIR%boot%WINDIR%System32)创建⼀套启动环境⽂件(整个boot⽬录,内含BCD)到系统分区

中,Windows7安装光盘中的启动修复就是以该⼯具为内核,但由于启动修复⾃动运⾏,不能按需进⾏区域设置,因此会按

默认值美国进⾏创建,⾃动修复后的启动菜单以后就是英⽂的了。⾄于⼿⼯操作,太复杂了,没有必要掌握。

(⼆)BCD中的项和元素

BCD中的项只能有两种,即启动管理器项和启动加载器项。启动管理器项必须有且只能有⼀个,启动加载器项却可以有好⼏

(每个启动加载器项对应⼀个操作系统)。启动管理器项统领所有启动加载器项。项的⼦项就是元素,也叫项选项。

(三)BCD中的标识符

BCD中的每个项和重要元素都有⼀个全局唯⼀的标识符,⽤于对它们进⾏识别和管理。标识符使⽤GUID格式({xxxxxxxx-xxxx-

xxxx-xxxx-xxxxxxxxxxxx}),其中的x都是⼗六进制数。GUID标识符可以通过bcdedit /v命令查看。为⽅便记忆,微软使⽤缩写

形式来表⽰⼏个特定项和元素的GUID标识符。执⾏bcdedit(不带参数)如果显⽰以下字符,就说明相应的项或元素正以缩写形

式显⽰GUID标识符。

{bootmgr} Windows启动管理器项

{default}默认启动加载器项

{ntldr}早于V istaWindows启动加载器项

{current}当前运⾏的启动加载器项

{globalsettings}验证全局设置(包括验证MBR中是否有兼容bootmgr的引导代码) {memdiag}内存诊断

{badmemory} RAM故障列表

{dbgsettings}验证调试程序运⾏环境

{emssettings}验证紧急管理服务运⾏环境

{ramdiskoptions}验证启动管理器运⾏的RAM环境

{bootloadersettings}验证启动加载器运⾏环境

{resumeloadersettings}验证休眠恢复运⾏环境

{fwbootmgr}固件启动管理器项(仅⽤于EFI规格的计算机上)

下图是双分区(活动分区⽆盘符)Win7执⾏bcdedit /v显⽰的详细模式的BCD。图中BCD 有两个项,⼀个启动管理器项和⼀个

启动加载器项,注意⽤⽅框圈住的三个标识符,所有装了Win7的计算机都是同⼀个值。

下图是双分区(活动分区⽆盘符)Win7执⾏bcdedit(不带参数)显⽰的缩写模式的BCD。图中的BCD有两个项,⼀个启动管理

器项和⼀个启动加载器项,注意⽤⽅框圈住的三个标识符,所有装了Win7的计算机都是同⼀个值。

(四)Bcdedit命令参数

1. D盘创建⼀个名为newstroeBCD⽂件

bcdedit /createstore d:newstroe

2. 将系统BCD备份为d:bcdbake⽂件

bcdedit /export d:bcdbake

3. d:bcdbake⽂件还原为系统BCD

bcdedit /import d:bcdbake

⽤于项的参数

1. 创建基于NTLDR的启动加载器项

bcdedit /create {ntldr} /d "Earlier Windows OS Loader"

2. 创建新的启动加载器项

bcdedit /create /d "Windows V ista" /application osloader

3. 复制当前系统的启动加载器项

bcdedit /copy {current} /d "copy of osloader"

4. 删除GUID{9f62d3dc-3054-11dd-95a5-001e3d8b719b}的启动加载器项

bcdedit /delete {9f62d3dc-3054-11dd-95a5-001e3d8b719b}

⽤于项选项的参数

例如:

1. 删除{current}项中的resumeobject选项

bcdedit /deletevale {current} resumeobject

控制启动管理器的参数

例如:

1. 设置默认启动{cbd971bf-b7b8-4885-951a-fa03044f5d71}对应的系统加载器

bcdedit /default {cbd971bf-b7b8-4885-951a-fa03044f5d71}

2. 设置两个操作系统在启动菜单中显⽰的顺序为:{current} {ntldr}

bcdedit /displayorder {current} {ntldr}

控制紧急管理服务的参数

问题描述:Win7启动失败,Windows启动管理器给出0xc000000e错误(有时是英⽂的,有时是中⽂的),系统⾃带的启动修

Bootsect命令都解决不了,如果按提⽰插⼊Windows7的安装光盘进⾏修复,⼀般能启动是没问题的,但Windows 启动

管理器会永远变成英⽂界⾯。

问题分析:Windows启动管理器已成功加载,但bootmgr找不到BCDdvice选项指定的分区。如果出错提⽰是英⽂,说明

BCD"Windows启动管理器"项的"locale"选项没被加载,bootmgr找不到BCD"Windows启动管理器"项的dvice选项指定的

分区。如果出错提⽰是中⽂,说明BCD"Windows启动管理器"项的"locale"选项已被加载了,但bootmgr找不到BCD

"Windows启动加载器"项的dvice选项指定的分区。

常见起因:将双分区Win7调整为单分区Win7对单分区Win7所在硬盘执⾏了"FDISK /MBR"对双分区Win7进⾏了与

单分区有关的其他操作。

解决办法:WinPE下打开Windows命令⾏⼯具,转到Win7Windowssystem32⽬录,执⾏"bcdedit /v",显⽰当前BCD内容

如下:

注意看图中的"unknown",它们就是错误。如果是单分区的Win7,只要把这些"unknown"都改成"partition=C"就能完美解决。

如果是双分区的Win7,请按活动分区的盘符酌情处理,总之不能都改成"partition=C"。单分区的Win7请执⾏以下三条命令:

bcdedit /set {bootmgr} device partition=C:

bcdedit /set {default} device partition=C:

bcdedit /set {default} osdevice partition=C:

对单分区的Win7,这三条命令还能实现在fdisk /mbr后免⽤bootsect /nt60 c: /mbr,这个很奇怪,⾄今没弄懂什么原因。

五、Windows7WindowsXP双系统引导修复

(⼀)⽤Win7引导XP

1. CWin7先装,DXP⽤安装盘后装,装完后XP可正常进⼊,Win7⽆法进⼊。这样安装的XP其核⼼⽂件虽在D盘,但

ntldr/doc/ 这些引导⽂件都被放在了C盘,因

C盘是硬盘上唯⼀的活动分区。此时的修复⽅法如下。

cmd下执⾏如下命令:

bootsect /nt60 c: /mbr 或者bootsect /nt60 sys /mbr

bcdedit /create {ntldr} /d "Windows XP Professional"

bcdedit /set {ntldr} device partition=c: 或者bcdedit /set {ntldr} device boot

bcdedit /set {ntldr} path ntldr

bcdedit /displayorder {ntldr} /addlast

bcdedit /timeout 5

2. CWin7先装,DXPGHOST后装,装完后Win7可正常进⼊,XP⽆法进⼊。此时的修复⽅法如下。

D盘根⽬录下的ntldr/doc/ 三个⽂件复制到C盘根⽬录

下(不必复制,因为引导菜单字体⽤的Win7的)。

修改⽂件的内容,将C:修改D:,为引导XP指定正确的路径。

cmd下执⾏如下命令(Win7cmd须以管理员⾝份运⾏):

bcdedit /create {ntldr} /d "Windows XP Professional"

bcdedit /set {ntldr} device partition=c: 或者bcdedit /set {ntldr} device boot

bcdedit /set {ntldr} path ntldr

bcdedit /displayorder {ntldr} /addlast

bcdedit /timeout 5

3. CXP⽤安装盘先装,DWin7GHOST后装,装完后XP可正常进⼊,Win7⽆法进⼊。修复⽅法如下。

cmd下执⾏如下命令:

bcdboot d:windows /l zh-cn /s c: (在C盘根⽬录⽣成了boot⽂件夹和bootmgr⽂件)bootsect /nt60 c: /mbr 或者bootsect /nt60

sys /mbr

bcdedit /create {ntldr} /d "Windows XP Professional"

bcdedit /set {ntldr} device partition=c: 或者bcdedit /set {ntldr} device boot

bcdedit /set {ntldr} path ntldr

bcdedit /displayorder {ntldr} /addlast

bcdedit /timeout 5

(⼆)⽤XP引导Win7问题分析

我现在安装的是XP+Win7双系统,XP先装在C盘(主分区、活动分区),Win7在⾮活动D 盘(逻辑分区、⾮活动分区),⽤

Win7的启动器来引导XP,⼀切使⽤正常。

由于想折腾⼀下⽤XP的启动器来引导Win7,所以尝试⽤XP启动器+GRUB4DOS来启动Win7,启动顺序是:ntldr->grldr-

bootmgr

我的步骤如下:

1、把C盘中的和Win7启动有关的bootmgr⽂件和boot整个⽬录移到D盘,然后把D:bootBCD⽂件中的{bootmgr}项中

"C:"改成"D:"

2grldr放在C盘,修改C:,增加通过ntldr引导grldr的菜单项;

3、修改grldr,增加引导D:bootmgr的菜单项。

这样C盘就是纯净的XP+GRUB4DOSD盘就是包括启动器的完整Win7了。

按此设置后,成功引导Win7,其它使⽤⼀切正常。只是存在⼀个问题,就是进⼊Win7系统后,在计算机”->属性->“⾼级系统

设置”->“启动和故障恢复设置中颜⾊是灰⾊的,也没有任何启动项,直接使⽤bcdedit也提⽰找不到⽂件。很明显是Win7

bcdedit都没有找到

BCD⽂件。

据此,我分析:

1bootmgr寻找的是与其同⼀分区下的bootBCD,所以能够顺利启动Win7

2、⽽进⼊Win7后系统找不到BCD,原因是Win7bcdedit只寻找活动分区下的bootBCD,⽽D盘不是活动分区,所以没找

到。