我买了一台新的 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。
我能想到的只有:
任何人都可以帮我吗?谢谢 - 非常感谢任何帮助,因为这个问题让我发疯!
Roh*_*uva 11
我最终能够解决这个问题。我用 grub64.efi 替换了 EFI/Microsoft/boot/bootmgfw.efi。我将前者重命名为 bootmgfw.efi.old 并使用 grub 添加一个菜单选项以将其链式加载到其中。
这意味着固件是硬编码的以查找 Microsoft Windows 引导加载程序,并且不考虑 efibootmgr 设置或 startup.nsh。这真的太可怕了。
我发现了索尼 EFI 启动过程的工作原理:
在 Linux 下,efibootmgr 工具确实可以工作,但它会显示很多自动生成的废话,包括您最后使用的 USB 驱动器。
以下是我学习这一切的方式:
我可以让 rEFInd 做我想做的唯一方法是:
将 fwbootmgr.efi 移动到其父目录;rEFInd 仍然会找到它,并且 Windows 不会抱怨您重命名了它。
(也许可以使用 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 命令,找到一个新的二进制文件,或诸如此类的东西来测试这些可能性。如果所有其他方法都失败了,我建议您执行以下操作:
这应该使用引导加载程序的默认名称 (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)
或者,您可以将rEFIt或rEFInd安装为 EFI/Boot/bootx64.efi。请注意,其站点提供的 rEFIt 二进制文件无法在基于 UEFI 的 PC 上运行;您需要使用 Ubuntu 存储库中的版本。rEFInd 是 rEFIt 的一个分支,具有许多错误修复和更新,包括更好的 UEFI 支持。(rEFIt 似乎在大约两年前就被放弃了。)因此,我建议使用 rEFInd 而不是 rEFIt —— 但我是 rEFInd 的维护者,所以我不是这个分数的独立观察者。不幸的是,AFAIK rEFInd(尚未)包含在 Ubuntu 存储库中,因此您必须手动下载并安装它。