联想BIOS在UEFI模式下出现no bootable device found的问题解决
前言
最近一直在折腾一台别人淘汰的旧电脑,型号是联想c260,板载cpu是intel j1800。
这机器到手以后我就直接开始重装debian了,但是碰到了2个问题:
- 在uefi模式下,装好debian拔掉引导u盘以后重启,会提示找不到启动设备
no bootable device found
- 在legacy模式下,装好debian以后能进入系统,但是无法软关机/软重启,在输入关机/重启命令以后一直提示
watchdog did not stop
,只能硬关机(长按电源键或者直接拔电源)
第一个问题反复尝试后无解,而且联想的bios也没有开放高级功能来修改配置。
第二个问题反复尝试也无解,但凑合还能用,只要每次想重启/关机的时候手动长按电源开关就行了。
但最近我往这台机器上装pve,在uefi模式下竟然可以正常关机,🤔,我觉得可以找找对应的解决方案了。
功夫不负有心人,很快就找到了类似的问题而且成功解决了,在这里做个简单记录。
原因
简单来讲就是联想这台古董机器的uefi固件版本太低了(或者做了阉割没有实现完整的efi功能),不兼容debian 12的bootloader。
debian 12安装好以后的boot分区目录结构大致如下
├── boot
│ ├── config-5.10.0-18-amd64
│ ├── efi
│ │ └── EFI
│ │ └── debian
│ │ ├── BOOTX64.CSV
│ │ ├── fbx64.efi
│ │ ├── grub.cfg
│ │ ├── grubx64.efi
│ │ ├── mmx64.efi
│ │ └── shimx64.efi
但联想这个机器的uefi固件能识别的boot目录的结构应该如下
├── boot
│ ├── config-5.15.53-1-pve
│ ├── efi
│ │ └── EFI
│ │ ├── BOOT
│ │ │ ├── BOOTX64.EFI
│ │ │ ├── fbx64.efi
│ │ │ └── grubx64.efi
│ │ └── debian
│ │ ├── BOOTX64.CSV
│ │ ├── fbx64.efi
│ │ ├── grub.cfg
│ │ ├── grubx64.efi
│ │ ├── mmx64.efi
│ │ └── shimx64.efi
两者对比以后可以发现,debian 12的boot分区少了一个BOOT
目录,所以理论上我们只需要在装完系统以后把BOOT
目录以及目录下的文件恢复就行了。
修复
修复BOOT
目录有三种方法,推荐使用debian官方wiki推荐的方法一。我实测方法一成功解决了问题,其它两个方法仅作收集记录,是否有效未知。
uefi模式下,debian系统盘的默认分区,/dev/sda1是fat32格式的esp分区(boot分区),/dev/sda2是根分区,大致示意如下
/dev/sda1 esp
/dev/sda2 /
/dev/sda3 swap
下面的命令操作,都以此分区为例。
方法一:官方wiki的修复方法
这个方法需要你的机器有接显示器 + 键盘,而且手头需要有一个debian的引导u盘。
首先,插上引导u盘然后通电开机,进入u盘的debian引导程序,选择进入rescue mode(急救模式),然后执行以下命令
mkdir /target
mount /dev/sda2 /target
mount /dev/sda1 /target/boot/efi
for i in /sys /proc /dev; do mount --bind $i /target$i; done
chroot /target
cd /boot/efi/EFI
mkdir boot
cp debian/grubx64.efi boot/bootx64.efi
exit
for i in /sys /proc /dev; do umount /target$i; done
umount /target/boot/efi
umount /target
执行完以上命令以后,重启系统以后uefi即可正确识别系统盘并正常进入debian系统。
官方wiki还建议完成boot分区重建以后,用以下命令来固化启动信息。但是要注意,如果你是双系统,这一步操作会影响另一个系统的启动。
echo "grub-efi-amd64 grub2/force_efi_extra_removable boolean true" | sudo debconf-set-selections
而且我实测即使不执行这步操作,也不会影响系统的重启。所以是否执行请自行选择。
方法二:手动复制文件
这个方法就是上一个方法的简化版。
从第一步的命令中可以看出只需要手动创建BOOT
目录然后复制一个文件即可。所以可以把系统盘拔下来查到其它能识别fat32分区的电脑上进行操作即可
# 假定efi分区是/dev/sda1
mount /dev/sda1 /mnt/tmp
cd tmp
# 创建BOOT目录
mkdir BOOT
# 复制文件
cp debian/grubx64.efi BOOT/BOOTx64.efi
# 卸载分区
umount /mnt/tmp
完成以上操作以后,再把硬盘插回联想电脑即可。
参考文章
- No bootable devices found
- Problem1: Weak EFI implementation only recognizes the fallback bootloader
- Booting with EFI