2012-11-28 00:37:29 +0000 2012-11-28 00:37:29 +0000
32
32

如何使用BCDEdit來雙引導Windows安裝?

设置不同安装的 Windows 之间的双启动所需的 bcdedit 命令是什么?5

背景

我最近将 Windows 8 安装到一个单独的硬盘上1。现在安装了 Windows 8,我想双启动回到 Windows 7。

我有两个硬盘。

C:\WINDOWS\system32>bcdedit

Windows Boot Manager
--------------------
identifier {bootmgr}
device partition=\Device\HarddiskVolume2
description Windows Boot Manager
locale en-US
inherit {globalsettings}
integrityservices Enable
default {current}
resumeobject {ce153eb7-3786-11e2-87c0-e740e123299f}
displayorder {current}
toolsdisplayorder {memdiag}
timeout 30

Windows Boot Loader
-------------------
identifier {current}
device partition=C:
path \WINDOWS\system32\winload.exe
description Windows 8
locale en-US
inherit {bootloadersettings}
recoverysequence {ce153eb9-3786-11e2-87c0-e740e123299f}
integrityservices Enable
recoveryenabled Yes
allowedinmemorysettings 0x15000075
osdevice partition=C:
systemroot \WINDOWS
resumeobject {ce153eb7-3786-11e2-87c0-e740e123299f}
nx OptIn
bootmenupolicy Standard
hypervisorlaunchtype Auto

所以你可以看到我有两个硬盘,其中有Windows的分区。

  • Windows 7\PhysicalDisk0 (分区 03)
  • Windows 8\PhysicalDisk2 (分区1)

我想弄明白的是,如何使用bcdedit来指示启动Windows的东西,外面还有另一个Windows安装。

现在运行bcdedit,它显示当前配置。

>bcdedit /create /d "The old Windows 7" /application osloader

