宏碁笔电安装 Linux 后提示 No Bootable Device 的解决方案

No_Bootable_Device.webp

没错,我又在折腾我那可怜的练习时长8年的笔记本电脑了。因为不支持TPM2.0,它安装不了Windows11,即便强行安装上了也不能自动更新,而Windows10会在2025年10月停止支持,8年前的双核CPU也带不动最新的操作系统了,于是乎我决定只给它保留一个Linux系统,原来安装过Fedora和Ubuntu,都不太合我口味,这次换成了Linux Mint。不过在系统安装完成后重启的过程中又遇到了那个十分熟悉的页面:No Bootable Device 🐶

提醒:本方案基于Linux Mint系统,引导方式为UEFI,磁盘分区表格式为GPT,安装方式为格式化磁盘并进行全新安装,仅安装Linux Mint单系统,不同的BIOS版本和不同的Linux发行版在操作步骤上可能有些许不同。

解决方案

引导项没有了,手动给它添加回去不就完了嘛,添加步骤如下:

  1. 开机时按F2或者Del进入BIOS(UEFI BIOS firmware)
  • 如果你现在正卡在No Bootable Device页面上,使用Ctrl + Alt + Del组合键即可重启
  • 顺便说明一下BIOS菜单的操作方法:
    • 使用左右方向键在不同的菜单之间切换
    • 使用上下方向键在菜单的不同条目之间移动
    • 使用回车键确认
    • 使用Esc键返回
  1. 使用左右方向键切换到Boot菜单,确认Secure Boot处于Enabled开启状态
    Enable Secure Boot.webp
  2. 使用左右方向键切换到Security菜单
  3. 需要先设置BIOS密码,使用上下方向键移动到Set Supervisor Password条目并回车
  • 一定要记住这个密码,以后每次进入BIOS时都要输入这个密码
    Set Supervisor Password.webp
  1. 移动到Select an UEFI file as trusted for executing条目并回车
    Select an UEFI file as trusted for executing.webp
  2. 使用回车依次选择HDD0/EFI/ubuntu/shimx64.efi
    HDD0.webp
    EFI.webp
    ubuntu.webp
    shimx64.efi.webp
  3. Boot Description中给这个项目起一个别名,例如LinuxMint
    Boot Description.webp
  4. 选择Yes并回车
    Yes.webp
  5. 使用左右方向键切换到Exit菜单
  6. 使用上下方向键移动到Exit Saving Changes条目并回车,或者直接按F10键
    Exit Saving Changes.webp
  7. 选择Yes并回车,电脑会自动重启
  8. 如果不出意外的话,重启后就可以进入系统了

如何再次进入BIOS

引导设置完成后,再次开机时很难通过快捷键进入BIOS,我们可以打开终端,运行以下命令,系统重启后会自动进入BIOS。

1
sudo systemctl reboot --firmware-setup

原因

简单来说,造成No Bootable Device的原因是电脑使用的是UEFI引导,并启用了Secure Boot功能,Secure Boot需要引导加载器有微软的签名,而多数Linux发行版使用的引导加载器GRUB没有微软的签名,意味着它不被信任,也就不会加载。而我们前面做的就是手动添加了有微软签名的另一个引导加载器shim到可信数据库中,由shim来通过Secure Boot的验证并加载GRUB,这样Linux系统就可以在启用了Secure Boot的电脑上成功启动。

此外,如果你只打算安装Linux单系统,安装系统前启用Legacy Boot功能并关闭Secure Boot功能应该也可以规避这个问题。


其实我对这部分内容也是一知半解的状态,所以就借着这个机会把相关知识整理一下,做个笔记,如果你有兴趣了解更多,可以继续往下看。另外本人水平有限,下面的如有纰漏,欢迎指正。

UEFI

UEFI(统一可扩展固件接口)是一种固件接口标准,用于初始化和管理计算机系统的硬件和软件,以及替代传统的BIOS(基本输入/输出系统)。它的主要作用有:

  1. 启动计算机并加载操作系统,它执行引导加载器(Boot Loader)的任务,引导加载器负责加载操作系统内核并将控制权转交给操作系统。
  2. 初始化计算机的硬件组件,如CPU、内存、显卡等。
  3. 允许用户配置计算机的各种系统设置,包括启动顺序、硬件设置、日期和时间等。
  4. 管理启动设备,它支持多种启动设备,包括硬盘、光盘、U盘等。它能够检测和识别可用的启动设备,并按照预定的启动顺序加载操作系统。
  5. 提高系统安全性,它引入了安全启动(Secure Boot)功能,要求启动的操作系统和驱动程序使用数字签名进行验证,防止未经授权的恶意软件在系统启动时加载。

GRUB

GRUB,全称为 GNU GRUB(GNU GRand Unified Bootloader),是一款开源的、用于引导多个操作系统的引导加载器。它是GNU计划的一部分,被广泛用于许多Linux发行版以及其他操作系统。

然而,GRUB 的一些版本可能没有 Microsoft 的签名,因此在启用了 Secure Boot 的系统上会遇到问题。

Secure Boot

Secure Boot(安全启动) 是UEFI标准引入的一项安全验证机制,旨在确保计算机在引导过程中只能加载由受信任签名机构签名的引导加载程序和操作系统内核,保护系统免受那些在启动过程早期加载和执行的恶意代码(如Rootkits和Bootkits)的影响。

