简短的回答

简短的回答

此处发布的答案应该:

  • 避免要求用户下载和安装额外的包或 PPA。
  • 尽可能快速和简单。(我尝试过启动修复,但没有成功。)
  • 可能为没有太多终端经验的用户提供一个脚本。

类似的问题已在网站上发布过多次:

  • A最近发布Ubuntu 已成功安装在预装了 Windows 8 或更高版本且支持 UEFI 的机器上。
    • 的输出efibootmgr -v显示/efi/ubuntu/shimx64.efi已注册为ubuntu。(这些新的启动项通常以最高优先级添加。另请参阅使用 efibootmgr 更改启动顺序
    • 重新启动后,没有显示操作系统选择菜单(GRUB),机器直接启动到 Windows。
  • 什么时候访问固件设置菜单(以前称为 BIOS):
    • 没有迹象表明如何更改单个操作系统的启动顺序,或者Windows Boot Manager根本没有显示操作系统(如),只有设备。
    • 安全启动固件设置中已关闭该功能。
  • Ubuntu 安装者以 UEFI 模式启动实时媒体不是通过运行五笔-Windows 中的安装程序。
  • Windows 安装本身未被修改、替换或删除。
    • 该驱动器包含 GPT 分区表。
    • Windows 磁盘管理显示磁盘上至少存在以下 3 个分区:
      • EFI 系统分区
      • Windows 分区
      • 无法读取的 RAW 分区,可能是 Ubuntu 安装
  • 您尝试\EFI\BOOT\在备份目录之前将其完全删除。

这通常表示默认引导加载程序或引导进程存在问题,这些引导加载程序或引导进程在某种程度上是硬编码的,用于引导 Windows。在大多数情况下,只需用\EFI\BOOT\BOOTx64.EFI另一个允许引导其他操作系统的文件替换,即可轻松修复此问题。

答案1

简短的回答

您可以bootx64.efi使用以下方式在 Ubuntu Live 媒体中创建二进制文件grub-mkimage并编写一个自定义程序grub.cfg来链式加载您想要启动的加载器,然后将两个文件复制到 EFI 系统分区(ESP)的目录中\EFI\BOOT\

如果你不知道如何使用终端,本答案以下部分提供的脚本将为你完成此操作。有关更多详细信息,请查看技术细节更长的答案

为您的方便编写脚本

关于这个脚本:

  • 被警告此脚本会grub-efi-amd64在运行时安装包,因此会破坏传统的 MBR 安装. 如果可能的话可能仅从实时媒体运行它。
  • 最好您已经知道 ESP 的设备名称。
  • 您只需将下面的代码粘贴到打开的终端Ctrl++中并运行它Alt即可。tEnter
  • Crtl您可以使用+取消终端中的脚本和程序c
  • 可以通过 访问启动实时媒体的驱动器上的文件/isodevice。GUI:电脑同位素设备在 Nautilus/文件管理器中。
echo -en "\ec"; \
if [ -e "/boot/efi/EFI" ] && [ $(mount | grep -c "/boot/efi type vfat") -gt 0 ]; then \
    esp=$(mount | grep "/boot/efi type vfat" | sed -e 's/ on.*//'); \
    echo "The following device appears to be mounted as an EFI System Partition: $esp"; \
    read -p "Is that correct \"yes\" or \"no\"? Note, that answering \"no\" will unmount $esp! " correctesp; \
    if [ "$correctesp" == "no" ]; then \
        sudo umount "$esp"; \
    elif [ "x$correctesp" != "xyes" ]; then \
        echo "Invalid input, refusing to do anything."; \
    fi; \
fi; \
if ! [ -e "/boot/efi/EFI" ] && ! [ $(mount | grep -c "/boot/efi type vfat") -gt 0 ]; then \
    echo "Possible EFI System Partitions (ESP) found, but none appear to be mounted:"; \
    sudo blkid -t TYPE="vfat"; \
    read -p "Please enter the device name of your ESP (/dev/sd[a-z][1-9]): " esp; \
    sudo mkdir -p "/boot/efi"; \
    if [ "$(echo $esp | cut -c 1-5)" == "/dev/" ]; then \
        sudo mount "$esp" "/boot/efi"; \
    else \
        echo "Invalid input, refusing to do anything."; \
    fi; \
    sudo mkdir -p "/boot/efi/EFI"; \
    correctesp="yes"; \
fi; \
if [ -e "/boot/efi/EFI" ] && [ $(mount | grep -c "/boot/efi type vfat") -gt 0 ] && [ "$correctesp" == "yes" ]; then \
    project="$HOME/uefi-bootfix"; \
    mkdir -p "$project"; \
    echo "--- Begin installing grub-efi-amd64 package (could throw some dpkg errors) ---"; \
    sudo apt-get install -y grub-efi-amd64; \
    echo "--- End of installing grub-efi-amd64 ---"; \
    echo "--- Installing GRUB EFI image and configuration to ESP ---"; \
    grub-mkimage -o "$project/bootx64.efi" -p "/efi/boot" -O x86_64-efi fat iso9660 part_gpt part_msdos normal boot linux configfile loopback chain efifwsetup efi_gop efi_uga ls search search_label search_fs_uuid search_fs_file exfat ext2 ntfs btrfs hfsplus udf; \
    echo -e "set timeout=3\nmenuentry 'Ubuntu' {\n\tchainloader /efi/ubuntu/grubx64.efi\n}\nmenuentry 'Windows' {\n\tchainloader /efi/Microsoft/Boot/bootmgfw.efi\n}\nmenuentry 'Firmware Setup' {\n\tfwsetup\n}\nmenuentry 'ubuntu-14.04.1-desktop-amd64.iso' {\n\tset isofile="/efi/boot/ubuntu-14.04.1-desktop-amd64.iso"\n\tloopback loop $isofile\n\tlinux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile noprompt noeject quiet splash\n\tinitrd (loop)/casper/initrd.lz\n}" > "$project/grub.cfg"; \
    sudo mkdir -p "/boot/efi/EFI/boot"; \
    if [ -e "/boot/efi/EFI/boot/bootx64.efi" ]; then \
        sudo cp -v "/boot/efi/EFI/boot/bootx64.efi" "/boot/efi/EFI/boot/bootx64_uefi-bootfix-backup-$(date +%F_%H-%M-%S).efi"; \
    fi; \
    sudo cp -v "$project/bootx64.efi" "/boot/efi/EFI/boot/bootx64.efi"; \
    sudo cp -v "$project/grub.cfg" "/boot/efi/EFI/boot/grub.cfg"; \
    echo "--- Done. ---"; \
fi

更长的答案

问题

UEFI 规范建议固件实施者通过默认引导加载程序以从外部介质启动命名\EFI\BOOT\BOOT{arch}.EFI,例如,当无法依靠平台(计算机主板)中的 NVRAM 条目来启动特定操作系统时。当前定义的值适用archx64AMD64、ia32i386 和ARMARM A64

Windows 和 Fedora 在 ESP 上安装了这样的引导加载程序,而 Ubuntu 目前没有。某些计算机(如廉价笔记本电脑)中的固件表现出一种行为,这些设备似乎完全忽略了 NVRAM 引导目录中正确注册的 UEFI 引导加载程序,并默认从 启动\EFI\BOOT\BOOT{arch}.EFI,这通常会导致启动 Windows 而不是 Ubuntu。

技术细节

此配置目前不支持安全启动,并且尚未针对 Apple 电脑进行测试,因为我没有这样的机器。(非常感谢您的帮助。)

如果到现在还不清楚:这还将允许在另一台支持 UEFI 的计算机上启动磁盘上的操作系统安装,类似于传统的 MBR 方式。

bootx64.efi使用 GRUB生成映像

grub-mkimage -o bootx64.efi -p /efi/boot -O x86_64-efi fat iso9660 part_gpt part_msdos normal boot linux configfile loopback chain efifwsetup efi_gop efi_uga ls search search_label search_fs_uuid search_fs_file exfat ext2 ntfs btrfs hfsplus udf

创建相应grub.cfg文件

此配置涵盖了启动 Ubuntu、启动 Windows 和启动固件设置的基本情况。最后一个条目允许循环安装和启动 ISO 映像,这乍一看可能很奇怪,因为 ESP 通常只有几百兆字节,无法存储这么大的文件,但这两个文件也可以在 FAT 格式的 USB 驱动器上使用。具有多个 ISO 的多启动 USB 驱动器只需进行一些编辑即可。您还可以轻松替换ubuntufedora创建另一个启动 Fedora 或任何其他 Linux 发行版的菜单项,只需查看 ESP 的内容即可。

set timeout=3
menuentry 'Ubuntu' {
    chainloader /efi/ubuntu/grubx64.efi
}
menuentry 'Windows' {
    chainloader /efi/Microsoft/Boot/bootmgfw.efi
}
menuentry 'Firmware Setup' {
    fwsetup
}
menuentry 'ubuntu-14.04.1-desktop-amd64.iso' {
    set isofile="/efi/boot/ubuntu-14.04.1-desktop-amd64.iso"
    loopback loop $isofile
    linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile noprompt noeject quiet splash
    initrd (loop)/casper/initrd.lz
}

附录

gummiboot 和 PreLoader 怎么样?

我发过类似的东西在过去在我看来,这没什么问题。它甚至可以与安全启动配合使用。如果它对你有用,那就太好了,但用户体验(包括手动下载、创建和提取多个文件)并不是最理想的,而且对普通用户来说相当困难。

示例输出

从实时媒体运行脚本的示例输出:

Possible EFI System Partitions (ESP) found, but none appear to be mounted:
/dev/sda1: LABEL="ESP W8" UUID="8AEF-2F66" TYPE="vfat" 
/dev/sdb1: LABEL="ESP HDD" UUID="CBB5-B769" TYPE="vfat" 
/dev/sdc1: LABEL="ESP EVO" UUID="288D-5954" TYPE="vfat" 
/dev/sdd1: LABEL="SANDISK" UUID="B67A-5BFF" TYPE="vfat" 
Please enter the device name of your ESP (/dev/sd[a-z][1-9]): /dev/sdb1
--- Begin installing grub-efi-amd64 package (could throw some dpkg errors) ---
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  efibootmgr grub-efi-amd64-bin
The following packages will be REMOVED:
  grub-gfxpayload-lists grub-pc
The following NEW packages will be installed:
  efibootmgr grub-efi-amd64 grub-efi-amd64-bin
0 upgraded, 3 newly installed, 2 to remove and 0 not upgraded.
Need to get 0 B/722 kB of archives.
After this operation, 2,399 kB of additional disk space will be used.
Preconfiguring packages ...
(Reading database ... 169555 files and directories currently installed.)
Removing grub-gfxpayload-lists (0.6) ...
Removing grub-pc (2.02~beta2-9ubuntu1) ...
Processing triggers for man-db (2.6.7.1-1) ...
Selecting previously unselected package efibootmgr.
(Reading database ... 169536 files and directories currently installed.)
Preparing to unpack .../efibootmgr_0.5.4-7ubuntu1_amd64.deb ...
Unpacking efibootmgr (0.5.4-7ubuntu1) ...
Selecting previously unselected package grub-efi-amd64-bin.
Preparing to unpack .../grub-efi-amd64-bin_2.02~beta2-9ubuntu1_amd64.deb ...
Unpacking grub-efi-amd64-bin (2.02~beta2-9ubuntu1) ...
Selecting previously unselected package grub-efi-amd64.
Preparing to unpack .../grub-efi-amd64_2.02~beta2-9ubuntu1_amd64.deb ...
Unpacking grub-efi-amd64 (2.02~beta2-9ubuntu1) ...
Processing triggers for man-db (2.6.7.1-1) ...
Setting up efibootmgr (0.5.4-7ubuntu1) ...
Setting up grub-efi-amd64-bin (2.02~beta2-9ubuntu1) ...
Setting up grub-efi-amd64 (2.02~beta2-9ubuntu1) ...
Installing for x86_64-efi platform.
grub-install: error: failed to get canonical path of `/cow'.
dpkg: error processing package grub-efi-amd64 (--configure):
 subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
 grub-efi-amd64
E: Sub-process /usr/bin/dpkg returned an error code (1)
--- End of installing grub-efi-amd64 ---
--- Installing GRUB EFI image and configuration to ESP ---
‘/boot/efi/EFI/boot/bootx64.efi’ -> ‘/boot/efi/EFI/boot/bootx64_uefi-bootfix-backup-2014-11-13_22-39-42.efi’
‘/home/ubuntu/uefi-bootfix/bootx64.efi’ -> ‘/boot/efi/EFI/boot/bootx64.efi’
‘/home/ubuntu/uefi-bootfix/grub.cfg’ -> ‘/boot/efi/EFI/boot/grub.cfg’
--- Done. ---

答案2

efibootmgr -v 的输出显示 /efi/ubuntu/shimx64.efi 已注册为 ubuntu。(这些新的启动项通常以最高优先级添加。)

efibootmgr 的输出将有助于确定顺序是否正确。

因此,据我了解,这是一个更改启动顺序的问题,以便 grub 的条目成为默认条目。我也遇到过这个问题。

由于你无法启动 Ubuntu 来解决这个问题,或者在 UEFI/BIOS 中执行该操作,你可以启动 Ubuntu 的 LiveCD,然后进入终端或控制台

打开终端并运行

# sudo -i
# apt-get install efibootmgr
# efibootmgr
BootCurrent: 0003
Timeout: 0 seconds
BootOrder: 0003,0002,0004,2001
Boot0000* UEFI Onboard LAN IPv6
Boot0001* UEFI Onboard LAN IPv4
Boot0002* ubuntu
Boot0003* Windows Boot Manager
Boot0004* Ubuntu
Boot2001* EFI USB Device

并且您更改了启动项的顺序

# efibootmgr -o 0002,0003,0004,2001

然后再次运行 efibootmgr 来检查更改是否有效。它也应该改变 bootnext 值,否则你可以运行

# efibootmgr -n 0002

相关内容