带有 Insyde H2O EFI bios 的 Sony VAIO 无法启动到 GRUB EFI

带有 Insyde H2O EFI bios 的 Sony VAIO 无法启动到 GRUB EFI

我买了一台新的 Sony Vaio S 系列笔记本电脑。它使用 Insyde H2O BIOS EFI,尝试在其上安装 Linux 让我抓狂不已。

root@kubuntu:~# parted /dev/sda print
Model: ATA Hitachi HTS72756 (scsi)
Disk /dev/sda: 640GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start  End    Size    File system  Name                          Flags
 1      1049kB  274MB  273MB  fat32        EFI system partition          hidden
 2      274MB  20.8GB  20.6GB  ntfs        Basic data partition          hidden, diag
 3      20.8GB  21.1GB  273MB  fat32        EFI system partition          boot
 4      21.1GB  21.3GB  134MB                Microsoft reserved partition  msftres
 5      21.3GB  342GB  320GB  ntfs        Basic data partition
 6      342GB  358GB  16.1GB  ext4        Basic data partition
 7      358GB  374GB  16.1GB  ntfs        Basic data partition
 8      374GB  640GB  266GB  ntfs        Basic data partition

令人惊讶的是,磁盘上有 2 个 EFI 系统分区。sda2 分区是一个 20gb 的恢复分区,它使用基本恢复界面加载 Windows。按下“ASSIST”按钮(而不是普通电源按钮)即可访问。我推测 sda1 EFI 系统分区 (ESP) 加载到此恢复中。

sda3 ESP 为 Microsoft Windows 提供了更多充实的条目,实际上可以进入 Windows 7(Windows 上的 bcdedit.exe 证实了这一点)。Ubuntu 安装在 sda6 上,安装时我选择 sda3 作为启动分区。安装程序正确创建了 sda3/EFI/ubuntu/grubx64.efi 应用程序。

真正的问题是:我无论如何都无法将其设置为默认值!我尝试创建一个调用 grubx64.efi 的 sda3/startup.nsh,但没有帮助——重新启动时,系统仍然启动到 Windows。我尝试使用 efibootmgr,结果显示它有效:

root@kubuntu:~# efibootmgr 
BootCurrent: 0000
BootOrder: 0000,0001
Boot0000* EFI USB Device
Boot0001* Windows Boot Manager
root@kubuntu:~# efibootmgr --create --gpt --disk /dev/sda --part 3 --write-signature --label "GRUB2" --loader "\\EFI\\ubuntu\\grubx64.efi" 
BootCurrent: 0000
BootOrder: 0002,0000,0001
Boot0000* EFI USB Device
Boot0001* Windows Boot Manager
Boot0002* GRUB2
root@kubuntu:~# efibootmgr
BootCurrent: 0000
BootOrder: 0002,0000,0001
Boot0000* EFI USB Device
Boot0001* Windows Boot Manager
Boot0002* GRUB2

然而,正如您所猜测的,重新启动后,机器直接重新启动回 Windows。

我唯一能想到的是:

  1. sda1 分区不知为何被占用
  2. 用 grubx64.efi 覆盖 /EFI/Boot/bootx64.efi 和 /EFI/Microsoft/Boot/bootmgfw.efi [但这似乎非常激进]。

有人能帮帮我吗?谢谢——任何帮助我都会非常感激,因为这个问题让我抓狂了!

答案1

我最终解决了这个问题。我用 grub64.efi 替换了 EFI/Microsoft/boot/bootmgfw.efi。我将前者重命名为 bootmgfw.efi.old,并使用 grub 添加菜单选项以将其链式加载到其中。

这意味着固件被硬编码为查找 Microsoft Windows 引导加载程序,并且不遵守 efibootmgr 设置或 startup.nsh。这真的很糟糕。

我发现了 Sony EFI 启动过程的工作原理:

  1. 查看 /EFI/Microsoft/Boot/fwbootmgr.efi;如果存在,则启动它。
  2. 在 /EFI/ 的所有子目录中查找 grubx64.efi。如果存在,则启动它。
  3. 启动/EFI/Boot/bootx64.efi
  4. 显示错误消息,例如“未找到操作系统”。

在 Linux 下,efibootmgr 工具确实可以工作,但它会显示很多自动生成的无意义的信息,包括您使用的最后一个 USB 驱动器。

以下是我了解到这一切的过程:

  1. 我打开了我的新机器并折叠了 Windows 分区以便并排安装 Linux 和 Mac。
  2. 我安装了 Ubuntu 12.10,安装程序覆盖了 fwbootmgr.efi,备份了旧的 Windows 引导加载程序。
  3. 我恢复了旧的 Windows 引导程序,但除了 Windows 之外无法启动任何东西。
  4. 我将 Windows 引导加载程序重命名为一个虚假的名称,然后 Grub BL 接管了它。
  5. 我将 ubuntu 目录重命名为其他名称,但 Grub 仍然加载,即使我已经安装了 rEFInd。
  6. 让 rEFInd 做我想做的事情的唯一方法是这样的:

  7. 将 fwbootmgr.efi 移动到其父目录;rEFInd 仍会找到它,并且 Windows 不会抱怨您重命名了它。

  8. 将 grubx64.efi 重命名为 rfgrubx64.efi 或其他可识别的名称。
  9. 将 rEFInd 从 /EFI/refind 复制到 /EFI/boot,将 /EFI/refind_x64.efi 重命名为 *.bak,最后将 /Boot/refind_x64.efi 重命名为 bootx64.efi。现在您应该能够从 rEFInd 启动 Windows BL 或 GRUB。我计划将我的 MacOS 安装升级到 Clover,并从 rEFInd 加载 Clover。

