blog / gadflysu

希望與熱烈的風
Talk is Cheap

  1. 1. 概述
    1. 1.1. 启动引导体系结构
    2. 1.2. 引导配置数据 (BCD)
  2. 2. 启动选项标识符
    1. 2.1. 特殊标识符
    2. 2.2. GUID
    3. 2.3. 启动选项继承
  3. 3. BCDEdit 选项参考(略)
  4. 4. 编辑启动选项
    1. 4.1. 添加新的启动项
      1. 4.1.1. 添加新的启动项
      2. 4.1.2. 调整启动菜单
      3. 4.1.3. 移除和删除启动项
    2. 4.2. 更改启动项的友好名称
      1. 4.2.1. 使用 BCDEdit
      2. 4.2.2. 使用 Bootcfg
      3. 4.2.3. 编辑 Boot.ini 文件
    3. 4.3. 更改启动参数
    4. 4.4. 更改默认启动项
    5. 4.5. 更改启动菜单超时
  5. 5. 使用启动参数(略)
  6. 6. 以前版本的 Windows 的启动选项(略)

本文根据微软文档 Tools for Changing Boot Options for Driver Testing and Debugging 写成,由于该主题部分内容可能是由机器翻译,gadflysu 在其基础上主要对「Windows 启动选项」部分内容进行完善翻译,且有改动或删减。能力受限,若有不足还请见谅。

概述

Windows 启动引导程序 (boot loader) 的体系结构包括:

  • 与固件无关的启动配置和存储系统 Boot Configuration Data (BCD)
  • 启动选项编辑工具 BCDEdit (BCDEdit.exe)。

BCDEdit 适用于 Windows NT 6(Windows Vista、Windows Server 2008 及以后的 NT 操作系统)。

ℹ️ [Note] 使用 BCDEdit 需要管理权限,且有可能导致计算机无法工作,系统配置实用工具 (Msconfig.exe) 是更改启动设置的另一种方法。

启动引导体系结构

以前的 Windows NT 启动加载程序 ntldr 现由三个组件替代:

  • Windows Boot Manager (Bootmgr.exe)
  • Windows operating system loader (Winload.exe)
  • Windows resume loader (Winresume.exe)

其中 Windows Boot Manager 是通用的,boot loader 则针对特定系统进行优化。当有多个启动项(包括 Windows)时,根目录中的 Windows Boot Manager 将启动并与用户交互,即显示启动菜单,加载用户所选择的 boot loader,并将引导参数传递给 boot loader。boot loader 位于每个 Windows 分区的根目录中。被选中后,boot loader 将接管启动进程,并根据指定的启动参数加载操作系统。

引导配置数据 (BCD)

Windows 启动选项存储在基于 BIOS 和 EFI 的计算机上的引导配置数据 (BCD) 存储区中。

BCD 提供与固件无关的通用启动选项接口,它比以前的启动选项存储配置更安全,因为它允许安全锁定 BCD 存储,并允许管理员分配管理启动选项的权限。BCD 存储使用熟悉的对象和元素体系结构,通过 GUID 和如 Default 的名称来精确标识与启动相关的应用程序。

BCD 包含自己的一组启动选项。详见 BCD 启动选项参考

启动选项标识符

很多 bcdedit 命令需要标识符 (identifiers)。标识符唯一地标识启动设置存储区中的一个条目。

显示标识符:

1
bcdedit /enum

标识符使用全局唯一的英语名称或 GUID。

特殊标识符

一些配置条目拥有容易理解的特殊 id,bcdedit 将直接显示这些 id,除非使用 /v 参数指定显示 GUID。

常见特殊标识符:

标识符 描述
{default} 指 boot manager 默认启动项
{current} 指当前正在运行的操作系统的启动项
{bootmgr} 指 Windows boot manager

关于设置选项的标识符:

标识符 描述
{globalsettings} 包含全局设置,所有启动项都应继承
{bootloadersettings} 包含 boot loader 全局设置,所有 boot loader 项都应继承
{dbgsettings} 包含全局调试器设置,可被任何启动项继承
{hypervisorsettings} 包含虚拟机管理程序 (hypervisor) 设置,可被任何 OS loader 项继承
{emssettings} 包含全局紧急管理服务 (EMS) 设置,可被任何启动项继承
{resumeloadersettings} 包含 resume loader 的全局设置,所有 Windows 从休眠状态恢复的条目都应继承
{badmemory} 包含全局 RAM 缺陷列表,可被任何启动项继承
{memdiag} 指定内存诊断应用程序条目
{ramdiskoptions} 包含 boot manager 要求 RAM 磁盘设备的附加选项

早期版本的 Windows 使用这些标识符:

标识符 描述
{ntldr} 指 OS loader (Ntldr),可用于启动 Windows Vista 以前版本的 Windows
{fwbootmgr} 指固件 (firmware) 的 boot manager,特别用于那些实现 EFI 规范的系统

