从Windows Vista开始,无论是早期的从纯 DOS 模式下引导还是现在 Windows 2000/XP/Server 2003
采用的 NTLDR + NTDETECT.COM 的引导方式,均被抛弃了。一种被称为 Boot Manager 的组件取代了NTLDR + NTDETECT.COM 的引导方式, 成为 Microsoft在 Windows Vista 里面采用的 Windows 引导方式。在Windows Vista里面,当你启动计算机的时候,首先是 BIOS 开始运行,BIOS 从启动设备里面读取主引导扇区(MBR)的记录,然后把控制交给储存在 MBR里面的启动代码,接着 Boot Manager启动并从Boot Configuration Data (BCD)数据库里面读取启动项目信息并把这些信息显示在屏幕上面,并等待用户选择。当用户选择了一个启动项目以后,Boot Manager 根据用户的选择,从 BCD数据库里面获取相关的启动参数和配置信息,然后开始系统的引导过程。对于安装了 Windows Vista 的机器,Microsoft 将修改被激活的主分区的启动扇区(Windows 安装程序将在磁盘的第一个扇区里面写入 MBR 内容) ,使用新的启动扇区内容替代原有的启动扇区的内容。经典的错误提示信息: “NTLDR is missing”将被“Bootmgr is missing”所取代。
对于VISTA和Windows 2008,默认情况下BCD数据库在放在c:\boot\bcd中;但在windows 7和Windows 2008 r2中系统分区被隐藏起来(安装时系统会划分200M的系统分区,用来存放引导文件),需通过“磁盘管理”(Diskmgmt.msc),对系统分区执行“更改驱动器号和路径”,分配盘符,才能访问。
一、BCD数据库文件的内容
BCD 文件,本质上就是一个注册表的 hive 文件,因此可以使用注册表编辑器直接对它进行修改。
关于 BCD文件,我们需要关注的内容只有 Objects 下的内容,在 Objects下,有很多以 CLSID命名的
子键,每一个子键均有其特殊的含义。
展开每一个 CLSID 键,一般都会有 2 个字键:Description 和 Elements。在 Elements 键下方,会有树木不等的子键存在,每一个子键都代表不同的含义。有一些是显示的内容,有一些是指向一些特殊的程序或目录用于 Windows Vista 的启动,剩下的一些和 Windows Vista 的启动参数有关。
例如:
12000004 键下的 Element 字符串内容就是用于设定在 Boot Manager 的启动菜单上显示内容的。
12000005 键用于指定 Boot Manager的语言。如果安装了的简体中文版本,那么这里的内容一定是 zh-CN,如果你想使用英文版的 Boot Manager,那么只需要修改为 en-US 即可。不过前提是需要在 \Boot 目录下有一个 en-US 的目录,而且里面有相应的 en-US语言的资源文件。
42000002 键用于指定 Windows的引导程序。在 Windows 里面,引导程序已经改为Winload.exe。
22000002节点用于指定 Windows安装以后的系统目录的名字,默认是 Windows 目录。
如果休眠模式,那么 22000002 节点用于指向休眠文件的文件名,默认是 hiberfil.sys 文件。
42000002 节点用于设置从休眠模式唤醒时由哪个程序完成休眠状态/正常状态的转化。在Windows 如果安装了早期的采用 NTLDR 引导的操作系统,如 Windows 2000/XP/Server 2003,那么 Boot Manager将出现一个叫做{466f5a88-0af2-4f76-9038-095b170dc21c}的 CLSID,这个 CLSID用于代表采用NTLDR启动模式的操作系统的引导程序的名字。 当用户从 Boot Manager里面选择 Earlier version of Windows 菜单项目以后,Boot Manager 将根据 12000002 节点指向的内容调用早期Windows 操作系统的引导程序,默认为 NTLDR。
{9dea862c-5cdd-4e70-acc1-f32b344d4795}是一个专用于代表 Windows Boot Manager 的CLSID。
在{9dea862c-5cdd-4e70-acc1-f32b344d4795}键下面,有一个叫做 24000001 的子键,这个键用于指定将要显示在 Windows Boot Manager 上的操作系统启动菜单的 CLISD 编号。24000001 子键的Element 键是一个 REG_MULTI_SZ 类型的注册表键值,这表示可以写入多个内容。
{b2721d73-1db4-4c62-bf78-c548a880142d}是Windows 内存诊断项目的注册表键值
注意要用修改注册表键值,必须首先修改权限。
二、编辑BCD数据库的方法
1、使用系统属性里面高级选项进行修改
2、bcdedit.exe进行修改
3、msconfig.exe
4、使用第三方工具进行修改(如VistaBootPRO)
三、Bcdedit.exe的操作方法
相比对其它的几种方法,利用Bcdedit.exe来编辑管理BCD数据库功能更加强,更灵活,同时也操作起来也更为复杂。在以前的博文 使用 Windows 7 VHD启动计算机和在VHD文件上安装Windows 7或Windows 2008 R2也曾介绍过这个命令行工具。
1、显示BCD数据库的内容
Bcdedit
或Bcdedit /v,完整显示数据库的内容,此时数据库有些参数的值显示为该值的GUID。在上图启动管理器inhert为gobalsettings,用Bcdedit /v显示时,它的值变成了它的GUID。
注意,当在数据库增加一启动菜单项,系统会随机产生一个GUID。但系统中有些GUID是固定的。如下
标识
|
ID
|
GUID
|
Windows Boot Manager
|
{bootmgr}
|
9dea862c-5cdd-4e70-acc1f32b344d4795
|
Firmware Boot Manager
|
{fwbootmgr}
|
a5a30fa2-3d06-4e9f-b5f4a01df9d1fcba
|
Windows Memory Tester
|
{memdiag}
|
b2721d73-1db4-4c62-bf78c548a880142d
|
Windows Resume Application
|
No alias
|
147aa509-0358-4473-b83bd950dda00615
|
Legacy Windows Loader
|
{ntldr}
|
466f5a88-0af2-4f769038095b170dc21c
|
Current boot entry
|
{current}
|
fa926493-6f1c-4193-a41458f0b2456d1e
|
BCDEdit ID
|
GUID
|
Description
|
{badmemory}
|
5189b25c-5558-4bf2-bca4-289b11bd29e2
|
Global RAM defect list that can be inherited by any boot application.
|
{bootloadersettings}
|
6efb52bf-1766-41db-a6b3-0ee5eff72bd7
|
Global settings that should be inherited by all Windows boot loader applications.
|
{dbgsettings}
|
4636856e-540f-4170-a130-a84776f4c654
|
Global debugger settings that can be inherited by any boot application.
|
{emssettings}
|
0ce4991b-e6b3-4b16-b23c-5e0d9250e5d9
|
Global Emergency Management Services settings that can be inherited by any boot application.
|
{globalsettings}
|
7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e
|
Global settings that should be inherited by all boot applications.
|
{resumeloadersettings}
|
1afa9c49-16ab-4a5c-901b-212802da9460
|
Global settings that should be inherited by all resume applications.
|
2、/export /import
导出/导入BCD数据库
可以利用导出/导入对BCD数据库进行备份和还原。
Bcdedit /export c:\bcd.bak(导出BCD数据库的内容到c:\bcd.bak文件中)
Bcdedit /import c:\bcd.bak(导入c:\bcd.bak文件的内容到Bcd数据库中)
3、/createstore
新建空的启动配置数据存储
bcdedit /createstore <filename>
创建的存储不是系统存储。
Bcdedit /createstore C:\DATA\BCD
4、/store
指定要使用的存储。
bcdedit /store <filename>
此选项不能与 /createstore、/import 和 /export 命令一起使用。
示例:
bcdedit /store c:\RemoteInstall\Boot\x86\default.bcd /set {bootmgr} timeout 10
将c:\RemoteInstall\Boot\x86\default.bcd存储中启动管理器选择默认项以前等待的时间设置10秒
5、/copy
创建指定启动项的副本
bcdedit /copy {current} /d "copy of current"
已将该项成功复制到 {fbc1dbf9-8bfe-11de-bb65-000c297cc8af}。
6、/delete
删除启动配置数据存储中的项。
bcdedit [/store <filename>] /delete <id> [/f] [/cleanup | /nocleanup]
<filename> 指定要使用的存储。如果未指定此选项,则使用系统存储。
<id> 指定要删除的启动项的标识符。
/f 删除指定的项。如果没有此选项,则 Bcdedit 将无法删除任何具有已知标识符的项。
/cleanup 删除指定的项,并从显示顺序中删除该项。并将从存储中删除任何其他涉及到所删除项的项目。删除 OS 加载器项时,如果任何其他 OS 加载器没有引用该项,还将删除从休眠中恢复的关联项。如果未指定 /nocleanup,则认为使用此选项。
/nocleanup 删除指定的项,但不从显示顺序中删除该项。
示例:
下列命令删除存储中指定的操作系统项,并从显示顺序中删除该项:
bcdedit /delete {fbc1dbf9-8bfe-11de-bb65-000c297cc8af}
下列命令删除存储中指定的操作系统项,并从显示顺序中删除该项:
bcdedit /delete {fbc1dbf9-8bfe-11de-bb65-000c297cc8af} /cleanup
下列命令删除存储中指定的操作系统项,但不从显示顺序中删除该项:
bcdedit /delete {fbc1dbf9-8bfe-11de-bb65-000c297cc8af} /nocleanup
下列命令删除存储中基于 NTLDR 的 OS 加载器项:
bcdedit /delete {ntldr} /f
7、/set
设置引导配置数据存储中的项选项值。
Bcdedit /set
下列命令将应用程序设备设置到 C: 分区:
bcdedit /set {default} device partition=C:
下列命令将操作系统设备设置到 VHD 文件(C:\vdisks\vdisk01.vhd)
bcdedit /set {cbd971bf-b7b8-4885-951a-fa03044f5d71} osdevice vhd=[C:]\vdisks\disk01.vhd
下列命令将应用程序路径设置到 \windows\system32\winload.exe
bcdedit /set {cbd971bf-b7b8-4885-951a-fa03044f5d71} path \windows\system32\winload.exe
下列命令将 NX 策略设置到 OptIn。
bcdedit /set nx optin
下列命令设置成以VGA启动
bcdedit /set {cbd971bf-b7b8-4885-951a-fa03044f5d71} vga yes
下列命令将{ntldr}启动描述设置为"启动Windows XP"
bcdedit /set {ntldr} description "启动Windows XP"
8、/deletue
从启动配置数据存储的项中删除数据元素
bcdedit /deletue {cbd971bf-b7b8-4885-951a-fa03044f5d71} vga
9、显示Windows 7和Windows 2008 r2隐藏的BCD项目()
用BCDedit显示BCD数据库的内容,复制recoverysequence的GUID:{05ef5750-78da-11de-9f1a-fc76848d1136}(如前图)
接着输入以下命令bcdedit /displayorder {05ef5750-78da-11de-9f1a-fc76848d1136} /addfirst
然后输入bcdedit /v会发现显示内容多了一项。重启Windows 7时就会在开机菜单中出现Ramdisk Options选项,这是Windows7集成的Windows Recovery Environment,该选项在系统修复/恢复是非常有用。
由于上图中的启动项目其实是调用C:\Recovery\05ef5750-78da-11de-9f1a-fc76848d11
36\Winre.wim文件,所以我们可以用一个更为强大系统恢复文件替换这个文件(如DaRT6.0, Diagnostics and Recovery Toolset的使用这一篇博文中介绍了DaRT6.0光盘的生成方法,我们可以将这个ISO文件中的sources\boot.wim复制为C:\Recovery\05ef5750-78da-11de-9f1a-fc76848d11
36\Winre.wim。),这样Windows Recovery Environment的功能会更为强大!!!
10、使用truncatememory排除损坏的内存单元
bcdedit /set {fbc1dbf9-8bfe-11de-bb65-000c297cc8af} truncatememory 536870912
设置{fbc1dbf9-8bfe-11de-bb65-000c297cc8af}以小于536870912内存来启动系统。这样可以用来测试内存出现故障的范围,同时可以用来进午软件测试。
11、快速添加系统菜单
在一个多系统的环境,往往由于一些原因,会造成造成系统启动选择菜单不全或者有误,此时我们需要手动添加系统菜单项。
假设Windows XP系统安装在C盘
bcdedit /create {ntldr} /d "Microsoft Windows XP"
bcdedit /set {ntldr} device partition=C:
bcdedit /set {ntldr} path \ntldr
bcdedit /displayorder {ntldr} /addfirst
假设Windows 7安装在C盘
set id={cbd971bf-b7b8-4885-951a-fa03044f5d71}
bcdedit /create %id% /d "Windows 7" /application osloader
bcdedit /set %id% locale zh-cn
bcdedit /set %id% device partition=C:
bcdedit /set %id% osdevice partition=C:
bcdedit /set %id% path \Windows\system32\winload.exe
bcdedit /set %id% inherit {bootloadersettings}
bcdedit /set %id% systemroot \windows
bcdedit /set %id% nx OptOut
bcdedit /displayorder %id% /addfirst