启动配置数据(Boot Configuration Data �C BCD)
启动配置数据为控制启动环境数据提供了一个独立于固件的机制。Windows Vista及以后版本的Windows都使用BCD加载操作系统或运行启动环境应用程序(如memtest.exe �C 内存诊断)。BCD影响系统启动的所有方面。
BCD
的数据存储是一个注册表配置单元格式的二进制文件,但不能使用注册表API访问。
BCD
体系结构
BCD
的体系结构是一个由三个基本组件构成的层次结构:存储、对象、元素。
BCD
存储是层次结构中的顶层组件,BCD存储是BCD对象和元素的命名空间容器(namespace container)。
BCD
对象是BCD元素的容器。常见BCD对象的类型描述启动环境应用程序,如Windows启动加载器(boot loader)的一个实例
BCD
元素是一个数据项,如一个调试程序设置、一个启动环境应用程序名称或一个操作系统设置。
BCD
存储
BCD
存储是保存加载Windows或运行其他启动环境应用程序所需信息的BCD对象和元素的命名空间容器(namespace container)。计算机有一个描述所有安装的Windows操作系统和安装的Windows启动环境应用程序的系统BCD存储,除了系统BCD存储之外,还可以有多个非系统BCD存储
l
系统BCD存储文件夹名为bcd,位于活动分区的\boot文件夹
l
Windows
启动管理器(Windows Boot Manager �C bootmgr)使用系统BCD存储来控制启动过程。在多重启动环境中,Windows启动管理器使用来自系统BCD存储的信息显示启动选择菜单
l
BCD
有两个接口:BCD WMI提供程序和BCDEdit.exe
l
管理员、技术支持人员能够使用BCDEdit.exe或BCD WMI创建额外的BCD存储,额外的BCD存储对于恢复、修复、捕获映像很有帮助,而且可以将非系统BCD存储导入为系统BCD存储
下图显示了一个典型BCD存储中BCD的层次
系统BCD存储中至少包含两个BCD对象:
1
、Windows boot manager对象:Windows boot manager对象包含与Windows启动管理器相关的BCD元素,这些BCD元素包括显示在操作系统选择菜单、启动工具选择菜单中的启动项、选择菜单显示时间……。在使用BCDEdit修改一个BCD存储时,可以使用别名{bootmgr}
2
、Windows boot loader对象:对于安装到计算机上的每个版本或配置的Windows,在BCD存储中都有一个Windows boot loader对象的实例。Windows boot loader对象包含加载Windows或Windows初始化时使用的BCD元素,这些BCD元素包括no-execute(NX)页面保护策略、物理地址扩展(Physical Address Extension �C PAE)策略、内核调试程序设置……。当计算机启动到Windows时,新联的Windows boot loader对象实例由别名{current}标识。当使用BCDEdit修改BCD存储时,默认的Windows boot loader对象由别名{default}标识
系统BCD存储中也可能包含下列BCD对象:
l
Windows NTLDR
对象:NTLDR对象描述以前版本Windows启动加载器(Ntldr.exe)的位置,Ntldr.exe用于启动以前版本的基于NT内核的Windows。只有计算机中安装了以前版本的Windows时才需要NTLDR对象。NTLDR对象的别名为{ntldr}
l
启动环境应用程序:BCD存储能够包含执行其他与启动相关操作的BCD对象,如Windows Memory Tester(进行内存诊断)
BCD
对象
有三类BCD对象:application对象、inheritable对象、device对象。最常见的对象类型是application对象,application对象描述启动环境应用程序,如Windows启动管理器、Windows启动加载器。每个BCD对象由一个128位的全局唯一标识符(GUID)标识。
Application
对象
一个application对象代表一个启动环境应用程序。标准application对象包括:
l
Windows boot manager
对象 �C {bootmgr}
l
Windows boot loader
对象 �C {current} {default}
l
Windows NTLDR
对象 �C {ntldr}
l
Windows resume loader
对象
l
Windows Memory Tester
对象 �C {memdiag}
Inheritable
对象
一些BCD元素能够应用于多个application元素,有些BCD元素对BCD存储是全局性的。虽然能够将这些元素分别与使用它们的每个对象实例分别关联,但更有效的方法是创建一个inheritable对象,作为在多个BCD对象实例之间共享的元素的容器。其他对象在使用这些BCD元素时,只需要引用inheritable对象,而不是每个元素,即inheritable对象包含能够应用于多个对象的元素。
Inheritable
对象只能包含应用于所有启动环境应用程序的BCD元素。
下面是一些常用的inheritable对象:
l
全局RAM错误列表,能够被所有启动环境应用程序继承 �C {badmemory}
l
启动加载器全局设置,应当被所有Windows boot loader应用程序继承 �C {bootloadersettings}
l
全局调试程序设置,能够被所有启动环境应用程序继承 �C {dgbsettings}
l
全局紧急管理服务(Emergency Management Services �C EMS)设置,能够被所有启动环境应用程序继承 �C {emssettings}
l
全局设置,应当被所有启动环境应用程序继承 �C {globalsettings}
l
恢复加载器全局设置,应当被所有恢复应用程序继承 �C {resumeloadersettings}
Device
对象
Device
对象描述没有存储在一个application对象中的设备特定的属性。
大多数设备,如硬盘分区,能够由一个BCD元素描述,但复杂的设备需要多个BCD元素来描述。
例如,当从一个Windows映像(WIM)文件创建的RAM磁盘启动时,就需要device对象,此device对象包含WIM文件的位置,如果是从网络启动的,此device对象还包含网络端口信息。RAM磁盘对象的别名为{ramdiskoptions}
可以创建自定义的device对象。
BCD
元素
BCD
元素是启动环境应用程序或Windows启动过程中的配置数据。
一些BCD元素只能与特定BCD对象关联,有些BCD元素能够应用于所有类型的启动环境应用程序。
总结
BCD
存储由一系列对象组件,每个对象是一个启动环境应用程序,每个对象对应一个启动项。每个对象由一系列元素组成,每个元素有一个属性。
简单地说,可以将BCD元素理解成BCD对象的属性。
管理BCD的工具
l
BCDEdit.exe
l
BCD WMI API
l
控制面板 - 系统,允许用户指定两个全局BCD元素的值:默认操作系统和配置、启动管理器超时设置
l
Msconfig.exe
BCDEdit.exe
BCDEdit.exe
(位于%systemroot%\system32文件夹)是一个命令行工具,用于管理BCD存储。BCDEdit.exe能够新建、修改BCD存储、添加启动菜单选项……
使用BCDEdit.exe修改BCD存储需要管理员权限。
BCDEdit.exe
命令划分为8类:
1
、对BCD存储进行操作的命令
/createstore
:新建空BCD存储
/export
:将系统BCD存储的内容导出到文件
/import:
使用由/export导出的文件还原系统BCD存储的状态
2
、对存储中的启动项进行操作的命令
/copy
:复制BCD存储中的启动项
/create
:在BCD存储中新建启动项
/delete
:删除BCD存储中的启动项
3
、对元素进行操作的命令
/deletevalue
:删除启动项的元素
/set
:创建或修改一个启动项的元素(这是我要详细说明的命令,因为使用Windows PE时,这是一个最主要的命令)
4
、控制输出的命令
/enum
:列出一个BCD存储中的启动项
/v
:完整显示启动项的GUID,而不是well-known标识符
5
、控制启动管理器的命令
/bootsequence
:指定一次性启动顺序,例如在使用控制面板中的内存诊断工具(mdsched.exe)时,就是通过指定一次性启动顺序在计算机重启时,运行memtest.exe命令来进行内存诊断的
/default
:指定默认启动项
/displayorder
:指定启动管理器显示启动菜单时启动项的顺序
/timeout
:指定启动管理器超时值
/tooldisplayorder
:指定启动管理器显示工具菜单时启动项的顺序
6
、控制紧急管理服务(EMS)的命令
/bootems
:为一个特定启动应用程序启用或禁用EMS
/ems
:为一个操作系统启动项启用或禁用EMS
/emssettings
:设置全局EMS参数
7
、控制调试的命令
/bootdebug
:为一个启动应用程序启用或禁用调试
/dgbsettings
:设置调试程序的全局参数
/debug
:为一个操作系统启动项启用或禁用内核调试
8
、修改其他命令的命令
/store
:指定命令作用到的BCD存储。如果不指定,默认是作用于系统BCD存储。
实例
注意:对系统BCD存储进行修改可能会影响系统的正常启动,所以尽量在虚拟机上进行实验,或在修改系统BCD存储之前先备份系统BCD存储,这样在系统不能正常启动时,可以使用备份的系统BCD存储进行恢复。
一、BCD存储内容
查看指定BCD存储内容的命令
Bcdedit [/store
文件名
] /enum [
类型
| id] [/v]
/store
文件名
:可选。指定BCD存储。如果不指定,默认系统BCD存储
类型
:可选。指定要查看的启动项的类型。
l
active �C
启动管理器启动菜单中的所有启动项
l
all �C
所有启动项
l
bootapp �C
所有启动环境应用程序
l
inherit �C
所有inheritable对象
l
osloader �C
所有Windows boot loader启动项
l
resume �C
所有休眠恢复启动项
Id
:可选。要查看的启动项的标识符,可以使用GUID或well-knonw标识符
/v
:可选。在输出时显示GUID,而不是well-known标识符
因为系统BCD存储、/enum、active是默认选项,所以如果只输入bcdedit,实际上对系统BCD存储运行bcdedit /enum active
从前面的输出可以看出:
启动环境被划分为两个类型:Windows启动管理器(Windows Boot Manager)和在启动环境中运行的其他启动应用程序,统称为启动项。Windows Boot Manager基本上是一个mini操作系统,控制启动,并允许选择要运行的启动环境应用程序。有许多启动环境应用程序(例如Windows启动加载器 �C Windows boot loader……),每个启动环境应用程序的作用不同。
详细解释一下bcdedit /enum active的输出
Windows
启动管理器
|
标识符
|
{bootmgr}
|
Windows boot manager
对象的标识符
|
device
|
partition=c:
|
Windows
启动管理器程序(bootmgr)位于c:盘
|
description
|
Windows Boot Manager
|
Windows
启动管理器对象的描述
|
locale
|
zh-CN
|
Windows
启动管理程序的区域设置
|
inherit
|
{globalsettings}
|
Windows
启动管理器对象应当继承{globalsettings}对象的设置
|
default
|
{current}
|
Windows
启动管理器的默认启动项的标识符,即当前启动操作系统的Windows boot loader
|
displayorder
|
{current}
|
Windows
启动管理器显示启动菜单时启动项的顺序
|
tooldisplayorder
|
{current}
|
Windows
启动管理器显示工具菜单时启动项的顺序
|
Timeout
|
30
|
Windows
启动管理器等待时间,如果超时,Windows启动管理器运行default指定的启动项
|
Windows
启动加载器
|
标识符
|
{current}
|
Windows boot manager
对象的标识符,{current}表示当前启动的操作系统的Windows boot loader
|
device
|
partition=c:
|
device
元素和path元素结合说明Windows boot manager是C:\windows\system32\winload.exe
|
path
|
\windows\system32\winload.exe
|
description
|
Microsoft Windows Server 2008
|
Windows boot manager
对象的描述
|
locale
|
zh-CN
|
Windows boot manager
的区域设置
|
inherit
|
{bootloadersettings}
|
Windows boot manager
要继承{bootloadersettings}对象的设置
|
osdevice
|
partition=c:
|
osdevice
元素和systemroot元素结合说明操作系统文件位置 %systemroot%变量
|
systemroot
|
\windows
|
resumeobject
|
{fa919a7d-d75e-11de-849e-f7f1d2ee7243}
|
恢复应用程序的标识符
|
nx
|
Optout
|
对操作系统和所有进程启用DEP(数据执行保护),包括操作系统内核和驱动程序
|
osdevice
和systemroot元素我觉得有些不好理解,思考了挺长时间,按我自己的理解解释一下,大家讨论
1
、一台计算机上只有一个启动管理器,即BCD存储中只能有一个Windows boot manager对象,此对象包含全局信息:哪个启动项是默认启动项(默认启动哪个启动环境应用程序)、启动菜单显示时间、启动项在启动菜单中的显示顺序。
2
、一台计算机上可能有多个启动加载器,对于计算机上安装的每个Windows,都有一个启动加载器。例如,如果计算机上安装了两个不同版本的Windows Vista,计算机上就有两个Windows启动加载器。所以BCD存储中可能有多个Windows boot loader对象
举例如下:
一台计算机上安装了Windows Vista Home Basic(操作系统文件安装在C:\windows)和Windows Vista Enterprise(操作系统文件安装在D:\windows)
计算机中就有了两个Windows boot loader(winloade.exe),一个位于c:\windows\system32,用于启动Windows Vista Home Basci;一个位于d:\windows\system32,用于启动Windows Vista Enterprise。
这样在BCD存储中就有了两个Windows boot loader对象,而且当在启动菜单中选择时,这两个boot loader要使用osdevice和systemroot元素找到自己对应的操作系统文件进行启动。
Osdevice
和systemroot元素也是在自定义Windows PE时经常要遇到的两个元素。
下一篇重点介绍bcdedit /set命令