宏碁笔电安装 Linux 后提示 No Bootable Device 的解决方案
没错,我又在折腾我那可怜的练习时长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发行版在操作步骤上可能有些许不同。
解决方案
引导项没有了,手动给它添加回去不就完了嘛,添加步骤如下:
- 开机时按
F2
或者Del
进入BIOS(UEFI BIOS firmware)
- 如果你现在正卡在No Bootable Device页面上,使用
Ctrl + Alt + Del
组合键即可重启 - 顺便说明一下BIOS菜单的操作方法:
- 使用左右方向键在不同的菜单之间切换
- 使用上下方向键在菜单的不同条目之间移动
- 使用回车键确认
- 使用Esc键返回
- 使用左右方向键切换到
Boot
菜单,确认Secure Boot
处于Enabled
开启状态 - 使用左右方向键切换到
Security
菜单 - 需要先设置BIOS密码,使用上下方向键移动到
Set Supervisor Password
条目并回车
- 一定要记住这个密码,以后每次进入BIOS时都要输入这个密码
- 移动到
Select an UEFI file as trusted for executing
条目并回车 - 使用回车依次选择
HDD0/EFI/ubuntu/shimx64.efi
- 在
Boot Description
中给这个项目起一个别名,例如LinuxMint - 选择
Yes
并回车 - 使用左右方向键切换到
Exit
菜单 - 使用上下方向键移动到
Exit Saving Changes
条目并回车,或者直接按F10键 - 选择
Yes
并回车,电脑会自动重启 - 如果不出意外的话,重启后就可以进入系统了
如何再次进入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(基本输入/输出系统)。它的主要作用有:
- 启动计算机并加载操作系统,它执行引导加载器(Boot Loader)的任务,引导加载器负责加载操作系统内核并将控制权转交给操作系统。
- 初始化计算机的硬件组件,如CPU、内存、显卡等。
- 允许用户配置计算机的各种系统设置,包括启动顺序、硬件设置、日期和时间等。
- 管理启动设备,它支持多种启动设备,包括硬盘、光盘、U盘等。它能够检测和识别可用的启动设备,并按照预定的启动顺序加载操作系统。
- 提高系统安全性,它引入了安全启动(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
- ubuntu
大多数情况下,我们应该使用/HDD0/EFI/操作系统
目录下的主要引导项,/HDD0/EFI/boot
目录下的引导项只作为备份。如果主引导加载程序损坏,备份的引导项可以用作替代,以便系统能够继续引导。
至于mmx.efi
,我能找到的资料并不多,根据Ask Ubuntu论坛的说法,它原来的名字是MokManager.efi
,Ubuntu将它重命名为了mmx.efi
,是一个用于管理 Secure Boot 中的密钥的工具。
引导流程
在Secure Boot启用的情况下,通常的引导流程如下:
- 电脑启动,UEFI固件开始执行引导过程。
- UEFI初始化系统硬件,并执行预启动自检。
- UEFI加载
shimx64.efi
并验证它的数字签名。 shimx64.efi
验证grub.efi
的数字签名。- 如果
grub.efi
的签名有效,shimx64.efi
将加载并执行它。 grub.efi
进一步加载操作系统内核和其他必要的组件,启动系统。grub.efi
加载并启动Linux内核,将控制权传递给操作系统。- 操作系统内核初始化并加载根文件系统,启动Linux Mint操作系统。
MBR与GPT
MBR(Master Boot Record) 和 GPT(GUID Partition Table) 是两种不同的磁盘分区表格式。
区别 | MBR | GPT |
---|---|---|
结构 | 一个 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的启动过程,但是并不推荐这么做。