win7引导修复

Windows7 引导修复

一、Windows7引导概述

(一)术语说明

Bootmgr(Windows Boot Manager):Windows启动管理器
BCD(Boot Configuration Data):启动配置数据存储

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

1、双分区Windows7:Win7安装后默认占用两个主分区,一个C盘(windows文件夹所在的盘,硬盘的第一个分区,不是活动的)和一个隐藏分区(引导文件所在的盘,硬盘的第二个分区,真正的活动分区)。
2、单分区Windows7:可以将Win7默认安装出的两个分区合二为一,合并方法是:①将两个分区的文件合并到C盘(即硬盘第一个分区);②将C盘设为活动分区;③执行"bootsect /nt60 c:"给C盘写入兼容bootmgr的引导代码;④用Windows7的安装光盘启动计算机,进入光盘后选择“修复计算机”,光盘中的“系统恢复选项”就开始工作了,稍等提示完成,重启OK。

(三)Windows7的引导过程

1、BIOS按设置的存储介质次序轮询到硬盘后,首先寻找硬盘的MBR(主引导记录)和DPT(分区表),然后根据MBR和DPT中的信息寻找系统分区。
2、硬盘MBR中有两个重要信息(引导代码):一个是“目标分区”,一个是“系统类型”。带/MBR参数的bootsect能向MBR中同时写入“活动标记”和“系统类型”。
3、DPT就像是一副地图,MBR中的“目标分区”就像是目的地地名,一般的分区工具都将这个地名写成“活动分区”,但有些软件会对地名进行特殊改写,比如一键还原精灵就将地名改写为自己的“备份/恢复分区”,而这个“备份/恢复分区”并不是活动的。
4、活动分区的PBR(分区引导记录,也叫OBR或DBR)中也有一个重要信息(引导代码),即“引导文件名称”。对于WinXP,“引导文件名称”是“ntldr”。对于Win7,“引导文件名称”是“bootmgr”。BIOS根据MBR和DPT找到活动分区后,就按PBR中的“引导文件名称”在该分区根目录下寻找ntldr(bootmgr)文件,如果找到就将控制权交给ntldr(bootmgr),如果找不到就提示ntldr(bootmgr)丢失,终止引导。带不同参数的bootsect能向PBR中写入不同的“引导文件名称”。
5、ntldr(bootmgr)接管控制权后,就在根目录下寻找并加载启动环境文件(字体文件等)和启动配置文件,然后按启动配置文件中的指令继续下一步引导。对于WinXP,启动配置文件是活动分区根目录下的boot.ini,boot.ini内容单一,它指令ntldr直接加载系统内核。对于Win7,启动配置文件是活动分区根目录下的boot\BCD,BCD内容复杂,它会指令bootmgr对系统配置进行多项验证,首先验证硬盘MBR中是否有兼容bootmgr的“系统类型”信息,验证一致就接着引导,验证不一致就给出提示,终止引导。
6、Win7启动失败后,通常会有五种提示:①找不着设备——活

动分区PBR空白,引导进程根本没加载到bootmgr——格式化活动分区造成的;②找不着操作系统——MBR中没有兼容bootmgr的“系统类型”信息——FDISK /MBR造成的;③开机自动启动“Windows启动修复”——其他都没问题,但分区表局部紊乱——GHOST不对等恢复造成的。④Windows启动管理器弹出0xc000000f错误——其他都没问题,但分区表局部紊乱——GHOST不对等恢复+误删/Recovery目录造成的;⑤Windows启动管理器弹出0xc000000e错误——bootmgr找不到BCD中dvice选项指定的分区——起因详见“四、手工解决0xc000000e错误”。
7、关于GHOST:①GHOST的对象包括整个PBR、文件系统和用户数据。②GHOST不对等恢复不会改变目标分区的大小,但会造成分区表局部紊乱。

二、Windows7引导代码的维护

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

引导代码的维护的目的是更新硬盘的MBR(主引导记录)和分区的PBR(分区引导记录)以在识别bootmgr和识别ntldr之间切换。更新MBR和PBR最方便、最通用、最专业的工具是Bootsect。bootsect.exe是一个单文件程序(附含在Windows vista/7安装光盘的boot目录下),支持Windows命令行运行(包括WinPE命令行)。推荐用光盘启动WinPE执行bootsect.exe,硬盘操作系统下执行bootsect.exe有时会因无法锁定目标卷造成PBR更新失败。另外要注意的是,Vista的bootsect.exe没有/mbr参数,因而它只能更新PBR,而不能更新MBR。

