AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 549647
Accepted
LiveWireBT
LiveWireBT
Asked: 2014-11-15 08:42:36 +0800 CST2014-11-15 08:42:36 +0800 CST 2014-11-15 08:42:36 +0800 CST

UEFI 机器不通过 NVRAM 引导目录引导 Ubuntu。怎么修?

  • 772

此处发布的答案应该:

  • 避免要求用户下载和安装额外的包或 PPA。
  • 尽可能快速和简单。(我试过引导修复但不合格。)
  • 可能为没有太多终端经验的用户提供脚本。

像这样的类似问题已多次发布到该站点:

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

这通常表示默认引导加载程序或引导进程在某种程度上被硬编码为引导 Windows 时出现问题。在大多数情况下,这可以很容易地通过替换\EFI\BOOT\BOOTx64.EFI为另一个也允许启动其他操作系统的文件来修复。

grub2
  • 2 2 个回答
  • 9622 Views

2 个回答

  • Voted
  1. Best Answer
    LiveWireBT
    2014-11-15T08:42:36+08:002014-11-15T08:42:36+08:00

    简短的回答

    您可以使用grub-mkimagebootx64.efi从 Ubuntu 实时媒体中创建一个二进制文件,并编写自定义链接加载您不想启动的加载程序,并将这两个文件复制到 EFI 系统分区 (ESP) 到目录中。grub.cfg\EFI\BOOT\

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

    为您的方便而编写的脚本

    关于这个脚本:

    • 请注意,此脚本会grub-efi-amd64在它运行的地方安装包,因此会破坏旧版 MBR 安装。如果可能的话,可能只从实时媒体运行它。
    • 最好您已经知道 ESP 的设备名称。
    • 您只需将下面的代码粘贴到一个打开的终端Ctrl+ Alt+t中并运行它Enter。
    • Crtl您可以使用+取消终端中的脚本和程序c。
    • 可以通过 访问启动实时媒体的驱动器上的文件/isodevice。GUI:计算机➜ Nautilus/文件管理器中的isodevice。
    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 条目(计算机主板)来引导特定操作系统是不可能的。arch当前x64为 AMD64、ia32i386 和ARM/或A64ARM定义的值。

    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 驱动器仅需进行一些编辑。您也可以轻松替换ubuntu为fedora以创建另一个启动 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. ---
    
    • 5
  2. solsTiCe
    2014-12-05T05:28:35+08:002014-12-05T05:28:35+08:00

    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
    
    • 1

相关问题

  • 有没有办法从 GUI/桌面管理我的 Grub 菜单选项?

  • grub 菜单中的“恢复”选项是什么?

  • 与 Grub 相比,使用 Grub2 有什么好处?

  • 如果旧版 grub 安装在引导分区扇区而不是 MBR 中,如何将 grub 更新为 grub2?

  • 如何在 Ubuntu 启动时显示或隐藏启动消息?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve