修复从 Linux 启动 EFI Windows

xpt*_*xpt 4 dual-boot boot windows grub2

基本上我丢失了 Windows 8 启动选项,并且 Windows 安装介质的启动修复无法解决问题。

我知道这或多或少是 Windows 的问题,但我正在寻求一种efibootmgr解决方案,而不是使用更尴尬的基于 Windows 的bcdedit命令的解决方案。因此我在这里问而不是超级用户。

详细的背景在这里,基本上我的系统是在 BIOS/MBR/CSM 模式下初始设置的,Windows 10 拒绝安装在那里,所以我必须将我的 MBR 磁盘转换为 GPT。之后我让 Linux 端的一切都正常工作,但通过 Windows 安装介质修复 Windows 启动失败。

  • 我的所有 Linux 操作系统/分区均由 找到update-grub,但 GRUB 菜单中缺少我的 Windows 8。
  • os-prober无法列出/找到我的 Windows 8。

我希望修复方法只是使用 重新添加我的 Windows 8 作为启动项efibootmgr,但这正是我迷失并需要帮助的地方。可以在此处找到进一步详细信息(如当前分区架构)。谢谢。

也许我的 Windows 8 是以 BIOS/MBR/CSM 模式安装的,并且没有 EFI 启动功能,因为我/EFI在其中没有看到目录?以下是我的 Windows 8 分区中的所有根级目录:

$Recycle.Bin/              ProgramData/
$WINDOWS.~BT/              Programs/
$Windows.~WS/              Recovery/
BOOTNXT                    Recovery.txt
BOOTSECT.BAK               System Volume Information/
Boot/                      Tmp/
Documents and Settings/    Users/
ESD/                       Windows/
Intel/                     bootmgr
Program Files/             pagefile.sys
Program Files (x86)/       swapfile.sys
Run Code Online (Sandbox Code Playgroud)

efibootmgr或者也许我根本不需要,只需要一个自定义条目,/etc/grub.d/40_custom如下所示?

menuentry "Windows 8 BIOS MBR" {
     insmod part_msdos
     insmod ntldr
     insmod ntfs
     ntldr (hd0,msdos1)/bootmgr
}
Run Code Online (Sandbox Code Playgroud)

xpt*_*xpt 5

好的,根据 @FelixJN 的请求,这里是答案而不是链接。

我的目的是寻求一个基于 Linux 的解决方案,因为至少使用ntldr “加载 Windows”是我bootmgr过去使用的技巧。就像,这应该有效:grubgrub4dos

menuentry "Windows 8 UEFI/GPT" {
    insmod part_gpt
    insmod search_fs_uuid
    insmod chain
    search --fs-uuid --no-floppy --set=root 28cf-35de
    chainloader ($root)/EFI/Microsoft/Boot/bootmgfw.efi
}
Run Code Online (Sandbox Code Playgroud)

但我没有尝试它,因为我对 grub2 及其文档没有太多信心,而是转向 Windows 的解决方案,就像 @telcoM 总结的那样,

在 UEFI 模式下运行引导修复过程,将 Windows UEFI 引导加载程序写入 ESP 分区

以下是从此处采取的详细步骤。

  1. 将媒体 (DVD/USB) 插入 PC 并重新启动

  2. 从媒体启动。

  3. 选择修复您的计算机

  4. 选择疑难解答

  5. 从菜单中选择命令提示符:

    1. 输入并运行命令:

      diskpart
      
      Run Code Online (Sandbox Code Playgroud)
    2. 输入并运行命令:

      sel disk 0
      
      Run Code Online (Sandbox Code Playgroud)
    3. 输入并运行命令:

      list vol
      
      Run Code Online (Sandbox Code Playgroud)
  6. 验证 EFI 分区(EPS - EFI 系统分区)是否使用 FAT32 文件系统并为其分配驱动器号(分配一个尚未使用的盘符。):

  7. 输入并运行命令:

     sel vol <number of volume>
    
    Run Code Online (Sandbox Code Playgroud)
  8. 输入并运行命令:

     assign letter=<drive letter>:
    
    Run Code Online (Sandbox Code Playgroud)
  9. 输入并运行命令:

     exit
    
    Run Code Online (Sandbox Code Playgroud)
  10. 为了修复引导记录:

    1. 输入并运行命令:

      cd /d <drive letter>:\EFI\Microsoft\Boot\
      
      Run Code Online (Sandbox Code Playgroud)
    2. 输入并运行命令:

      bootrec /FixBoot
      
      Run Code Online (Sandbox Code Playgroud)

此时,所有操作系统的下一步都是相同的:

  1. 重建 BCD 存储

  2. 首先运行以下命令来备份旧的 BCD:

     ren BCD BCD.old
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在使用以下命令重新创建它:

     bcdboot c:\Windows /l en-us /s <boot letter>:All
    
    Run Code Online (Sandbox Code Playgroud)