没有自己的启动管理器就可以启动Windows 8.1吗?


10

我一直在努力想出一种在笔记本电脑上安装Windows和Linux双重引导的简便方法,而不必按此顺序进行。我们通常要做的是先安装Windows,然后安装linux,并允许GRUB处理Windows。

因此,我要努力达到的目的是找到一种绕过讨厌的安装过程(Windows)的方法,仅使用映像直接复制到驱动器中即可。这也将允许我保留启动管理器(GRUB)。(不是我以后不能恢复它,而是垄断的Microsoft策略,在这种情况下,系统中不存在其他启动管理器)。

我首先获得Windows 8.1的合法副本,然后使用VirtualBox将其安装在虚拟机上。然后,我在GPT分区硬盘驱动器上创建了NTFS分区,并将Windows分区的内容从.vdi映像复制到了新创建的分区。

当然,它还行不通。我不知道如何替换bootmgr。它给

File: \Boot\BCD
Status: 0xc000000e
Info: The Boot Configuration Data for your PC is missing or contains errors.

因为它无法从用于引导,系统恢复等的其他分区中找到该文件。

现在,我读到bootmgr最终会执行winload.exe来启动Windows。我不知道下一步该怎么做。

我认为它在理论上应该可以正常运行,因为我拥有运行Windows所需的所有文件。我还认为,我不应该是唯一想到这一点的人,因此,我在这里可能会缺少一些非常基本的东西。也许已经完成了?

我不知道引导如何工作。我设法理解的是,当您同时启动Windows和Linux时,您将Windows Bootloader链接到Linux。因此,我试图实现的目标是摆脱Windows Bootloader。

编辑

我一直在看二进制文件bootmgr\Boot\BCDbootmgr读取BCD文件并列出您的选项,从中可以选择启动。

因此,诸如执行之类的信息winload.exe驻留在BCD文件中。现在,我认为bootmgr它本身是由syslinux使用该chain.c32模块执行的。我想做的是以某种方式执行Windows引导程序,即winload.exe直接从syslinux执行(如果可能),或进行修改bootmgr以使其winload.exe自身执行(其路径将直接在bootmgr可执行文件中)而无需查找BCD或其他任何内容。

在此步骤中,休眠(需要不同的过程)对我而言无关紧要。

编辑您的问题以告诉我们固件类型,以及(如果是EFI)您是否已在固件设置中启用兼容性支持模块

我的固件是EFI(启用了CSM),通常使用GRUB引导到Arch Linux。我发现它bootmgr可以System32\winload.exe在旧系统和System32\winload.efiEFI上执行。

0.0对从这里做什么有想法。在过去的10天里,我一直在尝试对BCD进行更改,我想我即将取得成功。但这无关紧要,因为我真正想做的是完全绕开Windows Boot Manager。

如果您有任何想法,是否有办法winload.efi从EFI shell(只是一个猜测)或对GRUB的其他修改中执行该方法,以便它将在没有Chainloader的情况下以EFI模式启动Windows。

欢迎任何建议。

附录

关注论坛帖子可能会提供一些有用的见解:

http://reboot.pro/topic/19371-chainload-direct-to-winloadexe/

1。

现在,grub4dos可以链加载引导加载程序(例如NTLDR或BOOTMGR),因为它可以替代“常规”引导程序中包含的代码(例如300字节的机器代码)。

此代码仅设置了几个参数,然后调用了加载程序。

即使那样,也很难用不同的代码来理解和复制。

像BOOTMGR这样的NT系统加载器在一个.exe中或多或少具有一个“实模式”操作系统(与DOS完全不同)和用于解析纯文本和注册表配置单元的工具/工具,这是无法重新实现的从头开始轻松编写。

自从多年以来,@ ReactOS的好人正在编写FREELDR(其目标是替代更简单的NTLDR)(我相信ReactOS程序员中有些人真的很擅长)。

他们似乎(但没有明确记录)设法通过NTLDR尝试启动Server 2003。

2。

通过引入对(U)EFI的支持,BootMgr帮助抽象BIOS和(U)EFI之间的差异。例如,这是两个序列:

BIOS (PCAT) -> BootMgr { BootMgr stub -> embedded BootMgr.exe } -> WinLoad.exe -> Windows
64-bit (U)EFI -> BootMgFw.efi -> BootMgr.efi -> WinLoad.efi -> Windows

WinLoad期望存在某种环境(包括API)。BootMgr会处理此问题,因此,几乎相同的WinLoad程序将在两种环境中均可工作。

实际上,(U)EFI定义了一种用于存储和获取引导参数的方法,因此,无论BIOS /(U)EFI如何,BootMgr的BCD都可以实现相同的目的。