我找不到任何关于Windows Boot ManagerWindows Boot Loader的区别的[文档](http://technet.microsoft.com/en-us/library/cc709667(v=ws.10).aspx)。

文档

有一些关于Bcdedit的文档。

但他们没有解释如何编辑二进制引导配置数据。

如果要我猜的话,我会认为Windows Boot Manager指示BIOS应该运行什么_程序。该程序会给用户提供一组启动选择。那就剩下Windows Boot Loader是一个特定的启动选择,它代表了Windows的特定安装。

如果是这样,我需要创建一个新的Windows Boot Loader条目。

这意味着我可能需要使用 /create 参数:

/create

创建一个新的引导条目。

bcdedit [/ store filename] / create [id] / d description [/ application apptype | / inherit [apptype] | / inherit DEVICE | / device ] 。

所以我假设语法为:

Apptype Description
BOOTSECTOR The boot sector application
OSLOADER The Windows boot loader
RESUME A resume application

其中application可以是以下类型之一。

>bcdedit /create /D "Windows Vista" /device "The Quick Brown Fox"

不幸的是,关于osloader的唯一文档是“Windows引导加载器”。我不明白这如何区分一个硬盘上的Windows 8和另一个硬盘上的Windows 7

/create一个启动加载器时,另一个可能的参数是

不幸的是,/device的文档缺失。

/device

可选。如果id没有被设置为一个众所周知的标识符,那么这个选项就会被用来指定新的引导条目作为一个额外的设备选项条目。

由于我没有将 id 设置为众所周知的标识符,我必须将 /device 设置为 “用于指定新的启动项作为额外设备选项项的选项”。我知道所有这些单词,它们都是英文的。但我不知道它在说什么;这些词的顺序似乎是无意义的。

所以我有点受阻。我不想像 微软的 Dan Stolts,他为了使用 BCDEdit 而毁掉了自己的硬盘

当我用BCDEdit玩弄我的机器时,我没有找到特别有用的内容。如果这个帖子能有更多的细节,特别是在/set命令OSDevice等方面,那就可以了。所以,一旦我把我的机器修好了,我就把解决方法记录下来,信息是 这里…

我的意思是,如果一个微软的家伙连如何使用BCDEdit编辑他的BCD都搞不清楚,那我还有什么机会?

Bonus Reading

脚注

  • 1 由于Windows 8安装程序会破坏我的Windows 7安装。我决定在安装过程中拔掉我的“主”硬盘的插头。这是一个长篇大论的解释,为什么Windows 8安装程序没有检测到现有的Windows 7安装。通常情况下,安装程序会自动创建双启动所需的条目。并不是说我问这个问题的原因很重要。
  • 2 真的有三个硬盘,但第三个只是大容量存储。第三块硬盘的存在与问题无关。我只是为了防止有人想知道为什么截图有3个硬盘,而我只提到了两个。
  • 3 我随意地从“0”开始给分区编号;并不是暗示分区从0开始编号。我之所以提到分区,是因为我不明白,如果不知道Windows的安装在哪个分区和哪个文件夹里,任何一个启动加载器都无法完成它的工作。
  • 4 我问的是BCDEdit。我试过Visual BCD Editor。它似乎是一个视觉BCD编辑器。這也就是說,它是一個 GUI,但是 仍然使用和 BCDEdit 相同的术语,并且需要相同的知识,而 BCD 没有记录。
  • 5 為了簡單起見,我們假設所有我想要雙開機的 Windows 都是 Windows Vista 或更高版本,使它們都能與 BCDEdit 和二進位開機載入器相容。另一种选择则需要深入研究旧的ntloader的复杂性。我也不是在问双启动到Linux;或者如何启动到虚拟硬盘(vhd)镜像。只是在同一台机器的现有硬盘上安装现代版本的Windows。

答案 (7)

16
16
16
2012-11-28 10:16:25 +0000

这不是对 “背景 "之前问题的直接回答,而是指出了一个替代的解决方案,用于创建启动两个(和多个)Windows Vista和更高版本操作系统的加载器条目。

请参见我在下面的第二个答案,关于Visual BCD中使用的术语的批评

没有guids、devices、objects、elements等等。

我的背景 (如果不感兴趣,请跳到下面的解决方案):

我已经实现了Visual BCD Editor。

在实现过程中,我不得不阅读所有关于bcdedit和WMI BCD Provider接口(编程接口,可以用C++、C#)的可用资源。微软的文档真的很差。

在BCD中,有一些对象(加载器、设置、设备元素)。尽管存在依赖关系,但没有任何关于对象之间连接的文档。

在Windows 7中,BCD对象有超过140个(!)元素(属性)。我不知道一些元素的含义–根本没有文档。

在Windows 8中,有一些新的元素–我想现在的总数已经接近180个了(!)。没有文档。

另一方面,有两个非常强大的工具可以用来操作BCD:bcdboot和reagentc。

bcdboot - 创建/修复默认的加载器,同时也创建/修复 BCD 和整个启动环境 !

reagentc - 安装/卸载恢复环境(winre.wim)

这两个工具也没有很好的文档。

替代解决方案:

几乎不需要bcdedit,因为只用bcdboot就可以为Windows Vista和以后的Windows操作系统创建加载器–你为最早的操作系统创建加载器,而不是为最新的操作系统创建加载器,这样你就为双/多启动系统创建了启动环境。

假设你在 Windows 8:

1.bcdboot f:\windows (如图所示,这映射到 Windows 7)

2.bcdboot c:\windows (这映射到 Windows 8)

**Done ! 启动环境(和BCD)应该总是在[第一块磁盘+活动分区]。

最后但并非最不重要的是bootsect实用程序,用于写入MBR和PBR(主盘和分区启动记录)–现在是Windows 8的标准配置(以前只有WinRE中才有)。

所以,只使用bootsect和bcdboot就可以创建/修复双启动系统的所有启动实体。

我想在许多互联网网站上,甚至在Microsoft.com上,对Vista和更高版本的启动过程都有很好的描述。

注:

关于Windows BCD最好的网站之一是Geoff Chappell的网站 -那里有比Microsoft.com更详细的信息。有兴趣的用户可以在那里找到相当有用的信息和一些关于bcdedit文档的关键性说明。

10
10
10
2013-03-07 10:54:28 +0000

当我格式化我的C:驱动器以重新安装Windows时,主引导记录被删除,Windows 7安装程序未能恢复它。我可以使用像Visual BCD编辑工具这样的GUI bcdedit工具,但为什么我必须安装一些东西,而在bcdedit中应该有一个简单的命令可以完成这项工作?在通过在线帮助文件进行了大量搜索之后,我放弃了bcdedit,并在这里找到了埋藏在题外话中的答案。要为第二个分区创建一个启动条目,你必须使用bcdboot

假设你在C:\Windows:

  1. bcdboot e:\windows
  2. bcdboot c:\windows 当您重新启动时,您将看到Windows启动菜单,其中有两个Windows 7的条目。如果你选择了启动到C:\Windows的条目,你可以重命名这个分区的条目。
  3. bcdedit /set {current} description "Windows 7 (Partition 1)" 这使得启动时启动的操作系统成为启动菜单中的默认条目。
  4. bcdedit /default {current} 这将启动时的默认操作系统置于启动菜单的第一项
  5. bcdedit /displayorder {default} /addfirst 或者你可以将启动时的操作系统作为启动菜单的第一项。
  6. bcdedit /dispalyorder {current} /addfirst 现在重启并选择启动菜单中的第二项,它应该被标记为 “Windows 7"。一旦启动到E:\Windows,重命名启动时启动的操作系统。
  7. bcdedit /set {current} description "Windows 7 (Partition 2)" 测试启动菜单是否正常,并将bcd数据保存到一个没有安装操作系统的分区。
  8. bcdedit /export D:\Saved_BCD_Settings\SavedBCD 如果你后来搞砸了,你可以用以下方法恢复bcd启动菜单: 9:
  9. bcdedit /import D:\Saved_BCD_Settings\SavedBCD
5
5
5
2012-12-02 01:36:13 +0000

对原始问题中关于在Visual BCD中使用与微软的bcdedit相同的术语的批评的一些说明

BCD概念是由微软开发的。它有自己的术语。我不认为我可以改变它。我只能扩展它。

微软给出了两种访问/编辑BCD的方式:

1.使用bcdedit.exe–命令行界面 2. BCD WMI提供者接口–编程接口

这两种接口都是关于BCD对象和元素的。这是一个通用的概念,在编程/计算机和其他人类领域同样使用。我们甚至可以到哲学中去,哲学使用对象、属性和关系的术语来描述世界和宇宙。

BCD WMI提供者的访问更加灵活,因为它给程序员提供了访问BCD中的每一个对象和元素并对它们进行自由操作的可能性。

Visual BCD充分利用了BCD WMI提供者接口,实现了与我们习惯使用regedit.exe访问Windows注册表一样的访问方式。此外,该工具还能自动完成两项主要任务–创建加载器和双启动修复没有其他工具能提供这样的一键自动功能。我想说这是新的术语和新的抽象水平。我不会改变微软创造的基础,我只能在此基础上发展。

新手用户只需点击一个按钮,一个复杂的操作就可以完成 ! 不需要任何背景知识 ! 你甚至不需要知道你安装了多少个Windows版本–如果BCD中还没有相应的加载器,该工具会尝试找到所有的版本,然后为它们创建加载器–所使用的术语–“创建丢失的Windows加载器 ”–我想每个讲英语的人都能理解/点击/确认这样的操作,或者我错了?

BCD中的对象和元素的复杂性是很自然的,因为这个概念涵盖了启动新的和旧的Windows操作系统以及外国的操作系统,如Linux,Unix等。此外,它是一个通用的概念,适用于各种设备上的MBR启动和EFI启动。

BCD最复杂的部分是设备概念。你有分区设备、ramdisk设备、文件设备、定位设备–你必须花一些时间去理解它,我想这不是普通Windows用户能理解的。论坛上到处都是关于磁盘分区的问题,这是个远没有那么复杂的话题。例如,许多Windows用户甚至不知道主分区和逻辑分区之间的区别。如果你想双机/多机启动,你就必须了解分区。如果你想建第二套房子,你就得买地。

BCD的概念从Vista开始就没有变过–只是在Windows 7/8中定义了新的元素。

我认为选择BCD的注册表结构是因为Windows已经实现了这个接口,而且它是一个可靠的事务性接口,经过多年的工作验证。如果Windows注册表的概念总体上是一个好的或坏的概念是另一个话题。

程序员/开发者要创造一个更友好的界面。我一开始就给出了同样的界面–相当于bcdedit的GUI–以后可以根据使用模式在更高层次上抽象出界面。已经实现了BCD的结构化视图。这是基本的抽象层。

下一层的抽象将是集中在对象之间的关系上,因为微软没有涉及这个主题。这不是一件容易的事。新的术语伴随着抽象而来。

3
3
3
2017-12-19 10:14:27 +0000

虽然是老问题,但我还是想补充一下答案,因为上面的几个答案包含了不正确的信息。它们可能是可行的,但你肯定不需要外部程序,甚至不需要bcdboot来做。作为参考,正确的信息如下。

如果你是新手,请使用快速BCD背景

BCD是Windows的启动配置。它包含了许多部分,每个部分都有一个名称(称为 “描述")和一个标识符,看起来有点像这样。”{0743bb44-fda6-11e3-90c8-e3ee27f3aec6}“.

有几个 "众所周知的标识符",bcdedit会在可能的情况下使用这些标识符(除非你使用/v (verbose)选项的/enum),它们看起来是这样的:”{0743bb44-fda6-11e3-90c8-e3ee27f3aec6}“。它们看起来像这样。”{bootmgr}“, ”{memdiag}“. 这些只是完整标识符的速记名,但更容易操作。你可以使用其中之一。

你可以用下面的命令列出这些部分("all "是可选的,但如果没有它,你不会看到完整的列表):bcdedit /enum all

典型的输出。

C:\Windows\system32>bcdedit /enum all

Windows Boot Manager
--------------------
identifier {bootmgr}
device partition=\Device\HarddiskVolume1
description Windows Boot Manager
locale en-US
inherit {globalsettings}
default {current}
resumeobject {92b1a1b0-c023-11e3-b3f1-ec4d94108574}
displayorder {current}
toolsdisplayorder {memdiag}
timeout 30

Windows Boot Loader
-------------------
identifier {current}
device partition=C:
path \Windows\system32\winload.exe
description Windows 7
locale en-US
inherit {bootloadersettings}
recoverysequence {92b1a1b2-c023-11e3-b3f1-ec4d94108574}
recoveryenabled Yes
osdevice partition=C:
systemroot \Windows
resumeobject {92b1a1b0-c023-11e3-b3f1-ec4d94108574}
nx OptIn

同样,为了方便识别设备,它将使用类似\Device\HarddiskVolume2的格式,但如果分配了一个分区,它将通过其字母("C:")识别分区。

/enum all产生的列表开始有一个可选的固件引导管理器部分(如果你的主板有EFI)。它的简写名称是”{fwbootmgr}“。它控制了初始的EFI启动选择(是使用通常的Windows启动管理器,还是使用特定的设备),一般来说,你可以忽略{fwbootmgr}。一般来说,如果存在{fwbootmgr},你可以忽略它。

下面是"Windows启动管理器 ”(标识符“{bootmgr}”)。这是你将使用的一个。它包含了基本菜单的配置,或者你在启动时得到的其他任何东西(如果Windows Boot Manager在工作,并且它能首先找到BCD的话)。

{bootmgr}下面是任何数量的 “Windows Boot Loader "部分,可能还有其他部分,每个部分都控制一个操作或启动选项。

使用 bcdedit 设置双启动 (你不需要任何其他东西)

要进行双启动,你需要告诉 bcdedit /copy一个已知的好的 Windows Boot Loader 条目给你的第一个操作系统。

  • /copy 复制一个现有的条目
  • {current} 是你要复制的条目的**标识。它是当前启动项的快捷方式。如果这不是你想要的双启动项,请为你想要的项使用正确的标识符。每个条目的描述文字将帮助找到你想要的条目。
  • /d "Description for copied entry 将是新项目的描述

它将复制该条目,给它所述的描述,并以它给副本的新标识符来回应。

bcdedit /copy {current} /d "Copy of my current Windows Boot Loader"

The entry was successfully copied to {5599a3fc-e4ee-11e7-a5f3-c86000d0b92a}.

这样就创建了一个独立的、有正确名称的条目,现在你需要告诉它该怎么做。由于在最近的操作系统中几乎没有什么变化,你可以直接将设备和osdevice设置为你的Win7分区,这可能会奏效。如果需要的话,可以看看正常启动到Win7时/enum的输出,然后复制它似乎期望的条目。不过通常给你的第2个操作系统临时分配一个字母就可以了,比如 "Q",然后命令是:bcdedit /set {NEW_IDENTIFIER} device partition=Q:之类的,osdevice也是一样的,bcdedit会整理出驱动字母,见下图。bcd中用过后就可以删除临时的驱动器字母了。

接下来用bcdedit /displayorder {NEW_ID} /addlast把它添加到{bootmgr}中的条目列表中,并且–关键是–用bcdedit /set {bootmgr} displaybootmenu Yes告诉bcd显示一个启动菜单。

完成。

注意–在BCD中使用 "奇数 "或 "错误 "的驱动器字母是安全的,如果/enum的输出包含这些字母也是安全的。

要说明的是,你不需要担心你的新设备在 "应该是C: "的情况下被识别为Q:(或者不管它是什么)。bcdedit存储的是硬盘ID,而不是字母。它纯粹是接受并显示 Q: 来帮助你。如果一个设备有一个字母,它会默认显示字母而不是设备ID,以方便你。你可以通过在DISKPART或DISKMGMT.MSC中删除或指定第2个OS中的字母来看到这一点,并且/enum的输出将立即恢复到一个\Device代替。它实际上保存了正确的硬盘ID,当它被用来启动时,Windows将找到该设备–字母是为了方便,而不是实际保存。

3
3
3
2012-11-28 02:57:24 +0000

你需要一个BCDEdit /set命令来配置启动卷。然后通过调用BCDEdit /displayorder命令将该条目添加到Windows Boot Manager操作系统菜单中。

bcdedit /set {ntldr} device boot

它将识别其他操作系统的分区或以下命令

bcdedit /set {ntldr} device partition=C:

以下一行通过将条目添加到菜单中使其可启动

bcdedit /displayorder {ntldr}。/

您可以通过运行命令bcdedit /enum ACTIVE并查找Windows Legacy OS Loader条目来验证新条目是否会出现在启动菜单上。

注意

: */create命令用于将非微软操作系统添加到引导加载器条目中。 *

关于更多的信息,你可以阅读这个 源文章


关于你的问题 “Windows Boot loader 和 Boot manager之间的区别”

来自 wikipedia

Windows NT 启动过程在计算机找到 Windows boot loader 时启动,Windows 操作系统的一部分负责找到 Microsoft Windows 并启动它。在IA-32或x64系统上,启动加载器被称为Windows Boot Manager(BOOTMGR)。然而在Windows Vista之前,启动加载器是NTLDR。

也请参见 technet


Visual BCD Editor 是Windows bcdedit实用程序的高级GUI版本。

它是第一个实现完全编辑Windows 7/Vista启动配置数据(BCD)存储的GUI工具。 下载页面用于可视化的BCD编辑器。

试试工具中的修复选项。

2
2
2
2013-09-29 04:16:20 +0000

针对作者在评论中重申的具体问题(尽管它与他最初提出的关于bcdedit.exe序列的问题有所不同)。

也许几乎和msconfig一样简单,只是它可以让你浏览到另一个Windows安装程序,它会为你添加它。 EasyBCD 正是你要找的东西(个人免费使用)。它是一个Windows的可视化双启动管理工具,添加一个新的Windows条目是用一个点和点击, 就像你描述的那样

网上有很多关于EasyBCD的资源,这里就不一一重复了。基本上EasyBCD包揽了bcdedit.exe的复杂性,并通过自己的bootloader模块进行扩展,让你可以设置与其他(较新或较旧)版本的Windows,以及Linux、BSD等的双启动。

完全披露:我是EasyBCD的主要作者。

-1
-1
-1
2017-11-17 00:12:31 +0000
bcdedit
bcdboot
bcdedit /create

这可以指向一个像.vhd文件一样的文件,但作为一个分区diskpart创建并初始化和附加,或者在飞行中挂载并作为一个操作系统重新启动。操作系统可以隐藏在另一个分区里面。另一个分区可以隐藏在另一个分区里面,操作系统也可以隐藏在里面。当你运行bcdedit被指向另一个.vhd文件时,无论它在哪里。它就会加载起来。我的老师在课堂上展示了这一点,但失败或拒绝给bcdedit另一个解释。但这可以隐藏和操作功能齐全的操作系统。

  1. bcdboot e:\windows
  2. bcdboot c:\windows