Featured image of post 修复联想P系列工作站上PVE安装Grub引导失败

修复联想P系列工作站上PVE安装Grub引导失败

由GPT-5辅助撰写

Environment

  • 设备:Lenovo ThinkStation P 系列(本文机型:P3 Ultra Gen1)
  • 系统:Proxmox VE 8.4 / 9.0(均重现)
  • 启动:UEFI 模式,Secure Boot 关闭
  • 磁盘:NVMe(安装器默认分区:ESP≈1 GiB、LVM 作为根)

Symptoms & Error Messages

在安装Proxmox VE时遇到以下提示:

在安装 PVE 的最后阶段,“Bootloader setup” 报错:

failed to prepare efi boot using Grub on “/dev/DEVICE_NAMEp2”: unable to install the EFI boot loader on ‘/dev/DEVICE_NAME’

随后 grub-install 警告无法设置 EFI 变量(如 cannot set EFI variable Boot0000),安装器以失败结束。

导致这个问题的原因是Lenovo联想部分机器限制NVRAM的写入,使得安装程序无法正常grub-install需要的EFI文件。通过手动将EFI指定到fallback启动可以解决这个问题。

报错图片

Impact

我是在今天安装的时候发现这个问题的。一开始我认为是UEFI设置问题,重置并更新了bios之后问题仍然存在;然后我尝试了不同版本的ISO制作(BalenaEtcher/Rufus)和不同版本镜像(8.4/9.0),都有同样的报错。

在网上一开始按照报错信息去搜索,没有特别有效的结果。我突然意识到,网络上出现这个问题的多是戴尔R系列服务器,与联想P系列同属于品牌机工作站,可能有特殊的bios限制。在群友的提示下按照机型搜索时得到了部分结果。一个Chiphell的帖子 提到了同样的问题,并且声称通过重新导入UEFI证书解决了。另一个出现在Proxmox论坛上的帖子有同样的情况,但没有给出解决方案。

Initial Assessment

在尝试了升级BIOS无果之后,我迅速到P3 Ultra购买的售后机友群内发出询问,群友纷纷踊跃提出建议。一个群友提到,他在安装飞牛云的时候出现过类似的问题,最后是通过在其他机器上安装,把硬盘拿过来,再修复引导解决的。推断:只要系统分区无问题,修复 GRUB 并提供 fallback 启动文件即可完成引导。

Disk & Boot Mode Details

  • 启动模式:UEFI Only(Lenovo唯一可选模式),Secure Boot 关闭
  • 目标磁盘为 NVMe;安装器默认创建 1 GiB 的 FAT32 ESP 挂载到 /boot/efi,其余为 LVM(/dev/pve/root 等)。
  • 其他品牌/机型若对 NVRAM 有保护策略,可能同样出现写入失败的症状。建议查询是否有对应的UEFI设置项。

Investigation & Actions

首先,我们安装直到最后的报错页面,然后不拔下安装盘选择重启。此时我们会再次从安装镜像启动。选择Advanced Option,然后选择Rescue Mode启动,此时将正常启动到PVE运行界面。使用root和原来设置的密码启动。

这篇教程默认使用者在第一次安装的时候选择直接在整个盘上安装,让PVE安装器自行决定如何分区。

Mounting Filesystems (ESP, LVM)

  1. 激活 LVM 并确认逻辑卷路径:

    1
    2
    3
    
    vgscan
    vgchange -ay
    lvs -o vg_name,lv_name,lv_path,lv_size
    
  2. 挂载根与 ESP(以下以常见的 pve/root 与 ESP 在 nvme0n1p2 为例):

    1
    2
    3
    4
    5
    6
    7
    
    DISK=/dev/nvme0n1
    ROOT=/dev/pve/root
    ESP=/dev/nvme0n1p2
    
    mount "$ROOT" /mnt
    mkdir -p /mnt/boot/efi
    mount "$ESP" /mnt/boot/efi
    

Preparing the Chroot

chroot 是什么? 它把当前进程看到的“/”切换到指定目录(这里是 /mnt),让我们在“已安装系统”的环境中运行命令,好比真正启动进系统一样。

在 chroot 前,先把必要的内核伪文件系统“带进去”,并确保固件变量接口可用:

1
2
3
4
5
6
mount --rbind /dev  /mnt/dev
mount --rbind /proc /mnt/proc
mount --rbind /sys  /mnt/sys
mount -t efivarfs efivarfs /mnt/sys/firmware/efi/efivars

chroot /mnt /bin/bash

efivarfs 是什么? 它是 Linux 暴露 UEFI NVRAM 变量的虚拟文件系统,路径是 /sys/firmware/efi/efivars。在 chroot 里把它挂上,grub-install/efibootmgr 才能与固件交互。

