0%

PVE EFI 修复 - 换硬件后

【实战记录】Proxmox VE (PVE) EFI 引导损坏修复全流程

摘要:本文记录了一次 Proxmox VE (PVE) 系统引导丢失后的完整修复过程。涵盖使用 Debian LiveCD 进行 chroot 挂载、修复 UEFI GRUB 引导、清理多余 NVRAM 引导项,以及解决因格式化 ESP 分区导致 /etc/fstab UUID 不匹配进入 Emergency Mode 的终极坑点。

0. 环境与故障背景

  • 设备形态:AMD Ryzen 8845HS 迷你主机 (裸金属安装 PVE)
  • 磁盘布局(非默认 LVM,为非 LVM 直装架构):
    • /dev/nvme1n1p1: 512MB (EFI 系统引导分区, FAT32)
    • /dev/nvme1n1p2: 930GB (PVE 根目录 root 分区, ext4)
    • /dev/nvme1n1p3: 977MB (Swap 交换分区)
  • 故障现象:开机直接进入 BIOS,无法识别 PVE 启动项。

1. 准备工作与救援环境挂载

插入 Debian / PVE Live U 盘,必须以 UEFI 模式启动进入 LiveCD 终端。

1.1 确认 LiveCD 处于 UEFI 模式

1
2
ls /sys/firmware/efi/efivars
# 如果输出一堆文件,说明成功处于 UEFI 模式;如果提示 No such file...,请重启切换 U 盘的 UEFI 引导。

1.2 挂载系统分区与必要的虚拟文件系统

关键避坑点:除了常规的 dev, proc, sys 外,**必须挂载 efivars**,否则后续 grub-install 会报 EFI variables cannot be set 错误!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 挂载 PVE 根目录
mount /dev/nvme1n1p2 /mnt

# 2. 挂载 EFI 引导分区
mount /dev/nvme1n1p1 /mnt/boot/efi

# 3. 绑定系统虚拟文件系统(含 efivars)
mount --bind /dev /mnt/dev
mount --bind /dev/pts /mnt/dev/pts
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /sys/firmware/efi/efivars /mnt/sys/firmware/efi/efivars
mount --bind /run /mnt/run

# 4. 进入 chroot 环境
chroot /mnt

2. 重新安装与修复 GRUB 引导

进入 chroot 环境后,重新将 GRUB 写入 EFI 分区及主板 NVRAM。

1
2
3
4
5
6
7
8
# 1. 重新安装 GRUB 到 NVRAM
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=proxmox --recheck

# 2. 写入 UEFI 默认回退路径(双重保险,防止 BIOS 找不到 NVRAM)
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=proxmox --removable --recheck

# 3. 重新生成 GRUB 菜单配置文件
update-grub

3. 清理主板 NVRAM 中残留/无效的 Boot 引导项

使用 efibootmgr 查看并清理 BIOS 里失效的引导条目(如旧的 Windows、Debian 留下的无效项)。

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 查看当前引导项与启动顺序
efibootmgr -v

# 2. 根据生成的 Boot000X 编号删除无用项(示例删除 0000、0002、0003、0004)
efibootmgr -b 0000 -B
efibootmgr -b 0002 -B
efibootmgr -b 0003 -B
efibootmgr -b 0004 -B

# 3. 确认最终 BootOrder,应确保 proxmox 为第一优先级
efibootmgr
# 预期输出示例:BootOrder: 0001 (0001 为 proxmox)

4. 终极踩坑:解决重启掉入 Emergency Mode (紧急模式)

4.1 故障现象

修复引导后重启拔掉 U 盘,系统虽然加载了内核,但卡在 /dev/nvme1n1p2: clean,超时 90 秒后报错:
Timed out waiting for device dev-disk-by-uuid-xxxx.device - /boot/efi
Dependency failed for boot-efi.mount - /boot/efi
并掉入 Emergency Mode

1
Give root password for system maintenance:

4.2 故障原因分析

在修复过程中,如果使用过 proxmox-boot-tool formatmkfs.fat 格式化过 EFI 分区,EFI 分区的 UUID 会发生改变。而 PVE 的 /etc/fstab 配置文件里依然记录的是格式化前的旧 UUID,导致系统启动挂载 /boot/efi 时超时失败。

4.3 解决步骤

  1. 在控制台输入 root 密码登录 Emergency Mode。
  2. 查看当前 EFI 分区真正的 新 UUID
    1
    2
    blkid /dev/nvme1n1p1
    # 示例输出:/dev/nvme1n1p1: UUID="0685-DC33" TYPE="vfat" ...
  3. 修改 /etc/fstab 挂载文件:
    1
    nano /etc/fstab
    找到含有 /boot/efi 的那一行,将 UUID=旧UUID 修改为刚才查到的 新 UUID(如 0685-DC33)。
  4. 保存退出(Ctrl+O -> Enter -> Ctrl+X),然后执行挂载测试:
    1
    2
    systemctl daemon-reload
    mount -a # 若无任何报错,说明修改正确
  5. 重启系统:
    1
    reboot

5. 总结与经验教训 (Troubleshooting FAQ)

报错信息 / 现象 产生原因 解决方案
EFI variables cannot be set on this system chroot 时未挂载 efivars 或 LiveCD 处于 Legacy 模式 LiveCD 使用 UEFI 启动,并执行 mount --bind /sys/firmware/efi/efivars /mnt/sys/firmware/efi/efivars
E: bootctl is not available - make sure systemd-boot-tools is installed 系统采用 GRUB 架构,误用了基于 systemd-boot 的 proxmox-boot-tool 放弃使用 proxmox-boot-tool init,直接使用原生的 grub-install
Timed out waiting for device ... /boot/efi 格式化 EFI 分区后,UUID 发生改变,与 /etc/fstab 不一致 使用 blkid 查出新 UUID,更新 /etc/fstab/boot/efi 的记录

经过以上步骤,系统成功恢复,PVE 控制台网页与所有虚拟机/LXC 容器恢复正常访问!