(二)Bootsect命令参数

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

参数 描述
/help 显示使用说明。
/nt52 将与 NTLDR 兼容的主启动代码应用到 SYS、ALL 或 。在 SYS、ALL 或 上安装的操作系统必须是 Windows(R) XP。
/nt60 将与 Bootmgr 兼容的主启动代码应用到 SYS、ALL 或 。在 SYS、ALL 或 上安装的操作系统必须是 Windows Vista?。
SYS 更新用于启动 Windows 的系统分区上的主启动代码。
ALL 更新所有分区上的主启动代码。ALL 选项不必更新每个卷的启动代码。相反,该选项将更新可用作 Windows 启动卷(不包括没有与基础磁盘分区连接的动态卷)的卷上的启动代码。存在此限制是因为启动代码必须位于磁盘分区的起始处。
更新与此驱动器号关联的卷上的主启动代码。在以下两种情况下,不会更新引导代码:
没有与卷关联
与未连接到基础磁盘分区的卷关联。
/force 在启动代码更新期间强制卸除卷。必须谨慎使用该选项。
如果 Bootsect.exe 无法获得独占的卷访问权限,则文件系统可能在下一次重新启动前覆盖启动代码。Bootsect.exe 始终会在每次更新前尝试锁定和卸除卷。当指定 /force 时,如果初始的锁定尝试失败

,将尝试强制卸除。例如,如果目标卷上的文件当前已被其他程序打开,则锁定可能会失败。
如果锁定成功,强制卸除将启用独占卷访问权限和可靠的启动代码更新,即使初始锁定失败。同时,强制卸除将使指向目标卷上文件的所有打开的句柄无效。这可以导致来自打开这些文件的程序的意外行为。因此,请谨慎使用该选项。
/mbr 更新主启动记录,而不对包含 SYS、ALL 或 指定的分区的磁盘扇区 0 上的分区表进行更改。当与 /nt52 选项一起使用时,主启动记录将与 Windows Vista 以前版本的操作系统兼容。当与 /nt60 选项一起使用时,主启动记录将与 Windows? 7、Windows Vista、Windows Server? 2008 或 Windows Server? 2008 R2 兼容。

(三)Bootsect应用示例

bootsect /nt52 E: 给E盘写入兼容WindowsXP的PBR。
bootsect /nt60 sys /mbr 给硬盘写入兼容Windows7和Vista的MBR,给活动分区写入兼容Windows7和Vista的PBR。
bootsect /nt52 sys /mbr 给硬盘写入兼容WindowsXP的MBR,给活动分区写入兼容WindowsXP的PBR。

(四)Bootsect返回信息释义

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


1、Target volumes will be updated with NTLDR compatible bootcode
(目标卷将被与NTLDR兼容的引导代码更新)
2、X: <\\?\Volume{···}>
(本地计算机上标识符为{···}的卷(分区),X: 是该卷的盘符,未分配时不显示X: 和 < > 。此处要特别注意,Bootsect识别出的标识符多半是错的)
3、Successfully updated NTFS filesystem bootcode
(成功更新了NTFS文件系统引导代码)
4、Updated NTFS filesystem bootcode。The update may be unreliable since the volume could not be locked during the update
(更新NTFS文件系统引导代码。更新可能无效,因为该卷在更新时无法锁定)
5、Bootcode was successfully updated on all targeted volumes
(所有目标卷上的引导代码已被成功更新)
6、\??\PhysicalDrive0
(\本地计算机\物理驱动器0,一般指主硬盘)
7、\Device\Harddisk0\DR0
(\设备\硬盘0\数据记录器0)
8、Successfully updated disk bootcode
(成功更新了磁盘引导代码)

三、Windows7引导文件的维护

(一)Windows7引导文件维护概述

Windows7的引导文件包括bootmgr和整个boot目录(内含BCD等),若其中某个文件丢失或损坏,Windows7将无法启动。引导文件维护的办法有以下三种:
1、完全备份法:就是将引导文件复制一份保存起来,有需要时再复制回去。
2、Bcdedit编辑法:只能用于维护BCD,由于BCD不能像XP的boot.ini那样直接用记事本打开编辑启动选项,而且目前尚没有简单易行的第三方编辑工具,所以在BCD中自定义启动选项只能使用Bcdedit。Bcdedit是一个编辑BCD(启动配置数据)的命令行工具

