2023年11月24日发(作者:)
Windows7_引导修复
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,启动配置⽂件是活动分区根⽬录下的,内容单⼀,它指令ntldr直接加
载系统内核。对于Win7,启动配置⽂件是活动分区根⽬录下的bootBCD,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。是⼀个单⽂件程序(附含在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盘写⼊兼容WindowsXP的PBR。
bootsect /nt60 sys /mbr 给硬盘写⼊兼容Windows7和V ista的MBR,给活动分区写⼊兼容Windows7和V ista的PBR。
bootsect /nt52 sys /mbr 给硬盘写⼊兼容WindowsXP的MBR,给活动分区写⼊兼容WindowsXP的PBR。
(四)Bootsect返回信息释义
下图是WinPE下给双分区的Win7重写PBR和MBR成功后的返回信息。
1、T arget volumes will be updated with NTLDR compatible bootcode
(⽬标卷将被与NTLDR兼容的引导代码更新)
2、X:
(本地计算机上标识符为{···}的卷(分区),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、DeviceHarddisk0DR0
(设备硬盘0数据记录器0)
8、Successfully updated disk bootcode
(成功更新了磁盘引导代码)
三、Windows7引导⽂件的维护
(⼀)Windows7引导⽂件维护概述
Windows7的引导⽂件包括bootmgr和整个boot⽬录(内含BCD等),若其中某个⽂件丢失或损坏,Windows7将⽆法启动。引导
⽂件维护的办法有以下三种:
1、完全备份法:就是将引导⽂件复制⼀份保存起来,有需要时再复制回去。
2、Bcdedit编辑法:只能⽤于维护BCD,由于BCD不能像XP的那样直接⽤记事本打开编辑启动选项,⽽且⽬前尚没有
简单易⾏的第三⽅编辑⼯具,所以在BCD中⾃定义启动选项只能使⽤Bcdedit。Bcdedit是⼀个编辑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 ista的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命令参数
1. 在D盘创建⼀个名为newstroe的BCD⽂件
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找不到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的Windowssystem32⽬录,执⾏"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、/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. C盘Win7先装,D盘XP⽤GHOST后装,装完后Win7可正常进⼊,XP⽆法进⼊。此时的修复⽅法如下。
①把D盘根⽬录下的ntldr、/doc/ 、三个⽂件复制到C盘根⽬录
下(不必复制,因为引导菜单字体⽤的Win7的)。
②修改⽂件的内容,将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 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:";
2、grldr放在C盘,修改C:,增加通过ntldr引导grldr的菜单项;
3、修改grldr的,增加引导D:bootmgr的菜单项。
这样C盘就是纯净的XP+GRUB4DOS,D盘就是包括启动器的完整Win7了。
按此设置后,成功引导Win7,其它使⽤⼀切正常。只是存在⼀个问题,就是进⼊Win7系统后,在“计算机”->属性->“⾼级系统
设置”->“启动和故障恢复设置”中颜⾊是灰⾊的,也没有任何启动项,直接使⽤bcdedit也提⽰找不到⽂件。很明显是Win7和
bcdedit都没有找到
BCD⽂件。
据此,我分析:
1、bootmgr寻找的是与其同⼀分区下的bootBCD,所以能够顺利启动Win7;
2、⽽进⼊Win7后系统找不到BCD,原因是Win7和bcdedit只寻找活动分区下的bootBCD,⽽D盘不是活动分区,所以没找
到。
发布评论