Reinstalling GRUB to the ESP

  1. 直接把 GRUB 的 EFI 程序写入 ESP:

    1
    2
    3
    4
    5
    
    grub-install \
      --target=x86_64-efi \
      --efi-directory=/boot/efi \
      --bootloader-id=proxmox \
      --recheck || true
    
  2. 若提示无法写 EFI 变量(常见于部分固件),用 不写 NVRAM 的方式再次安装:

    1
    2
    3
    4
    5
    6
    
    grub-install \
      --target=x86_64-efi \
      --efi-directory=/boot/efi \
      --bootloader-id=proxmox \
      --recheck \
      --no-nvram
    
  3. 生成配置:

    1
    
    update-grub
    

Handling NVRAM Write Failures

两种启动路径:

  • NVRAM 启动项:固件保存 Boot000X→某个磁盘/分区上的某个 .efi 文件;可用 efibootmgr 管理顺序与条目。
  • Fallback 路径:UEFI 规范规定在每块 EFI 磁盘上都要尝试 \EFI\BOOT\BOOTX64.EFI(x86_64)。

若 NVRAM 写入失败,使用 fallback 一样能稳定启动:我们只需把刚安装的 grubx64.efi 复制到 fallback 路径。

Creating the Fallback Boot Path

1
2
3
4
5
6
mkdir -p /boot/efi/EFI/BOOT
cp -f /boot/efi/EFI/proxmox/grubx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI

#(可选)对部分联想机型,添加厂商路径也有帮助:
mkdir -p /boot/efi/EFI/Lenovo
cp -f /boot/efi/EFI/BOOT/BOOTX64.EFI /boot/efi/EFI/Lenovo/BootX64.efi

First Successful Boot

重启、移除安装介质,固件会从 \EFI\BOOT\BOOTX64.EFI 启动进入系统。此后常规的内核更新会自动刷新 GRUB 配置。

Tiny maintenance note

grub-efi 升级后,EFI/proxmox/grubx64.efi 可能发生变化。建议同步更新 fallback:

1
sudo install -m 0644 /boot/efi/EFI/proxmox/grubx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI

你可以在任何与GRUB相关的 apt upgrade 后执行这个命令。

Root Cause Analysis

  • 安装器调用的 grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=proxmox --recheck 在部分设备上 创建 NVRAM 启动项失败(固件策略/权限/设置等原因)。
  • 加上 --no-nvram 可跳过写入 NVRAM,仅把引导文件放入 ESP;再通过 fallback 路径完成启动。
  • 由于系统文件和分区布局本身无问题,手动收尾即可恢复可启动状态。

Appendix A: Key Commands

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 激活 LVM
vgscan && vgchange -ay
lvs -o vg_name,lv_name,lv_path,lv_size

# 挂载根与 ESP
mount /dev/pve/root /mnt
mkdir -p /mnt/boot/efi && mount /dev/nvme0n1p2 /mnt/boot/efi

# 准备 chroot
mount --rbind /dev  /mnt/dev
mount --rbind /proc /mnt/proc
mount --rbind /sys  /mnt/sys
mount -t efivarfs efivarfs /mnt/sys/firmware/efi/efivars
chroot /mnt /bin/bash

# 重新安装 GRUB(若 NVRAM 写入失败则加 --no-nvram)
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=proxmox --recheck || true
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=proxmox --recheck --no-nvram
update-grub

# 创建 fallback
mkdir -p /boot/efi/EFI/BOOT
cp -f /boot/efi/EFI/proxmox/grubx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI

#(可选)联想厂商路径
mkdir -p /boot/efi/EFI/Lenovo
cp -f /boot/efi/EFI/BOOT/BOOTX64.EFI /boot/efi/EFI/Lenovo/BootX64.efi

Appendix B: Glossary (ESP, efivars, NVRAM, chroot)

  • ESP(EFI System Partition):UEFI 固件可读的 FAT32 分区,存放各操作系统的 .efi 启动程序与少量配置。通常挂载在 /boot/efi
  • efivars / efivarfs:Linux 暴露 UEFI NVRAM 变量的虚拟文件系统,位于 /sys/firmware/efi/efivars。读取/写入这些“文件”,实质是在读写固件变量(如 BootOrder、Boot000X、SecureBoot 等)。
  • NVRAM:主板固件中的非易失性存储区域,用于保存启动项等设置。
  • chroot:把当前进程视角下的根目录切换到指定目录(如 /mnt),便于在“目标系统”环境内运行命令进行修复。
  • fallback 路径:UEFI 规范定义的默认启动文件名(x86_64 为 \EFI\BOOT\BOOTX64.EFI)。当无有效 NVRAM 启动项时,固件会尝试该路径。
  • efibootmgr:前者把 GRUB 的 EFI 程序与相关文件安装到 ESP;后者用于创建/查看/调整 NVRAM 启动项。

此博客由GPT-5辅助写作,如有疑问可以随时联系作者,但作者也只能用GPT回答你😭

Built with Hugo
主题 StackJimmy 设计