我一直在尝试找到一种更简单的方法,在我的笔记本电脑上安装 Windows 和 Linux 双启动,不一定按这个顺序。我们通常要做的是先安装 Windows,然后安装 Linux,并让 GRUB 处理 Windows。
因此,我试图找到一种方法来绕过那个麻烦的安装过程(Windows),只需使用映像直接复制到我的驱动器中即可。这也允许我保留我的启动管理器(GRUB)。(并不是说我无法在之后恢复它,但这是微软的垄断政策,在这种情况下否认系统中存在其他启动管理器)。
我首先获得了 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 引导加载程序链接到 Linux 的引导加载程序。所以我试图实现的是以某种方式摆脱 Windows 引导加载程序。
编辑
我一直在查看二进制文件bootmgr
和\Boot\BCD
。bootmgr
读取 BCD 文件并列出您的选项,您可以从中选择启动。
因此,诸如执行之类的信息winload.exe
驻留在 BCD 文件中。现在,我认为bootmgr
它本身是由 syslinux 使用chain.c32
模块执行的。我想做的是以某种方式执行 Windows 引导加载程序,即winload.exe
直接从 syslinux 执行(如果可能),或者进行修改,bootmgr
以便它winload.exe
自己执行(其路径将直接位于bootmgr
可执行文件中),而无需查找 BCD 或其他任何内容。
在这一步,我并不关心休眠(需要不同的程序)。
编辑您的问题以告诉我们固件类型,以及(如果是 EFI)您是否在固件设置中启用了兼容性支持模块
我的固件是 EFI(启用了 CSM),我通常使用 GRUB 启动 Arch Linux。我发现它可以在旧系统和EFI 上bootmgr
执行。System32\winload.exe
System32\winload.efi
我知道0.0
接下来该怎么做。在过去的 10 天里,我一直在尝试更改 BCD,我想我即将成功。但那无关紧要,因为我真正想做的是完全绕过 Windows 启动管理器。
如果您知道是否有办法winload.efi
从 EFI shell 执行该操作(只是猜测),或者对 GRUB 进行其他修改,以便它可以在没有链式加载器的情况下以 EFI 模式启动 Windows。
欢迎提出任何建议。
附录
以下论坛帖子可能会提供一些有用的见解:
http://reboot.pro/topic/19371-chainload-directly-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 定义了一种存储和获取启动参数的方法,因此 BootMgr 的 BCD 涵盖相同的用途,无论 BIOS/(U)EFI 如何。
但除了 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
回答你最初的问题,不行。Windows 无法在不经过其自己的引导加载程序的情况下加载(在 UEFI 安装的情况下,是 bootmgfw.efi)。这是因为 Windows 期望引导管理器存在并且调用 winload.efi。如果这没有发生,那么 Windows 将崩溃,直到你解决问题为止。造成这种情况的原因有很多(实际和无知)。主要是因为 Microsoft 编写了引导管理器来处理所有事情(加载操作系统、加载恢复环境、伪预操作系统环境等)。目前实现任何看似合理的唯一方法是使用 Grub-efi 进行链式加载。
答案2
您需要将 Windows EFI 引导加载程序添加到 UEFI 固件中的引导选项列表中。这样,您将能够选择是否:
- 应该加载 GRUB2 或
- 应该加载 Windows Bootloader
此时还应显示 DVD 驱动器、外部硬盘驱动器或网络启动等其他选项。UEFI 引导加载程序通常位于\EFI
( /boot/efi/
) 分区上。由于您刚刚复制了 Windows 硬盘驱动器映像而没有正确安装 Windows,因此当前机器的 EFI 分区可能不包含正确的引导加载程序。因此有必要
- 将引导加载程序复制到 EFI 分区
- 将 Windows 添加为与 GRUB2 一起的启动选项
然后,您只需更改 BIOS 中的启动顺序,即可选择要启动哪个操作系统。在我的笔记本电脑上,按下F12会弹出一个菜单,供您选择要加载哪个引导加载程序。
对于这些步骤,我将使用efibootmgr
并按照本教程:
您需要将相应的文件复制bootmgfw.efi
到 EFI 分区\EFI\Microsoft\Boot\bootmgfw.efi
,或者/boot/efi/Microsoft/Boot/bootmgfw.efi
在使用 Linux 时:
# 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
为磁盘设备和分区号的正确值。
如果您有联想笔记本电脑,请注意以下几点:
还要注意,至少有一家制造商(联想)在发布产品时存在已知错误,该错误会导致系统拒绝启动,除非引导加载程序的名称是“Windows Boot Manager”或“Red Hat Enterprise Linux”。
启动您的电脑时应该会显示类似这样的内容(如果您在启动过程中按住相应的键):
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
答案3
您可以按任何顺序进行安装,即先安装 GNU/Linux,然后安装 Windows,反之亦然。
安装所有操作系统后,只需执行以下操作即可。
从这里获取“启动修复盘”。http://sourceforge.net/projects/boot-repair-cd/
创建一个可实时启动的 USB 笔式驱动器(pendrivelinux.com 上的说明)
或者将 ISO 文件刻录到 CD。
通过此启动并按照屏幕上的说明进行操作。您将获得一个重新安装的 GRUB,其中包含所有已安装的操作系统。
一切顺利。