(也许可以使用 Windows 启动管理器来完成所有这些工作,但根据我的经验,EeasyBCD 的 EFI 支持仍然很混乱。我暂时不愿意再碰它。)

答案2

首先,您没有两个 ESP。ESP 是一个分区,其分区类型代码为 C12A7328-F81F-11D2-BA4B-00A0C93EC93B,parted 将其标识为设置了“启动标志”的分区。您的输出表明只有 /dev/sda3 设置了“启动标志”,因此您只有一个 ESP -- /dev/sda3。在 GPT 下,分区可以有名称,并且您有两个名为“EFI 系统分区”的分区,但这些名称仅用于人工识别目的。因此,我猜您(或某些自动实用程序)创建了一个 /dev/sda1,目的是使其成为 ESP,但设置其分区类型代码时出现错误,或者某些其他实用程序错误地将其类型代码从 C12A7328-F81F-11D2-BA4B-00A0C93EC93B 更改为其他内容。

有多种方法可以纠正此问题。最简单的方法是更改​​ /dev/sda1 的名称以避免混淆。如果您认为 /dev/sda1 毫无用处,您可以备份并删除它。这样可以将其移除并避免混淆,但当然,您将有 273 MB 的未使用磁盘空间。或者,您可以将空间用于其他用途,如有必要,更改名称和类型代码以避免混淆。EFI 明确允许多个 ESP,因此您可以更改类型代码(例如,通过使用 parted 设置“启动标志”)并使用两个 ESP;但这可能会造成混淆。

这个问题可能与您无法启动 Linux 无关,因为听起来所有相关文件都在 /dev/sda3 上。我认为这个问题有几个可能的原因:

  • 可能是您在 efibootmgr 命令中输入了错误。我没有看到任何明显的拼写错误,但如果 GRUB 二进制文件不在您指定的位置,则该命令将不起作用。“--gpt”和“--write-signature”选项几乎肯定是不必要的,并且可能会导致问题,但很可能不会。
  • 您的固件可能存在错误,导致 efibootmgr 命令的效果是暂时的。尝试重新启动,然后输入“sudo efibootmgr -v”以查看您创建的条目是否在重新启动后仍然存在。
  • 您的固件可能存在错误,导致引导顺序变量被忽略。我有一块这样的主板;它按照引导条目的创建顺序进行引导,而不是按照 BootOrder 变量指定的顺序进行引导。要解决此错误,您必须删除所有条目并按照要使用的引导顺序重新创建它们。
  • 您的 grubx64.efi 二进制文件可能已损坏,以致固件拒绝启动它,因此它继续执行启动顺序中的下一个项目。

您可以尝试调整 efibootmgr 命令、找到新的二进制文件或诸如此类的方法,以测试这些可能性。如果其他方法都失败了,我建议您执行以下操作:

  1. 使用 efibootmgr 或您的固件删除所有启动项(如果它提供了执行此操作的接口)。
  2. 将 grubx64.efi 复制到 ESP 上的 EFI/Boot/bootx64.efi。
  3. 如果重新启动时仍然出现 Windows,请将 EFI/Microsoft/Boot/bootmgfw.efi 重命名为 EFI/Microsoft/bootmgfw.efi。

这应该会让 GRUB 使用引导加载程序的默认名称 (EFI/Boot/bootx64.efi) 进行引导。这样做的一个问题是 GRUB 可能没有适用于 Windows 的有效条目。您可以手动创建一个;像这样的条目应该可以工作:

menuentry "Windows 7" {
    set root='(hd0,gpt3)'
    chainloader /EFI/Microsoft/bootmgfw.efi
}

或者你可以安装改装或者重新索引作为 EFI/Boot/bootx64.efi。请注意,其站点提供的 rEFIt 二进制文件不适用于基于 UEFI 的 PC;您需要使用 Ubuntu 存储库中的版本。rEFInd 是 rEFIt 的一个分支,修复了许多错误并进行了更新,包括更好的 UEFI 支持。(rEFIt 似乎在大约两年前就被放弃了。)因此,我建议使用 rEFInd 而不是 rEFIt——但我是 rEFInd 的维护者,所以我不是这方面的独立观察者。不幸的是,据我所知,rEFInd 尚未包含在 Ubuntu 存储库中,因此您必须手动下载并安装它。

答案3

新的索尼 vaio e 系列的起始位置相同。感谢 Rod 的回答。

万一有人需要演练,这对我有用:

通过 USB 安装了 ubuntu 12.04 以及 win7。

从实时会话安装/dev/sda3

  • 将 EFI/ubuntu/grubx64.efi 复制到 EFI/Boot/
  • 将 EFI/Boot/bootx64.efi 重命名为 bootx64.efi.old
  • 将 EFI/Boot/grubx64.efi 重命名为 bootx64.efi

现在它直接启动到 grub2,但没有 win7 条目

加载 ubuntu 后我编辑

/etc/grub.d/40_custom

添加

menuentry "Windows 7" {
    set root='(hd0,gpt3)'
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

之后

sudo update-grub

一切正常

答案4

  1. 跑步启动修复来自 liveCD/liveUSB
  2. 单击Recommended Repair按钮。(这将自动安装正确的 grub-efi 参数,包括 SecureBoot 参数(如果需要),并在 UEFI 固件锁定到 Windows 文件的情况下重命名 EFI 文件)。指示如果有任何问题将出现的 URL。

启动修复

相关内容