解决联想更新BIOS报错:mount the EFI system partition failed

解决联想更新BIOS报错:mount the EFI system partition failed

问题

使用联想thinkbook笔记本运行双系统,在同一个EFI分区内安装了Windows和linux(GRUB)的启动引导,在windows下执行联想提供的BIOS更新程序时报错mount the EFI system partition failed。联想使用的固件供应商为Insyde,包括用于更新BIOS的程序。其他使用该公司方案的笔记本品牌也可能遇到类似问题。

在Windows11+的系统中,微软也会将OEM提供的BIOS更新作为系统更新的一部分发布。因此上述问题也表现为系统更新重启多次后执行到99%时报错“某些操作未按计划进行”,并自动回退,导致系统更新一直失败。

最初认为是双系统的问题,于是一直没有更新。但最近在linux设置界面查看系统固件信息时报错:

1
WARNING: UEFI ESP partition not detected or configured

认为这两者之间可能存在关联,可能是EFI分区本身的问题。值得排查解决。

排查

使用的发行版Manjaro查询固件信息使用的后端是fwupd,经过验证上述报错确实来自fwupd。

安装fwupd后可以执行如下命令测试:

1
 fwupdmgr get-devices

fwupd在输出WARNING的同时指向了关于该问题的向导页面

逐项排查,确认EFI分区正确挂载于/boot/efi,分区格式化为fat32

直到排查EFI system partition on a GUID partition table with a wrong partition type GUID时,在相关的issue中要求查看如下命令的输出:

sudo fwupdtool get-devices --plugins uefi-capsule -vv output > fw.txt 2>> fw.txt

查看输出文件,关注到如下片段:

06:13:04.629 FuVolume Looking for volumes of type c12a7328-f81f-11d2-ba4b-00a0c93ec93b
...
06:13:04.633 FuVolume device /org/freedesktop/UDisks2/block_devices/nvme0n1p1, type: 21686148-6449-6e6f-744e-656564454649, internal: 1, fs: vfat
06:13:04.633 FuContext no volumes of type c12a7328-f81f-11d2-ba4b-00a0c93ec93b
...
06:13:04.643 FuPluginUefiCapsule  cannot find default ESP: No ESP or BDP found

已知我的硬盘上nvme0n1p1为挂载的EFI分区,则上述输出表示可识别的EFI分区类型为c12a7328-f81f-11d2-ba4b-00a0c93ec93b,而实际分区类型为21686148-6449-6e6f-744e-656564454649

分析

查看GUID partition type及其含义的列表,可知c12a7328-f81f-11d2-ba4b-00a0c93ec93b是正确的EFI分区类型,而21686148-6449-6e6f-744e-656564454649 是legacy的BIOS boot partition类型。

这很奇怪。我的双系统都是使用UEFI启动的,设备是2024年新购入,不应该存在传统BIOS启动分区。

推测:分区类型在安装linux或者在某次分区操作中被错误更改,UEFI启动时通过分区引导文件能够正常识别并启动,但这条分区类型会影响fwupd和BIOS升级工具等程序如何在众多分区中识别EFI分区。

解决

一条superuser帖子提供了使用gdisk修改分区类型的步骤。

安装和进入gdisk:

首先使用发行版的包管理器安装gdisk,如果没有预装的话。

执行sudo gdisk /dev/nvme0n1,其中硬盘设备更换为你实际的硬盘设备名。

此时进入gdisk交互界面,列出了若干支持的指令。

查看所有分区:

按p并回车可以列出所有分区及其相关信息,其中Code一列也表示分区类型。记住你的EFI分区的序号,通常为1。

1
2
3
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          534527   260.0 MiB   EF00  EFI system partition
...

按L并回车会列出所有支持的Type Code及其含义,也可搜索。可以找到EF02代表传统BIOS启动分区,EF00代表EFI启动分区。

1
2
3
4
5
Command (? for help): L   
Type search string, or <Enter> to show all codes: partition
ea00 XBOOTLDR partition                  ed00 Sony system partition
ed01 Lenovo system partition             ef00 EFI system partition
ef01 MBR partition scheme                ef02 BIOS boot partition

备份分区表:

按b回车,再输入文件路径,将分区表备份到文件以免操作失误。

查看和修改分区类型:

按 i 并回车,再按EFI分区的序号(例如1)并回车会显示分区的详细信息,包括此前的GUID partition type。

1
2
3
4
5
6
7
8
9
Command (? for help): i
Partition number (1-6): 1
Partition GUID code: 21686148-6449-6e6f-744e-656564454649 (BIOS boot partition)
Partition unique GUID: xxxxxxxxxxxxxxx
First sector: xxxx (at 1024.0 KiB)
Last sector: xxxx (at 261.0 MiB)
Partition size: xxxx sectors (260.0 MiB)
Attribute flags: 0000000000000000
Partition name: 'Unknown'

如果想要修改分区类型,按t回车,再输入序号并回车,再输入EF00,此时会显示Changed type of partition to EFI System partition。可以再使用i指令确认。

但此时修改还没有实际写入,按w并回车执行写入,出现successful字样则成功。

重启计算机并验证:

此时正在运行的kernel仍然使用的是旧的分区表,新的分区表在重启后应用。

重启计算机到linux,fwupd不再提示warning。

重启计算到windows,BIOS升级工具可以正常升级。注意升级BIOS后会删除grub启动引导项,最好在升级前备份引导项以便恢复,windows下可使用工具如EFI Boot Editor,linux下方式较多,不再赘述。

0%