但是,除了BIOS和(U)EFI的不同之外,BootMgr还使您可以做出“引导选择”,而WinLoad可以引导知道如何引导的特定操作系统。

根据WinLoad预期存在的环境数量,可能可以直接调用WinLoad。迈克尔·布朗(Michael Brown)的wimboot直接调用BootMgr PE [1],因此可以直接调用WinLoad,只是WinLoad可能需要更多的环境。你可以试试看!

[1]不要与GRUB4DOS和Syslinux的chain.c32可以调用的BootMgr混淆。该BootMgr包含一个存根,该存根知道如何调用嵌入式BootMgr PE。


1
您尚未提供足够的信息。 编辑您的问题,以告诉答题者本机是否具有EFI固件或旧的PC / AT风格的固件。目前,您正在谈论EFI分区磁盘上的MBR引导程序,这(除非有人正在使用我的程序之一或H. Peter Anvin的程序)是胡说八道,而且可能不是 机器引导的方式
JdeBP 2014年

您描述的策略不会退出Microsoft确实会阻止任何人使用双重引导系统
Ramhound 2014年

@JdeBP你是对的。在某些时候,我实际上同时使用了两者。我在pc \ at方法中使用syslinux。然后,将GRUB安装到EFI分区。因此,我的笔记本电脑同时支持这两种方式,但是每次都得到相同的结果。同时,我会尽力告知自己。另一方面,您了解我正在努力实现的目标吗?忘记我之前描述的内容,也许您可​​以给我建议,不管它是否可行。
osolmaz 2014年

我并没有要求固件类型。这是至关重要的数据,您必须提供。没有它,人们甚至无法开始一个正确的答案。编辑您的问题以告诉我们固件类型,以及(如果是EFI)您是否已在固件setup实用程序中启用了兼容性支持模块。
JdeBP 2014年

@JdeBP我已经编辑了问题。
osolmaz 2014年

Answers:


5

要回答您的原始问题,不。如果不通过Windows自身的启动加载程序,则无法加载Windows(对于UEFI安装,则为bootmgfw.efi)。这是因为Windows希望该bootmanager存在并且可以调用winload.efi。如果这没有发生,则Windows将崩溃,直到您解决问题为止。这样做的原因很多(实用且无知)。通常,这是因为Microsoft编写了bootmanager来处理所有事情(加载OS,加载恢复环境,伪pre-os环境等)。当前实现任何理智的唯一方法是使用Grub-efi进行链式加载。


在我接受这个答案之前,我必须问:是很难完成这项任务吗,主要是由于欺骗该过程中涉及的任何程序所需的低级黑客数量;欺骗是Windows仍会认为它已经使用自己的bootmanager进行了引导,而实际上这又是另一回事...而且我猜想Windows的每个版本都需要单独的工作。但这并不是说不可能完成任务,只是真的很难吗?
osolmaz 2014年

3
我不会说这是完全不可能的(在编程中),但是您必须对bootmgfw.efi对Windows OS的调用进行反向工程。就时间而言,与需要反向工程对OS加载程序的低级启动协议调用相结合所涉及的低级黑客数量非常昂贵。您不仅需要让Windows相信bootmgfw.efi在那里,而且还应该使BCD存在并且它是由其自己的工具创建的,等等。
克里斯。

2

您需要将Windows EFI引导加载程序添加到UEFI固件中的引导选项列表中。这样,您将能够选择是否:

  1. 应该加载GRUB2或
  2. Windows Bootloader应该被加载

此时,其他选项(例如DVD驱动器,外部硬盘驱动器或网络启动)也应该可见。UEFI引导加载程序通常位于\EFI/boot/efi/)分区上。由于您刚刚复制Windows硬盘驱动器映像而没有正确安装Windows,因此当前计算机的EFI分区可能不包含正确的引导程序。因此有必要

  1. 将引导加载程序复制到EFI分区
  2. 将Windows作为GRUB2的启动选项添加

然后,您只需更改BIOS中的启动顺序就可以选择启动哪个操作系统。在我的笔记本电脑上,按F12会弹出一个菜单,用于选择要加载的引导程序。

对于这些步骤,我将使用efibootmgr并遵循本教程中的步骤:

您需要bootmgfw.efi\EFI\Microsoft\Boot\bootmgfw.efi/boot/efi/Microsoft/Boot/bootmgfw.efi使用Linux时将相应的文件复制到EFI分区:

# mkdir -p /boot/efi/EFI/Microsoft
# cp -r Microsoft /boot/efi/EFI/Microsoft

其中Microsoft是包含Windows版本原始EFI文件的文件夹。

然后,您需要使用以下命令将.efi文件添加到UEFI引导项中:

# efibootmgr -c -d /dev/sda -p 1 -l \\EFI\\Microsoft\\Boot\\bootmgfw.efi -L "Windows Boot Manager"

在那里,当然,你需要改变/dev/sda,并-p 1为您的磁盘设备和分区号码正确的价值观。

如果您有一台Lenovo笔记本电脑,请注意以下事项:

还要注意,至少有一个制造商(Lenovo)出厂时带有已知错误,该错误会导致系统拒绝引导,除非引导加载程序的名称是“ Windows Boot Manager”或“ Red Hat Enterprise Linux”。

然后,启动PC时应显示以下内容(如果在启动过程中按住相应的键):

Windows Boot Manager
ubuntu
USB CD
USB FDD
ATAPI CD
ATA HDD2

(etc.)

bcdedit在Windows上显示这样的:

C:\WINDOWS\system32>bcdedit /enum firmware

Firmware Boot Manager
---------------------
identifier              {fwbootmgr}
displayorder            {bootmgr}
                        {bb086763-b111-11e2-bf8e-806e6f6e6963}
                        {8e7fb978-8bc8-11e2-bf2f-806e6f6e6963}
timeout                 0

Windows Boot Manager
--------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
locale                  en-US
inherit                 {globalsettings}
integrityservices       Enable
default                 {current}
resumeobject            {ec215a09-8bc4-11e2-bf2b-0024d7eb75a4}
displayorder            {current}
toolsdisplayorder       {memdiag}
timeout                 2

(...)

Firmware Application (101fffff)
-------------------------------
identifier              {bb086763-b111-11e2-bf8e-806e6f6e6963}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\ubuntu\grubx64.efi
description             ubuntu

1
很好解释,谢谢。几天前,我已经成功完成了相同的操作,但是仍然为Windows EFI引导管理器使用单独的分区,并且通过GRUB进行链加载。现在,我了解到我也可以使用原始EPS。另外,我没有使用bcdedit,而是使用hivex修复了BCD。我打算编写一组免费工具,以便能够在Linux中操作BCD文件。但是我想要达到的目标却有所不同。如果bootmgfw.efi以某种方式执行winload.efi,为什么我不能直接从GRUB执行winload.efi?
osolmaz 2014年

哦,我明白了。因此,您要跳过加载Windows引导管理器(bootmgfw.efi),而直接通过读取BCD系统存储来直接加载Windows引导加载器(winload.efi)吗?(按照这里的定义。)有趣的是,我从未听说有人这样做。您的动机是什么,为什么必须直接加载winload.efi?另外,您是否有\EFI\Boot\Microsoft要测试的文件夹的完整副本(其中有几个文件)?
jmiserez 2014年

好吧,如果要实现这一点,我什至不需要读取BCD,只需在GRUB中为该分区添加一个条目即可。(我在这里不包括休眠和系统恢复)我的动机是,安装Windows会容易得多,而不必担心以后需要修复它。对于系统管理员,批处理安装等(对我来说^^)很有用。至于为什么直接加载winload.efi:处理封闭规范的Windows注册表文件(二进制)比处理GRUB的纯文本配置文件要麻烦得多。消除中间人会更容易。
osolmaz 2014年

1
我明白您的意思,是的,这非常方便。我想知道1)启动时是否有任何变量bootmgfw.efi传递到winload.efi,2)是否可能存在安全启动和所需的某种证书链的问题。您是否知道inherit {bootloadersettings}BCD商店中的实际含义?
jmiserez 2014年

1
3)因为我使用了hivex,所以我可以猜测对应的对象。蜂巢中有一个“全局”设置对象,所有其他对象都有对其的引用。我可以说的是,只有两个对象足以引导进入Windows:1:具有常量uuid {9dea862c-5cdd-4e70-acc1-f32b344d4795}的Windows Boot Manager对象2:包含分区信息和引导加载程序路径的对象为您的实际Windows根目录。最难的部分是理解指定分区的二进制数据结构。这主要是由wodny完成的:bitbucket.org/wodny/libbcd/src
osolmaz 2014年

0

您可以按任何顺序进行安装,即先安装GNU / Linux,然后再安装Windows或反之。

安装所有操作系统之后,只需执行以下操作。

  1. 从这里获取“启动修复盘”。http://sourceforge.net/projects/boot-repair-cd/

  2. 创建一个可启动的实时可启动USB笔式驱动器(pendrivelinux.com上的说明)

  3. 或将ISO文件刻录到CD。

  4. 通过此引导,然后按照屏幕上的说明进行操作。您将具有包含所有已安装操作系统的重新安装的GRUB。

祝一切顺利。


1
我知道,我想要的是不同的东西。我在问Windows是否可以在不进行链加载的情况下直接启动。
osolmaz 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.