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

Roh*_*uva 12 grub2 sony uefi

我买了一台新的 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
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,磁盘上有2个EFI系统分区。sda2 分区是一个 20gb 的恢复分区,它加载带有基本恢复界面的窗口。这可以通过按下“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
Run Code Online (Sandbox Code Playgroud)

但是,如您所料,在重新启动时,机器直接重新启动回 Windows。

我能想到的只有:

  1. sda1 分区以某种方式被使用
  2. 用 grubx64.efi 覆盖 /EFI/Boot/bootx64.efi 和 /EFI/Microsoft/Boot/bootmgfw.efi [但这似乎非常激进]。

任何人都可以帮我吗?谢谢 - 非常感谢任何帮助,因为这个问题让我发疯!

Roh*_*uva 11

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

这意味着固件是硬编码的以查找 Microsoft Windows 引导加载程序,并且不考虑 efibootmgr 设置或 startup.nsh。这真的太可怕了。

我发现了索尼 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 目录重命名为其他目录,即使我已经安装了 rEFInd,Grub 仍然加载。
  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 支持在我的体验中仍然是一团糟。我拒绝再次接触它一段时间。)


小智 5

首先,您没有两个 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。

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

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

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