Secure Boot要求引导加载器和操作系统内核必须使用数字签名进行验证。数字签名是由私钥生成的,然后通过相关机构的公钥进行验证。只有使用受信任的密钥签名的引导加载器和操作系统才能通过验证。

大多数基于x86架构的电脑出厂时都预装了微软密钥,所以这些电脑的固件会信任由微软签名的二进制文件。微软作为Secure Boot的认证机构 (CA),也可以为其他受信任组织的程序签发签名。许多Linux发行版使用的shim引导加载器就包含了微软签名的证书,这样Linux就可以在启用了Secure Boot的电脑上顺利启动。

shim

shim 是一个用于启动在启用 Secure Boot 的电脑上的操作系统的引导加载器,即使这些操作系统的默认引导加载器没有直接由硬件制造商预装或签名。它提供了一种在Secure Boot环境下引导不同操作系统的通用解决方案,同时保持对开源和非受信任签名内核的支持。

为了通过 Secure Boot 的验证,shim 包含了由 Microsoft 签名的证书。这个证书的公钥被内置到许多 UEFI 固件中,因此 shim 的代码签名能够通过 Secure Boot 的验证。除了 Microsoft 的签名之外,shim 还支持加载并运行操作系统的引导加载器。这个引导加载器可以由 Linux 发行版的开发者使用他们自己的密钥签名,以确保其通过 shim 的验证。

当 shim 通过 Secure Boot 的验证后,它会加载 Linux 操作系统的默认引导加载器,通常是 GRUB2。这个过程构建了安全的引导链,确保系统在整个引导过程中都受到信任的代码控制。

shimx64与shim的关系类似于x86-64与x86的关系,shim 用于启动 32 位操作系统,而 shimx64 用于启动 64 位操作系统。

ESP

EFI 系统分区(也称为 ESP)是一个与操作系统无关的分区,文件系统通常为FAT或FAT32格式,分区大小通常为100MB。其中存储了由 UEFI 固件的引导加载器、应用程序和驱动,是 UEFI 启动所必须的。

ESP在Windows的文件资源管理器中不会显示,但是在磁盘管理中可以看到。在Linux中,ESP被视为普通分区,可使用mount程序直接挂载其对应的块设备,一般挂载于/boot/efi目录下。

EFI系统分区包含一个名为EFI的顶级目录,下面可能有多个子目录,每个子目录对应一个操作系统或引导加载器。子目录的名称通常是操作系统的名称或引导加载器的标识符。

EFI目录分析

以下是我的笔记本电脑的EFI目录结构:

  • HDD0/EFI/
    • ubuntu
      • grub.efi
      • shimx64.efi
      • mmx.efi
    • boot
      • grub.efi
      • shimx64.efi

大多数情况下,我们应该使用/HDD0/EFI/操作系统目录下的主要引导项,/HDD0/EFI/boot目录下的引导项只作为备份。如果主引导加载程序损坏,备份的引导项可以用作替代,以便系统能够继续引导。

至于mmx.efi,我能找到的资料并不多,根据Ask Ubuntu论坛的说法,它原来的名字是MokManager.efi,Ubuntu将它重命名为了mmx.efi,是一个用于管理 Secure Boot 中的密钥的工具。

引导流程

在Secure Boot启用的情况下,通常的引导流程如下:

  1. 电脑启动,UEFI固件开始执行引导过程。
  2. UEFI初始化系统硬件,并执行预启动自检。
  3. UEFI加载shimx64.efi并验证它的数字签名。
  4. shimx64.efi验证grub.efi的数字签名。
  5. 如果grub.efi的签名有效,shimx64.efi将加载并执行它。
  6. grub.efi进一步加载操作系统内核和其他必要的组件,启动系统。
  7. grub.efi加载并启动Linux内核,将控制权传递给操作系统。
  8. 操作系统内核初始化并加载根文件系统,启动Linux Mint操作系统。

MBR与GPT

MBR(Master Boot Record) 和 GPT(GUID Partition Table) 是两种不同的磁盘分区表格式。

区别MBRGPT
结构一个 512 字节的扇区,位于磁盘的第一个扇区(LBA 0),包含分区表、引导代码和一个磁盘签名每个磁盘扇区包含一个GPT头和一个或多个GPT条目数组,GPT 头包含磁盘的元数据,包括分区表的位置和大小,以及磁盘的唯一标识符(GUID)等信息
容量使用 32 位标志(LBA)来表示分区的起始位置和大小,不能支持超过2TB的磁盘使用 64 位标志(LBA),支持更大容量的硬盘(18TB)
分区支持最多四个主分区,或者三个主分区和一个扩展分区。支持更多的分区,上限取决于操作系统和实现,在Windows系统下可以支持128个主分区。
分区标识每个分区都有一个1字节的标识符,用于指示分区的类型(例如,FAT32、NTFS等)每个分区都有一个全局唯一标识符(GUID)来标识分区类型,而不再使用 MBR 的分区标识符
引导包含引导加载器的代码,该代码被用来引导操作系统。引导由传统的BIOS进行使用 EFI 分区来存放引导加载器,而不再需要引导代码存储在磁盘的开头。引导过程通常由 UEFI进行

如果你使用的是UEFI与MBR的组合,则需要启用Legacy Boot/CSM功能来模拟传统BIOS的启动过程,但是并不推荐这么做。

参考:
Wikipedia
Debian Wiki
Ubuntu Wiki
Arch Linux Wiki