双系统Win 8 / Ubuntu只能加载Win

我的电脑是一台索尼VAIO笔记本。我曾经使用Ubuntu和Win 8双系统启动,但Windows不知怎么地把选择操作系统的菜单给删除了。我想BIOS是UEFI模式的。安全启动已经禁用了,但是引导修复工具似乎无法解决问题。
请问我该如何修复这个问题?

sda 缺少 GRUB ... "将 GRUB 安装到 sda" 使用:https://help.ubuntu.com/community/Boot-Repair - jmunsch
3使用UEFI,您的sda主引导记录(MBR)中没有grub,而是在efi分区中。 - oldfred
3个回答

索尼、惠普和许多笔记本电脑供应商都被硬编码为只能启动Windows。
有几种解决方法建议您将grub的grubx64.efi或shimx64.efi文件移动到Windows的/EFI/windows/bootmgfw.efi之上。然而,这并不推荐,因为Windows更新会恢复bootmgfw.efi,您将再次只能启动Windows。
相反,我建议重命名回退/EFI/Boot/bootx64.efi和引导硬盘条目,或使用rEFInd。
在进行更改之前,请确保备份整个EFI分区。
您有几个可用的选项:
I. 将grub文件grubx64.efi或shim64.efi(用于安全启动)移动并重命名为此文件夹/文件/EFI/BOOT/BOOTX64.EFI
将/efi/boot/bootx64.efi重命名,将shim或grub复制到/efi/boot并将其命名为bootx64.efi。然后引导硬盘驱动器入口。Boot-Repair的新版本会在高级选项中自动执行此操作,选择“使用标准EFI文件”。它还会备份当前的bootx64.efi,该文件可能只是Windows .efi启动文件的副本。
从live安装程序中挂载硬盘上的EFI分区: 挂载EFI分区,检查哪个分区具有FAT32和启动标志。通常是sda1或sda2,但也有例外。
sudo mount /dev/sda1 /mnt
仅当不存在时才执行以下操作:
sudo mkdir /mnt/EFI/Boot sudo cp /mnt/EFI/ubuntu/* /mnt/EFI/Boot
如果创建了新文件夹,则bootx64.efi不存在,跳过此命令
sudo mv /mnt/EFI/Boot/bootx64.efi /mnt/EFI/Boot/bootx64.efi.backup 使grub成为UEFI的硬盘引导项。如果不存在,可能还需要使用efibootmgr更新UEFI。
sudo mv /mnt/EFI/Boot/grubx64.efi /mnt/EFI/Boot/bootx64.efi
如有必要,添加新的UEFI硬盘引导项: 另请参阅man efibootmgr 如果ESP是sda或默认驱动器和分区条目:
sudo efibootmgr -c -L "UEFI硬盘" -l "\EFI\Boot\bootx64.efi"
如果ESP不是sda1,sdX是驱动器,Y是efi分区,也适用于NVMe驱动器:
sudo efibootmgr -c -g -w -L "UEFI硬盘" -l '\EFI\Boot\bootx64.efi' -d /dev/sdX -p Y sudo efibootmgr -c -L "UEFI硬盘" -l "\EFI\Boot\bootx64.efi" -d /dev/nvme0n1 -p 2
(这与Boot-Repair在II中所做的相同,现在不推荐使用: 将/efi/Microsoft/Boot/bootmgfw.efi重命名,并将grub或shim复制到/efi/Microsoft/Boot并将其命名为bootmgfw.efi。然后引导到Windows入口以进入grub菜单。您必须手动添加一个grub菜单项来引导重命名的Windows efi文件。Grub2的os-prober条目引导bootmgfw.efi条目,该条目现在只是grub,因此不起作用。
手动移动过efi文件的用户请参阅帖子#6。 http://ubuntuforums.org/showthread.php?t=2101840 http://ubuntuforums.org/showthread.php?t=2219452 http://ubuntuforums.org/showthread.php?t=2221498&p=13012109#post13012109

II. 如果您使用旧版本的Boot-Repair修复了“有问题的UEFI”,最好撤销它。然后按照上面的更改使用bootx64.efi。

要撤销并将文件重命名为原始名称,您只需要在Boot-Repair中选择“恢复EFI备份”选项。

任何手动或使用Boot-Repair进行的重命名都需要在Windows更新后重新进行,因为它会还原Windows文件。

III. 编辑Windows BCD,这是Boot-Repair重命名使shim具有Windows名称的另一种选择。 对于那些将Windows保持为默认操作系统的系统来说,从Windows内部注册grub/shim可能效果更好。

Grub not showing on startup for Windows 8.1 Ubuntu 13.10 Dual boot

bcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efi

https://coderwall.com/p/vfyqkg

IV. 如果需要描述为Windows,则更改UEFI描述。这只适用于仅安装Ubuntu而没有安装Windows的用户。
sudo efibootmgr -c -L "Windows Boot Manager" -l "\EFI\ubuntu\shimx64.efi"

恢复或新建Windows UEFI条目 - 假设默认为sda1,如果是sda2,请添加-p 2(参见man efibootmgr -d drive & -p partition选项):
sudo efibootmgr -c -L "Windows Boot Manager" -l "\EFI\Microsoft\Boot\bootmgfw.efi"
sudo efibootmgr -c -L "Windows Boot Manager" -l "\EFI\Microsoft\Boot\bootmgfw.efi" -d /dev/nvme0n1 -p 1 

一些人安装了rEFInd,这似乎是另一种解决方法,并且具有漂亮的启动图标。

http://www.rodsbooks.com/refind/index.html

http://www.rodsbooks.com/refind/secureboot.html

PPA 可用于在 Ubuntu 上轻松安装。

http://www.rodsbooks.com/refind/getting.html

VI. 恢复Ubuntu UEFI启动项 sdX是驱动器,Y是efi分区,例如sda2

sudo efibootmgr -c -L ubuntu -l "\EFI\ubuntu\shimx64.efi"  -d /dev/sda -p 1
sudo efibootmgr -c -L "Ubuntu" -l "\EFI\ubuntu\shimx64.efi" -d /dev/nvme0nX -p Y

VII. 使用efibootmgr更改启动顺序:

使用efibootmgr更改启动顺序

VIII. 卸载UEFI条目:

卸载GRUB并使用Windows引导程序

IX. 您可以使用系统的UEFI/BIOS设置键(通常为F2,请查阅您的手册)来更改启动顺序或其他UEFI设置,然后将显示在UEFI引导菜单中(通常为F12):

https://askubuntu.com/a/757426/53503


是的!重命名对我有效!我挂载了efi分区,并将文件../EFI/ubuntu/grubx64.efi复制到../EFI/Boot/和/EFI/Microsoft/Boot,然后按以下方式更改了文件名。在../EFI/Boot目录中,我用该文件覆盖了bootx64.efi,在../EFI/Microsoft/Boot目录中,我用该文件覆盖了bootmgfw.efi。我想这就是全部。非常感谢! - user296880
1对于那些仍然使用Windows系统的用户:我成功地在不离开Windows的情况下,采用了a1选项中描述的重命名方法。我以管理员身份打开了一个命令窗口,然后运行了mountvol S: /S命令将EFI分区挂载为S:盘。在移动grubx64.efi文件到/EFI/Boot文件夹时,我遇到了一些奇怪的问题,但是逐级更改文件夹名称并将其重命名为bootx64.efi最终成功了。 - Peter Becker
我对重新编号我的帖子的英语专业人士没有这样做感到惊讶。我之前的评论中有提到A:和B:作为主要部分。 :) - oldfred

以上的答案对我朋友的HP Pavilion没有用,但是我找到了一个不错的解决办法。似乎HP的固件在每次启动时都会覆盖BootOrder并将Windows设置为第一位,但它仍然尊重BootNext。所以我写了一个启动脚本,在每次启动时设置BootNext
  1. 运行

    efibootmgr
    

    来查找BootCurrent的数字代码。在我朋友的情况下,这个代码是0003

  2. /etc/systemd/system/boot-linux-next.service:

    [Unit]
    Description=启动 Linux next
    
    [Service]
    Type=oneshot
    # 在下一行中用适当的代码替换'3'。
    ExecStart=efibootmgr --bootnext 3
    
    [Install]
    WantedBy=multi-user.target
    
  3. 运行

    systemctl enable --now boot-linux-next.service
    
这意味着,如果您今后启动其他系统,下次开机时必须手动选择 Linux。

对于我的HP电脑来说,真正起作用的是最简单的解决方案。我花了两个星期才在这个答案中找到:https://askubuntu.com/a/757426/53503 - brandizzi

我有一台有同样问题的Acer电脑。我的解决办法是“重新启动”Windows,而不是关机(实际上只是休眠)。
通过重新启动(可能会触发更新),系统会关闭,然后您可以从BIOS中选择引导。您必须在它重新启动之前抓住这个机会。
我很少使用Windows,所以用这种方式启动对我来说一点都不麻烦。除非当然是Windows更新。

  • 相关问题