我买了一台新的 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。
我唯一能想到的是:
- sda1 分区不知为何被占用
- 用 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 启动过程的工作原理:
- 查看 /EFI/Microsoft/Boot/fwbootmgr.efi;如果存在,则启动它。
- 在 /EFI/ 的所有子目录中查找 grubx64.efi。如果存在,则启动它。
- 启动/EFI/Boot/bootx64.efi
- 显示错误消息,例如“未找到操作系统”。
在 Linux 下,efibootmgr 工具确实可以工作,但它会显示很多自动生成的无意义的信息,包括您使用的最后一个 USB 驱动器。
以下是我了解到这一切的过程:
- 我打开了我的新机器并折叠了 Windows 分区以便并排安装 Linux 和 Mac。
- 我安装了 Ubuntu 12.10,安装程序覆盖了 fwbootmgr.efi,备份了旧的 Windows 引导加载程序。
- 我恢复了旧的 Windows 引导程序,但除了 Windows 之外无法启动任何东西。
- 我将 Windows 引导加载程序重命名为一个虚假的名称,然后 Grub BL 接管了它。
- 我将 ubuntu 目录重命名为其他名称,但 Grub 仍然加载,即使我已经安装了 rEFInd。
让 rEFInd 做我想做的事情的唯一方法是这样的:
将 fwbootmgr.efi 移动到其父目录;rEFInd 仍会找到它,并且 Windows 不会抱怨您重命名了它。
- 将 grubx64.efi 重命名为 rfgrubx64.efi 或其他可识别的名称。
- 将 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 命令、找到新的二进制文件或诸如此类的方法,以测试这些可能性。如果其他方法都失败了,我建议您执行以下操作:
- 使用 efibootmgr 或您的固件删除所有启动项(如果它提供了执行此操作的接口)。
- 将 grubx64.efi 复制到 ESP 上的 EFI/Boot/bootx64.efi。
- 如果重新启动时仍然出现 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
- 跑步启动修复来自 liveCD/liveUSB
- 单击
Recommended Repair
按钮。(这将自动安装正确的 grub-efi 参数,包括 SecureBoot 参数(如果需要),并在 UEFI 固件锁定到 Windows 文件的情况下重命名 EFI 文件)。指示如果有任何问题将出现的 URL。