GUID

GUID 具有以下格式:

1
{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

其中每个 x 表示十六进制数字,短划线 - 和大括号的位置是固定要求。由于使用 GUID 容易出错,所以建议使用英语的标识符名称配置 Windows 的启动信息,例如 {current} 等。例如:

1
{d2b69192-8f14-11da-a31f-ea816ab185e9}

使用 bcdedit /enum /v 来显示与标识符相关联的 GUID。

启动选项继承

某些启动设置可被继承,这使一组设置可用于不同的引导方案。

使用 bcdedit /enum 命令显示任何标识符所指的条目信息,条目内 inherit 显示继承信息。如下例中 {current} 条目继承 {bootloadersettings}

1
2
3
4
5
6
7
8
9
10
11
C:\>bcdedit /enum {current}

Windows Boot Loader
-------------------
identifier {current}
device partition=C:
path \WINDOWS\system32\winload.exe
description Windows 10
locale en-US
inherit {bootloadersettings}
...

使用 bcdedit /enum 命令和 inherit 选项显示有关继承的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
C:\>bcdedit /enum inherit

...

Boot Loader Settings
--------------------
identifier {bootloadersettings}
inherit {globalsettings}
{hypervisorsettings}


Resume Loader Settings
----------------------
identifier {resumeloadersettings}
inherit {globalsettings}

...

使用 bcdedit /enum all 命令以查看所有设置。

1
2
3
4
5
6
7
8
9
C:\>bcdedit /enum all

Windows Boot Manager
--------------------
identifier {bootmgr}
device partition=\Device\HarddiskVolume1
description Windows Boot Manager

...

BCDEdit 选项参考(略)

启动入口参数,或引导参数,是可选的系统特定的设置,表示配置选项。你可以为一个操作系统的启动项添加启动参数。

ℹ️ [Note] 设置 BCDEdit 选项之前,可能需要禁用或暂停 BitLocker 和安全启动。

详见 BCDEdit Options Reference

编辑启动选项

本部分讲述使用 BCDEdit 自定义启动选项的基本元素的分步过程。

BCDEdit 随操作系统自带,在命令提示符窗口键入 bcdedit /?bcdedit /? TOPICS 查看帮助。详见 BCD 启动选项参考

ℹ️ [Note] 设置 BCDEdit 选项之前,可能需要禁用或暂停 BitLocker 和安全启动。

添加新的启动项

启动项 (boot entry) 是指一组定义操作系统或可启动程序的引导配置的选项。你可以为一个操作系统设定多个具有不同启动参数的启动项。Windows Installer 在安装系统时创建了一个标准的启动项,建议不要改动之;而是添加一个单独的自定义启动项。

添加新的启动项

添加新启动项的最简单办法是,复制现有的启动项,然后根据需要修改该副本。

ℹ️ [Note] 设置 BCDEdit 选项之前,可能需要禁用或暂停 BitLocker 和安全启动。

以管理员身份打开命令提示符窗口,使用 bcdedit 命令,由 /copy 选项指定源启动项、由 /d 选项指定目标启动项(即新启动项的名字)。例如复制一个当前操作系统的启动项:

1
bcdedit /copy {current} /d "DebugEntry"

如果顺利,该命令会告诉你新启动项的标识符 (GUID),新启动项会被自动添加到启动菜单的最后一项。

使用 bcdedit 命令和 / create 选项可以创建一个启动项,但更加困难,因为你需要提供有关启动项类型的其他信息,指定 /application/inherit/device 等选项。例如创建名为 “My Windows Vista” 的新操作系统启动项:

1
bcdedit /create /d "My Windows Vista" /application osloader

如果顺利,该命令会告诉你新启动项的标识符 (GUID),但是新启动项不会被自动添加到启动菜单。你必须使用 /displayorder 选项将启动项添加到启动菜单,位置可以任定。

在命令提示符窗口键入 bcdedit /? /create 查看帮助。

调整启动菜单

使用选项 /displayorder 调整启动菜单中的启动项顺序,语法如下:

1
bcdedit /displayorder {ID} {ID} ...

ID 是启动项的 GUID 或特殊标识符(如 {current}),注意用空格分隔每个标识符,确保包含花括号 { }。例如将 DebugEntry 启动项添加到启动菜单 {current} 项之后(注意在 Windows PowerShell 中使用 '{guid}'):

1
bcdedit /displayorder {current} {49916baf-0e08-11db-9af4-000bdbd316a0}

此外使用选项 /addlast/addfirst 调整启动项顺序。例如添加 DebugEntry 启动项到启动菜单的最后一项:

1
bcdedit /displayorder {49916baf-0e08-11db-9af4-000bdbd316a0} /addlast

移除和删除启动项

使用选项 /remove 将启动项从菜单移除。例如:

1
bcdedit /displayorder {49916baf-0e08-11db-9af4-000bdbd316a0} /remove

该命令仅改动启动菜单,被移除的启动项仍在 BCD 存储中。

使用 /delete 选项将启动项从启动菜单和 BCD 存储中完全删除。例如:

1
bcdedit /delete {49916baf-0e08-11db-9af4-000bdbd316a0}

使用 bcdedit 命令且不带任何参数,BCDEdit 将显示 boot manager 条目并以启动菜单的顺序显示其中的启动项。

Windows Boot Manager 条目还包括启动菜单显示顺序 (displayorder)。

更改启动项的友好名称

Windows Boot Manager 中启动项所显示的名称由该项的 description 决定。为启动项设定一个友好的名称有助于使之与其他项区分开,一个准确描述条目的名称可以节省大量的时间和精力。

无意义名称的示范:

1
2
"Windows 10 Debug1"
"Windows 10 Debug2"

准确名称的示范:

1
2
"Windows 10 kdnet"
"Windows 10 NullModem"

ℹ️ [Note] 当基于 x86 或 x64 系统上的启动项配置了调试 (/debug /debugport) 或紧急管理服务 (EMS) (/redirect) 时,boot loader 将在启动项名称后追加一个用方括号括起来的短语([debugger enabled][ems enabled]) 。但当启动项的友好名称和前述的方括号短语合计超过 70 个字符时,启动菜单忽略方括号短语,所以请视情况缩短启动项的名称。

若要更改 Boot.ini 文件中的启动项的友好名称,可以使用 Bootcfg 或编辑 Boot.ini 文件。对于将启动选项存储在 EFI NVRAM 中的系统,使用 Bootcfg。

若要更改 Windows 的启动项的友好名称,请使用 BCDEdit。

使用 BCDEdit

使用 bcdedit 命令和 /set 选项修改启动项的友好名称。语法如下:

1
bcdedit /set <ID> description "The new description"

其中, 是启动项的标识符。

ℹ️ [Note] 如果使用 Windows PowerShell,必须在标识符两边加上引号,如 "{current}"

在复制现有的启动项时,可使用 /d 选项直接修改名称:

1
bcdedit /copy {current} /d "Windows 10 NullModem"

使用 Bootcfg

若使用 Bootcfg,启动项的友好名称只能在复制该条目时更改。使用 bootcfg 命令和 /copy 选项复制条目:

1
bootcfg /copy /ID 1 /d "Windows 10 Debug"

其中,使用 /ID 指定要复制的项的行号,/d 指定的新创建的项的友好名称。详见使用引导参数

编辑 Boot.ini 文件

在 Boot.ini 文件中,启动项的友好名称用引号标出。如:

1
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows 10 Professional" /fastdetect

直接编辑即可。

更改启动参数

若要启用并配置与启动相关的操作系统功能(如调试),必须将启动参数添加到操作系统的启动项中。

BCDEdit 可以为启动项添加配置参数,如使用 /ems/debug/dbgsettings 等选项修改全局设置,或使用 BCDEdit /set 设置单独的参数,如下例将指定的启动项启用 PAE:

1
bcdedit /set {802d5e32-0784-11da-bd33-000476eba25f} pae forceenable

使用 /debug 选项启用或禁用内核调试程序:

1
bcdedit /debug <ID> [on | off]

若未指定 ID,该命令将为当前操作系统设置。以下命令打开为启动项目,名为 DebugEntry 内核调试程序:

1
bcdedit /debug {49916baf-0e08-11db-9af4-000bdbd316a0} on

更改默认启动项

默认启动项是启动菜单超时后自动选择的项。

使用 BCDEdit 命令和 /default 选项指定默认启动项:

1
bcdedit /default <ID>

若要将默认启动项更改为早期 Windows 操作系统的 boot loader,使用 {ntldr} 作为 ID,这是 Ntldr 的保留名。

更改启动菜单超时

引导菜单在等待一定时长后自动加载默认启动项,该时长以秒为单位。

使用 BCDEdit 命令和 /timeout 选项更改默认引导菜单超时值:

1
bcdedit /timeout <timeout>

使用启动参数(略)

驱动程序开发人员和测试人员通常需要添加、删除和更改启动项的参数以在不同状况下测试驱动程序。详见官方文档

以前版本的 Windows 的启动选项(略)

Windows XP 和 Windows Server 2003 中的启动选项,详见官方文档


📖 [Ref] Microsoft Docs: Tools for Changing Boot Options for Driver Testing and Debugging

ℹ️ [More] Windows NT 6 startup process - Wikipedia

Author : gadflysu
本文采用「知识共享署名 - 非商业性使用 - 相同方式共享 4.0 国际许可协议 (CC BY-NC-SA 4.0)」进行许可。你可自由分享演绎,惟须遵照:署名非商业性使用相同方式共享不得增加额外限制
Link to this article : https://blog.gadflysu.com/post/windows-boot-options/

This article was last updated on days ago, and the information described in the article may have changed.