安装 Ubuntu 12.04 后无法启动 Windows - 错误:无效的 efi 文件路径

安装 Ubuntu 12.04 后无法启动 Windows - 错误:无效的 efi 文件路径

已解决 - 请参阅下面的更新 2(但丢失了 Windows 7 上的所有文件/程序)


我有一台笔记本电脑(华硕 X310A,我安装了 Ubuntu 12.04 与 Windows 7 并行,但我似乎在启动 Windows 7 时遇到了问题。我使用了两次启动修复,但没有结果。

启动修复信息:http://paste.ubuntu.com/1417623/

我从 GRUB 启动 Windows 7 时收到的错误是:错误:无效的 efi 文件路径

在启动管理器或菜单中,我现在有 3 个选项:2 个用于 Ubuntu(可能是因为我进行了两次启动修复)1 个 Windows 启动管理器(如果我启动它,它会打开“ASUS 预加载向导”,它让我选择重新安装 Windows,但会丢失所有以前的数据 -)

在安装 Ubuntu 之前创建分区时,我通过缩小 sda4 并添加 ext4 挂载:“\”并添加交换区域来创建新分区。安装了它,但没有用,什么都没用。所以我再次从 USB 启动 Ubuntu,删除了我创建的分区,并决定缩小 sda3 并创建分区,但这次它给了我一个选项,我可以在“\windows”或“\dos”上挂载 sda3,我忽略了它,没有选择,因为我知道它不需要挂载,然后继续创建现在的 sda7(ext4)和 sda8(交换区域)。它仍然不起作用,所以我从 USB 启动并进行了第一次启动修复,所以我现在可以启动 Ubuntu,但不能启动 Windows,但是当我通过 USB 执行此操作时,我无法更新启动修复,所以我决定从运行在硬盘上的 Ubuntu(完全更新)重新进行启动修复,但它仍然不起作用。

在 GRUB 中我看到的是这样的(在启动菜单中使用 Ubuntu 作为第一个选项进行启动时):Ubuntu,带有 Linux 3.2.0-29-generic Ubuntu,带有 Linux 3.2.0-29-generic(恢复模式)Windows UEFI 加载器 Windows 启动 UEFI bootx64.efi.bkp Windows 7(加载器)(在 /dev/sda3 上)Windows 恢复环境(加载器)(在 /dev/sda5 上)

我试过所有以“Windows”开头的,但都不起作用

请帮忙,非常感谢

更新 1

我试过:

menuentry "Windows 7" {
    insmod part_gpt
    insmod chain
    set root='(hd0,gpt1)'
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi.bkp
}

GRUB 中出现“Window 7”,当我选择它时,系统询问我是否要正常启动 Windows,我照做了,然后出现蓝屏,然后系统返回到 GRUB


更新2

所以我们基本上是这样做的,

我们在 GRUB 中选择“Windows UEFI”,然后按 F9 进入“ASUS Preload Wizard”,基本上选择语言,然后在第一个分区 (sda3)(即驱动器 C:)上重新安装 Windows 7。

我们让它通过 diskpart.exe(dos 窗口,“黑色窗口”)执行操作 - Microsoft DiskPart 版本 6.1.7601

它重新安装了 Windows 7,然后跳转到带有大图标的 Windows 7 界面,进行了更多安装,然后跳转到 ASUS - Windows 配置加载屏幕,然后 Windows 打开,执行了一些操作并自动关闭。

因此我假设它需要重新启动,于是我回到 GRUB 中的“Windows UEFI”,同样的事情发生了,它进行了一些更新然后关闭。所以我循环了大概 10 次,直到最后 Windows 7 终于正常工作了!!!

所以我回到了 Ubuntu 12.04,一切正常,我打开 Gparted 并删除了分区:sda5 - ntfs - 1.00Mio - bios_grub

并调整 sda4(驱动器“D”)的大小以使用未使用的空间

回到 Windows 检查了所有内容,我相信现在启动方面一切都很好。

但我丢失了 Windows 7 上安装的所有文件和程序。不过我在安装 Ubuntu 12.04 之前备份了所有文件,所以它们都还在。至于程序,我只需要重新安装它们。:)