。它有多种功能,包括创建新的BCD、修改现有BCD以及添加启动菜单选项等。该工具与分发一起包含在%WINDIR%\System32文件夹中。你需要有管理员权限才能使用Bcdedit。注意Bcdedit默认操作的是活动分区下的\boot\BCD,即使活动分区没有盘符或者是隐藏分区,操作都仍然有效。要操作其它路径的BCD,请用bcdedit /store参数指定。
3、完全创建法:必须使用Bcdboot.exe,该工具与分发一起包含在%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} 早于Vista的Windows启动加载器项
{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命令参数

常规参数
参数 描述
/? 显示 BCDEdit 命令列表。运行此命令(不带参数)将显示可用命令的摘要。若要显示特定命令的详细帮助,请运行 bcdedit /?命令,其中命令是正在搜索其详细信息的命令的名称。例如,bcdedit /? createstore 显示 Createstore 命令的详细帮助。

用于文件的参数
参数 描述
/createstore 新建一个空的BCD。创建的BCD不是系统BCD。
/export 将系统BCD的内容导出到文件。此文件可以在以后用于还原系统BCD的状态。此命令仅对系统BCD有效。
/import 使用以前使用 /export 选项生成的备份数据文件来还原系统BCD的状态。此命令将删除系统BCD中导入发生以前的所有现有项。此命令仅对系统BCD有效。
/store 此选项可以与大多数 BCDedit 命令一起用来指定要使用的BCD。如果未指定此选项,则 BCDEdit 将在系统BCD上操作。自身运行 bcdedit /store 命令等同于运行 bcdedit /enum active 命令。
例如:
1. 在D盘创建一个名为newstroe的BCD文件
bcdedit /createstore d:\newstroe
2. 将系统BCD备份为d:\bcdbake文件
bcdedit /export d:\bcdbake
3. 将d:\bcdbake文件还原为系统BCD
bcdedit /import d:\bcdbake

用于项的参数
参数 描述
/copy 复制同一BCD中指定的启动加载器项。启动管理器项不能被复制。
/create 在BCD中创建一个新的空项。如果同时指定了一个正在使用的标识符,则无法指定 /application、/inherit 和 /device 选项。如果未指定标识符或指定的标识符未被使用,则必须指定 /application、/inherit 和 /device 选项。
语法:bcdedit /create [{}] /d [-application | /inherit []|/inherit DEVICE | /device]
其中,指定新项要使用的标识符,指定新项要使用的描述,/application 指定新项必须是应用程序项,指定应用程序类型,其值可以是BOOTSECTOR、OSLOADER、RESUME、STARTUP。
/delete 删除BCD中指定的项。
例如:
1. 创建基于NTLDR的启动加载器项
bcdedit /create {ntldr} /d "Earlier Windows OS Loader"
2. 创建新的启动加载器项
bcdedit /create /d "Windows Vista" /application osloader
3. 复制当前系统的启动加载器项
bcdedit /copy {current} /d "copy of osloader"
4. 删除GUID为{9f62d3dc-3054-11dd-95a5-001e3d8b719b}的启动加载器项
bcdedit /delete {9f62d3dc-3054-11dd-95a5-001e3d8b719b}

用于项选项的参数
参数 描述
/deletevalue 删除指定项中的一个元素。
语法:bcdedit [/store ] /deletevalue []
/set 设置一个项选项值。
语法:bcdedit [/store ] /set [{}]
其中,filename是BCD的名称,是项的标识符(若不指定则默认为{current}),是选

项名,value是要设置的值。
例如:
1. 删除{current}项中的resumeobject选项
bcdedit /deletevale {current} resumeobject
2. 设置当前系统的启动菜单描述为"32bit vista"
bcdedit /set {current} description "32bit vista"

控制输出的参数
参数 描述
/enum 列出BCD中的项。/enum 选项是 BCDEdit 的默认值,因此运行 bcdedit 命令(不带参数)等同于运行 bcdedit /enum active 命令。
/v 详细模式。为方便记忆,微软使用缩写形式来表示几个特定项和元素的标识符。将 /v 指定为命令行选项将完整显示所有标识符。自身运行 bcdedit /v 命令等同于运行 bcdedit /enum active /v 命令。

控制启动管理器的参数
参数 描述
/bootsequence 指定用于下次启动的一次性显示顺序。此命令类似于 /displayorder 选项,除了其仅在下次计算机启动时使用。计算机以后将还原到原始的显示顺序。
/default 指定在超时到期时启动管理器选择的默认项。
/displayorder 指定向用户显示启动选项时启动管理器使用的显示顺序。
/timeout 指定在启动管理器选择默认项之前要等待的时间,以秒为单位。
/toolsdisplayorder 指定各维护工具在工具菜单界面的显示顺序。
例如:
1. 设置默认启动{cbd971bf-b7b8-4885-951a-fa03044f5d71}对应的系统加载器
bcdedit /default {cbd971bf-b7b8-4885-951a-fa03044f5d71}
2. 设置两个操作系统在启动菜单中显示的顺序为:{current} {ntldr}
bcdedit /displayorder {current} {ntldr}

控制紧急管理服务的参数
参数 描述
/bootems 启用或禁用指定项的紧急管理服务 (EMS)。
/ems 启用或禁用指定的操作系统启动项的 EMS。
/emssettings 设置计算机的全局 EMS 设置。/emssettings 不启用或禁用任何特定启动项的 EMS。

控制调试的参数
参数 描述
/bootdebug 启用或禁用指定启动项的启动调试程序。尽管此命令可为任何启动项工作,但仅对启动应用程序有效。
/dbgsettings 指定或显示系统的全局调试程序设置。此命令不启用或禁用内核调试程序;使用 /debug 选项完成此目的。若要设置单个全局调试程序设置,请使用 bcdedit /setdbgsettings type value 命令。
/debug 启用或禁用指定启动项的内核调试程序。

四、手工解决0xc000000e错误

问题描述:Win7启动失败,Windows启动管理器给出0xc000000e错误(有时是英文的,有时是中文的),系统自带的“启动修复”和Bootsect命令都解决不了,如果按提示插入Windows7的安装光盘进行修复,一般能启动是没问题的,但Windows 启动管理器会永远变成英文界面。
问题分析:Windows启动管理器已成功加载,但bootmgr找不到BCD中dvice选项指定的分区。如果出错提示是英文,说明BCD中"Windows启动管理器"项的"locale"选项没被加载,bootmgr找不到BCD中"Windows启动

管理器"项的dvice选项指定的分区。如果出错提示是中文,说明BCD中"Windows启动管理器"项的"locale"选项已被加载了,但bootmgr找不到BCD中"Windows启动加载器"项的dvice选项指定的分区。
常见起因:①将双分区Win7调整为单分区Win7;②对单分区Win7所在硬盘执行了"FDISK /MBR";③对双分区Win7进行了与单分区有关的其他操作。
解决办法:WinPE下打开Windows命令行工具,转到Win7的Windows\system32目录,执行"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,这个很奇怪,至今没弄懂什么原因。

五、Windows7和WindowsXP双系统引导修复

(一)用Win7引导XP

1. C盘Win7先装,D盘XP用安装盘后装,装完后XP可正常进入,Win7无法进入。这样安装的XP其核心文件虽在D盘,但ntldr、https://www.360docs.net/doc/2310877765.html,、boot.ini、bootfont.bin这些引导文件都被放在了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. C盘Win7先装,D盘XP用GHOST后装,装完后Win7可正常进入,XP无法进入。此时的修复方法如下。
① 把D盘根目录下的ntldr、https://www.360docs.net/doc/2310877765.html,、boot.ini三个文件复制到C盘根目录下(bootfont.bin不必复制,因为引导菜单字体用的Win7的)。
② 修改boot.ini文件的内容,将C:修改D:,为引导XP指定正确的路径。
③ cmd下执行如下命令(Win7下cmd须以管理员身份运行):
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. C盘XP用安装盘先装,D盘Win7用GHOST后装,装完后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 parti

tion=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:\boot\BCD文件中的{bootmgr}项中的"C:"改成"D:";2、grldr放在C盘,修改C:\boot.ini,增加通过ntldr引导grldr的菜单项;3、修改grldr的menu.lst,增加引导D:\bootmgr的菜单项。这样C盘就是纯净的XP+GRUB4DOS,D盘就是包括启动器的完整Win7了。按此设置后,成功引导Win7,其它使用一切正常。只是存在一个问题,就是进入Win7系统后,在“计算机”->属性->“高级系统设置”->“启动和故障恢复设置”中颜色是灰色的,也没有任何启动项,直接使用bcdedit也提示找不到文件。很明显是Win7和bcdedit都没有找到BCD文件。据此,我分析:1、bootmgr寻找的是与其同一分区下的\boot\BCD,所以能够顺利启动Win7;2、而进入Win7后系统找不到BCD,原因是Win7和bcdedit只寻找活动分区下的\boot\BCD,而D盘不是活动分区,所以没找到。

相关文档
最新文档