前言

最近一直在折腾一台别人淘汰的旧电脑,型号是联想c260,板载cpu是intel j1800。

这机器到手以后我就直接开始重装debian了,但是碰到了2个问题:

  1. 在uefi模式下,装好debian拔掉引导u盘以后重启,会提示找不到启动设备no bootable device found
  2. 在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

完成以上操作以后,再把硬盘插回联想电脑即可。


参考文章

  1. No bootable devices found
  2. Problem1: Weak EFI implementation only recognizes the fallback bootloader
  3. Booting with EFI

喝杯奶茶