答案1

我对正在发生的一些细节有点模糊,但以下是启动信息脚本输出中的一些关键点:

sda1: __________________________________________________________________________

    File system:       vfat
    Boot sector type:  Windows 7: FAT32
    Boot sector info:  No errors found in the Boot Parameter Block.
    Operating System:  
    Boot files:        /EFI/Boot/bootx64.efi /EFI/Boot/bootx64.efi.bkp 
                       /EFI/ubuntu/grubx64.efi 
                       /EFI/Microsoft/Boot/bootmgfw.efi 
                       /EFI/Microsoft/Boot/bootmgfw.efi.bkp 
                       /EFI/Microsoft/Boot/bootmgr.efi 
                       /EFI/Microsoft/Boot/bootx64.efi 
                       /EFI/Microsoft/Boot/bootx64.efi.grb 
                       /EFI/Microsoft/Boot/memtest.efi

这是您的 EFI 系统分区 (ESP),其中包含 EFI 模式引导加载程序。通常,此类文件以 结尾.efi;但是,某些 Linux 工具(例如 Boot Repair,如果我理解正确的话)会使用.bkp扩展名重命名原始 Windows 文件,并将其替换为 GRUB 副本。这似乎是一种解决某些有缺陷的 EFI 的措施,这些 EFI 会忽略通常的 NVRAM 引导加载程序列表并直接启动EFI/Microsoft/Boot/bootmgfw.efiEFI/BOOT/bootx64.efi

以下是从 GRUB 配置文件中截取的启动信息脚本输出的部分内容:

menuentry "Windows UEFI loader" {
search --fs-uuid --no-floppy --set=root CA62-F337
chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi.bkp
}

menuentry "Windows Boot UEFI bootx64.efi.bkp" {
search --fs-uuid --no-floppy --set=root CA62-F337
chainloader (${root})/EFI/Boot/bootx64.efi.bkp
}

这表明 GRUB 已配置为引导其重命名的引导加载程序;但此操作不起作用。据我所知,这些条目是正确的;但 GRUB 在其 EFI 链式加载配置中似乎相当挑剔,这些条目采用了该配置。有时在一个系统上有效的方法在另一个系统上会失败。您可以尝试编辑文件以添加类似以下内容:

menuentry "Windows 7" {
    insmod part_gpt
    insmod chain
    set root='(hd0,gpt1)'
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi.bkp
}

如果有效,请将该条目添加到您的/etc/grub.d/40_custom文件中,以便每当 GRUB 重新创建其grub.cfg配置文件时都会将其包含在内。

另一个选择是安装另一个引导加载程序或引导管理器来代替或补充 GRUB。我的第一个建议是rEFInd,但我有偏见,因为我维护它。它的优点是易于安装:下载它,提取存档,然后install.sh在 Linux 中运行脚本。不幸的是,重命名的 Windows 启动文件会带来问题,因此您必须将它们重命名为原始格式,或者在 rEFInd 文件中创建手动启动节refind.conf以启动真正的 Windows 启动加载程序。完成此操作后,当您重新启动时,您应该会看到一个 Windows 条目,如果幸运的话,它应该可以正常工作。您还将看到一个 Ubuntu 条目,它应该会启动 GRUB。

如果 rEFInd 可以工作,您可能需要考虑进一步重新配置,使 rEFInd 直接启动 Linux,而无需 GRUB。rEFInd 的文档页面介绍了此主题,其中描述了启动Linux的方法。简而言之,如果您将 Linux 内核和初始 RAM 磁盘文件复制到 ESP 的根目录或EFIESP 上的子目录中,并将refind_linux.conf包含内核选项的文件放在同一目录中,rEFInd 将能够直接启动内核。如果您稍微调整一下挂载点,rEFInd 可以检测到您何时安装更新的内核。

相关内容