Linux故障诊断系列2.2-诊断系统启动问题-在基于 UEFI 的计算机上重新安装 GRUB 和 GRUB2

71 阅读16分钟

🔧 UEFI系统GRUB修复终极指南 | 主板换了、grub.cfg丢了?6步搞定GRUB重新安装!

📖 写在开头:你是不是也这样?

第一段:痛点场景

你有没有遇到过这样的绝望场景?服务器突然无法启动,屏幕一片黑,连GRUB菜单都看不到。你尝试各种方法,但系统就是卡在启动阶段,你连操作系统都进不去!

更糟糕的是,你发现:

•主板刚被更换,系统现在无法启动到GRUB•/boot/efi/EFI/redhat/grub.cfg文件被误删或损坏•系统在UEFI模式下,你不敢随便运行 grub-install,怕把系统搞得更糟

你尝试进入救援模式,但不知道下一步该做什么。老板问你:"为什么系统启动不了?"你只能无奈地回答:"GRUB出问题了,但不知道怎么修复..."这种"GRUB损坏,系统无法启动"的恶性循环,是不是让你抓狂?

如果你也经历过这种"UEFI系统GRUB损坏无法启动"的噩梦,那么今天FYC要告诉你一个好消息:在UEFI系统上重新安装GRUB其实有标准流程!只要按照正确的步骤操作,就能安全地恢复GRUB启动!

第二段:解决方案概述

今天我们要聊的是在基于UEFI的计算机上重新安装GRUB和GRUB2,这是RHEL系统维护中的关键技能。我们将从UEFI启动原理讲起,带你一步步学会如何在救援模式下重新安装GRUB,以及如何正确添加UEFI启动项。

本文将为你带来:

•🎯 UEFI启动原理:为什么UEFI系统不能直接运行grub-install?UEFI启动流程是怎样的?•🔧 完整修复流程:从进入救援模式到重新安装GRUB的6步完整指南•✅ RHEL版本差异:RHEL 6、RHEL 7+、RHEL 9+的不同处理方式•⚠️ 关键注意事项:UEFI系统GRUB修复的5大陷阱,避免踩坑•💡 实战案例解析:主板更换、grub.cfg丢失等真实场景的处理方法

跟着FYC走,从此告别"UEFI系统GRUB损坏无法启动"的时代!

第三段:5维度评分表

维度评分说明
难度等级⭐⭐⭐⭐需要深入理解UEFI启动流程和GRUB机制
实用价值⭐⭐⭐⭐⭐解决UEFI系统无法启动的关键问题
技术深度⭐⭐⭐⭐涉及UEFI、GRUB2、shim、efibootmgr
可操作性⭐⭐⭐⭐⭐所有命令和配置都可以直接使用
紧急性⭐⭐⭐⭐⭐系统无法启动通常是最高优先级的故障,影响范围广

📚 正文:干货满满,但要"喂到嘴里"!

⚡ 一、UEFI启动原理:为什么不能直接运行grub-install?

📋 UEFI vs BIOS:启动流程的根本差异

在传统的BIOS系统中,启动流程相对简单:

BIOS → MBR(主引导记录)→ GRUB → 内核启动

但在UEFI系统中,启动流程更加复杂:

UEFI固件 → EFI系统分区(ESP)→ shim.efi → grubx64.efi → 内核启动

关键差异

•✅ BIOS系统:GRUB安装在MBR或分区引导扇区,可以直接运行 grub-installgrub2-install来修复•❌ UEFI系统:GRUB以EFI可执行文件(.efi)的形式存储在EFI系统分区(ESP)中,不能直接运行grub-install/grub2-install在启动磁盘上•⚠️ 重要警告:在UEFI系统上,如果直接在启动磁盘上运行 grub-installgrub2-install,可能会破坏UEFI启动配置!

🎯 UEFI启动的关键组件

在UEFI系统中,启动需要以下关键组件:

1EFI系统分区(ESP) :通常是 /boot/efi,FAT32格式2shim.efi:安全启动的桥梁,位于 /boot/efi/EFI/redhat/shimx64.efi3grubx64.efi:GRUB2的EFI可执行文件,位于 /boot/efi/EFI/redhat/grubx64.efi4grub.cfg:GRUB配置文件,位于 /boot/efi/EFI/redhat/grub.cfg(RHEL 9+)或 /boot/grub2/grub.cfg5UEFI启动项:存储在主板NVRAM中,指向shim.efi或grub.efi

文件结构示例

/boot/efi/EFI/redhat/
├── shimx64.efi          # 安全启动的桥梁
├── grubx64.efi          # GRUB2 EFI可执行文件
├── grub.cfg             # GRUB配置文件(RHEL 9+)
└── BOOTX64.CSV          # 启动项配置
📊 常见的GRUB损坏场景

•❌ 主板更换:新主板的UEFI固件没有正确的启动项,无法找到GRUB•❌ grub.cfg被删除/boot/efi/EFI/redhat/grub.cfg被误删或损坏•❌ EFI文件损坏shimx64.efigrubx64.efi文件损坏•❌ ESP分区问题:EFI系统分区损坏或无法挂载•❌ UEFI启动项丢失:NVRAM中的启动项被清除或损坏


🔧 二、UEFI系统GRUB修复:6步完整指南

修复UEFI系统的GRUB需要6个步骤,每一步都很关键!

Step 1:进入救援模式

首先,必须进入救援模式才能修复GRUB。

方法1:使用安装介质进入救援模式

# 1. 使用RHEL安装介质(DVD或USB)启动系统
# 2. 在安装界面选择"Troubleshooting""Rescue a Red Hat Enterprise Linux system"
# 3. 按照提示选择语言、键盘布局等
# 4. 选择是否启动网络(建议选择Yes)
# 5. 选择是否查找并挂载已安装的系统(选择Continue)
# 6. 系统会自动挂载到 /mnt/sysimage

方法2:使用grub rescue(如果还能看到GRUB界面)

如果系统还能显示GRUB界面,可以尝试使用GRUB命令行:

# 在GRUB界面按 'c' 进入命令行模式
grub> set root=(hd0,gpt1)  # 设置ESP分区
grub> linux /vmlinuz-$(uname -r) root=/dev/mapper/rhel-root
grub> initrd /initramfs-$(uname -r).img
grub> boot

⚠️ 重要提示

•进入救援模式后,系统会挂载到 /mnt/sysimage•需要 chroot/mnt/sysimage才能执行修复操作•确保网络可用(如果需要下载包)

Step 2:挂载系统并chroot

进入救援模式后,需要挂载系统并切换到系统根目录。

# 1. 检查系统是否已自动挂载
ls /mnt/sysimage

# 2. 如果没有自动挂载,手动挂载
# 假设根分区是 /dev/sda2,ESP分区是 /dev/sda1
mkdir -p /mnt/sysimage
mount /dev/sda2 /mnt/sysimage
mount /dev/sda1 /mnt/sysimage/boot/efi

# 3. 挂载必要的虚拟文件系统
mount --bind /dev /mnt/sysimage/dev
mount --bind /proc /mnt/sysimage/proc
mount --bind /sys /mnt/sysimage/sys
mount --bind /run /mnt/sysimage/run

# 4. chroot到系统根目录
chroot /mnt/sysimage /bin/bash

# 5. 验证chroot成功
pwd  # 应该显示 /
ls /boot/efi  # 应该能看到EFI系统分区的内容

⚠️ 重要提示

•必须正确挂载ESP分区(通常是 /boot/efi)•必须挂载虚拟文件系统(dev、proc、sys、run)才能正常执行命令•chroot后,所有操作都在原系统中进行

Step 3:重新安装GRUB相关包(RHEL 7及以上)

对于RHEL 7及以上版本,需要重新安装 grub2-efi-x64shim-x64包。

# 1. 检查当前系统版本
cat /etc/redhat-release

# 2. 重新安装grub2-efi-x64和shim-x64
# 这会重新安装所有 /boot/efi/EFI/ 下的文件
yum reinstall grub2-efi-x64 shim-x64

# 或者使用rpm命令(如果yum不可用)
# rpm -ivh --replacepkgs --replacefiles grub2-efi-x64-<version>.rpm shim-x64-<version>.rpm

⚠️ 重要提示

不要运行 grub-installgrub2-install在启动磁盘上! •重新安装包会自动恢复 /boot/efi/EFI/redhat/下的所有EFI文件•如果网络不可用,需要先配置网络或使用本地仓库

Step 4:RHEL 9+额外步骤:重新安装grub2-common

对于RHEL 9及更高版本,如果 /boot/efi/EFI/redhat/grub.cfg被删除,需要重新安装 grub2-common

# 检查RHEL版本
cat /etc/redhat-release

# 如果是RHEL 9或更高版本,重新安装grub2-common
# 这会触发scriptlet,生成 /boot/efi/EFI/redhat/grub.cfg
yum reinstall grub2-common

⚠️ 重要提示

•RHEL 9+将 grub.cfg存储在 /boot/efi/EFI/redhat/grub.cfg•重新安装 grub2-common会触发post-install脚本,自动生成 grub.cfg•这是RHEL 9+特有的步骤

Step 5:添加UEFI启动项

重新安装包后,可能需要添加新的UEFI启动项(特别是主板更换的情况)。

⚠️ 关键警告

如果系统当前从不同的系统启动(例如,磁盘被挂载到救援虚拟机),不要运行 efibootmgr命令!

这个命令会更新主板上的NVRAM;如果从不同的系统运行,会更新当前启动环境的NVRAM,可能导致该系统处于损坏状态。

正确的操作方式

# 1. 确认当前系统是从原系统启动的(chroot后的系统)
# 2. 确认ESP分区的位置
df -h /boot/efi
# 输出示例:
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1       200M  100M  100M  50% /boot/efi

# 3. 确定磁盘设备(例如:/dev/sda)
# 4. 确定ESP分区号(通常是分区1,即 -p 1)

# 5. 添加UEFI启动项
# 对于RHEL 7/8/9/10:
efibootmgr -c -d /dev/sda -p 1 -l \EFI\redhat\shimx64.efi -L "Red Hat Enterprise Linux 8"

# 对于RHEL 7,替换为:
# efibootmgr -c -d /dev/sda -p 1 -l \EFI\redhat\shimx64.efi -L "Red Hat Enterprise Linux 7"

# 对于RHEL 9,替换为:
# efibootmgr -c -d /dev/sda -p 1 -l \EFI\redhat\shimx64.efi -L "Red Hat Enterprise Linux 9"

# 对于RHEL 10,替换为:
# efibootmgr -c -d /dev/sda -p 1 -l \EFI\redhat\shimx64.efi -L "Red Hat Enterprise Linux 10"

参数说明

-c:创建新的启动项•-d /dev/sda:指定磁盘设备(替换为实际的磁盘)•-p 1:指定ESP分区号(通常是1)•-l \EFI\redhat\shimx64.efi:指定EFI文件路径(注意使用双反斜杠)•-L "Red Hat Enterprise Linux X":启动项标签(根据系统版本修改)

Step 6:验证启动项并退出救援模式
# 1. 验证启动项已添加
efibootmgr -v

# 输出示例:
# BootCurrent: 0000
# Timeout: 0 seconds
# BootOrder: 0000,0001,0002
# Boot0000* Red Hat Enterprise Linux 8    HD(1,GPT,xxx-xxx-xxx,0x800,0x64000)/File(\EFI\redhat\shimx64.efi)

# 2. 验证EFI文件存在
ls -lh /boot/efi/EFI/redhat/
# 应该看到:
# shimx64.efi
# grubx64.efi
# grub.cfg (RHEL 9+)

# 3. 退出chroot
exit

# 4. 卸载文件系统
umount /mnt/sysimage/run
umount /mnt/sysimage/sys
umount /mnt/sysimage/proc
umount /mnt/sysimage/dev
umount /mnt/sysimage/boot/efi
umount /mnt/sysimage

# 5. 重启系统
reboot

⚠️ 重要提示

•如果启动项添加正确,系统应该能正常启动•如果问题仍然存在,需要创建Red Hat支持案例,并提供 efibootmgr -v的输出


🔍 三、RHEL 6的特殊处理:使用grub包

对于RHEL 6,处理方式略有不同,因为RHEL 6使用的是旧版本的GRUB。

# 1. 进入救援模式并chroot(参考Step 1和Step 2)

# 2. 重新安装grub包
# 这会重新安装 /boot/efi/EFI/redhat/grub.efi 文件
yum reinstall grub

# 或者使用rpm命令
# rpm -ivh --replacepkgs --replacefiles grub-<version>.rpm

# 3. 添加UEFI启动项
# 注意:RHEL 6使用 grub.efi,而不是 shimx64.efi
efibootmgr -c -d /dev/sda -p 1 -l \EFI\redhat\grub.efi -L "Red Hat Enterprise Linux 6"

# 4. 验证并重启
efibootmgr -v
reboot

关键差异

•RHEL 6使用 grub包,而不是 grub2-efi-x64•RHEL 6的EFI文件是 grub.efi,而不是 shimx64.efigrubx64.efi•RHEL 6不支持安全启动(Secure Boot)


⚠️ 四、UEFI系统GRUB修复的5大陷阱:避免踩坑

了解这些陷阱可以帮助你避免在修复过程中出现问题:

陷阱1:在UEFI系统上直接运行grub-install

•❌ 错误做法:在UEFI系统上直接运行 grub-installgrub2-install在启动磁盘上•⚠️ 风险:可能会破坏UEFI启动配置,导致系统完全无法启动•✅ 正确做法:重新安装 grub2-efi-x64shim-x64包,让包管理器自动处理

示例

# ❌ 错误:不要这样做!
grub2-install /dev/sda

# ✅ 正确:重新安装包
yum reinstall grub2-efi-x64 shim-x64
陷阱2:从不同系统运行efibootmgr

•❌ 错误做法:将磁盘挂载到救援虚拟机,然后从虚拟机运行 efibootmgr•⚠️ 风险:会更新救援虚拟机的NVRAM,而不是原系统的NVRAM,可能导致原系统无法启动•✅ 正确做法:确保从原系统(或chroot到原系统)运行 efibootmgr

场景说明

# ❌ 错误场景:
# 1. 将原系统磁盘挂载到救援虚拟机
# 2. 在救援虚拟机上运行 efibootmgr
# 结果:更新了救援虚拟机的NVRAM,原系统仍然无法启动

# ✅ 正确场景:
# 1. 使用安装介质在原系统上启动救援模式
# 2. chroot到原系统
# 3. 在原系统中运行 efibootmgr
# 结果:更新了原系统的NVRAM,系统可以正常启动
陷阱3:忘记重新安装grub2-common(RHEL 9+)

•❌ 错误做法:在RHEL 9+上只重新安装 grub2-efi-x64shim-x64,忘记重新安装 grub2-common•⚠️ 风险:如果 /boot/efi/EFI/redhat/grub.cfg被删除,系统仍然无法启动•✅ 正确做法:在RHEL 9+上,除了重新安装 grub2-efi-x64shim-x64,还要重新安装 grub2-common

检查方法

# 检查grub.cfg是否存在
ls -lh /boot/efi/EFI/redhat/grub.cfg

# 如果不存在,重新安装grub2-common
yum reinstall grub2-common
陷阱4:ESP分区未正确挂载

•❌ 错误做法:chroot后没有挂载ESP分区,直接重新安装包•⚠️ 风险:包重新安装后,EFI文件无法写入ESP分区,修复失败•✅ 正确做法:确保ESP分区已正确挂载到 /boot/efi

验证方法

# 检查ESP分区是否已挂载
df -h /boot/efi

# 检查ESP分区内容
ls -lh /boot/efi/EFI/redhat/

# 如果为空或不存在,需要先挂载ESP分区
mount /dev/sda1 /boot/efi
陷阱5:使用错误的efibootmgr参数

•❌ 错误做法:使用错误的磁盘设备、分区号或EFI文件路径•⚠️ 风险:创建的启动项指向错误的文件,系统仍然无法启动•✅ 正确做法:仔细确认磁盘设备、分区号和EFI文件路径

验证步骤

# 1. 确认ESP分区位置
df -h /boot/efi
# 输出:/dev/sda1 on /boot/efi

# 2. 确认磁盘设备(去掉分区号)
# /dev/sda1 → /dev/sda

# 3. 确认分区号(通常是1)
# /dev/sda1 → 分区号是1

# 4. 确认EFI文件存在
ls -lh /boot/efi/EFI/redhat/shimx64.efi

# 5. 使用正确的参数创建启动项
efibootmgr -c -d /dev/sda -p 1 -l \EFI\redhat\shimx64.efi -L "Red Hat Enterprise Linux 8"

💡 五、实战案例:主板更换后GRUB修复

场景描述

某生产环境服务器的主板因故障被更换,更换后系统无法启动,屏幕显示"Boot device not found"或直接进入UEFI设置界面。运维团队需要修复GRUB,使系统能够正常启动。

问题分析

•✅ 根本原因:新主板的UEFI固件没有正确的启动项,无法找到GRUB EFI文件•✅ 影响范围:系统完全无法启动,无法进入操作系统•✅ 修复方案:进入救援模式,重新安装GRUB包,添加UEFI启动项

修复步骤
# ======== Step 1: 进入救援模式 ======
# 1. 使用RHEL安装介质启动
# 2. 选择"Troubleshooting" → "Rescue a Red Hat Enterprise Linux system"
# 3. 选择启动网络(Yes)
# 4. 选择查找并挂载已安装的系统(Continue)

# ====== Step 2: 挂载系统并chroot ======
# 检查系统是否已自动挂载
ls /mnt/sysimage

# 如果没有自动挂载,手动挂载
# 假设根分区是 /dev/sda2,ESP分区是 /dev/sda1
mount /dev/sda2 /mnt/sysimage
mount /dev/sda1 /mnt/sysimage/boot/efi

# 挂载虚拟文件系统
mount --bind /dev /mnt/sysimage/dev
mount --bind /proc /mnt/sysimage/proc
mount --bind /sys /mnt/sysimage/sys
mount --bind /run /mnt/sysimage/run

# chroot到系统根目录
chroot /mnt/sysimage /bin/bash

# ====== Step 3: 检查系统版本 ======
cat /etc/redhat-release
# 输出:Red Hat Enterprise Linux release 8.8 (Ootpa)

# ====== Step 4: 重新安装GRUB包 ======
# 重新安装grub2-efi-x64和shim-x64
yum reinstall grub2-efi-x64 shim-x64

# 验证EFI文件已恢复
ls -lh /boot/efi/EFI/redhat/
# 应该看到:
# shimx64.efi
# grubx64.efi

# ====== Step 5: 确认ESP分区位置 ======
df -h /boot/efi
# 输出:
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1       200M  100M  100M  50% /boot/efi

# 磁盘设备:/dev/sda
# 分区号:1

# ====== Step 6: 添加UEFI启动项 ======
efibootmgr -c -d /dev/sda -p 1 -l \EFI\redhat\shimx64.efi -L "Red Hat Enterprise Linux 8"

# ====== Step 7: 验证启动项 ======
efibootmgr -v
# 输出:
# BootCurrent: 0000
# Timeout: 0 seconds
# BootOrder: 0000,0001,0002
# Boot0000* Red Hat Enterprise Linux 8    HD(1,GPT,xxx-xxx-xxx,0x800,0x64000)/File(\EFI\redhat\shimx64.efi)

# ====== Step 8: 退出并重启 ========
exit
umount /mnt/sysimage/run
umount /mnt/sysimage/sys
umount /mnt/sysimage/proc
umount /mnt/sysimage/dev
umount /mnt/sysimage/boot/efi
umount /mnt/sysimage
reboot
验证结果
# 系统重启后,应该能正常启动到GRUB菜单
# 登录系统后,验证启动项
efibootmgr -v

# 验证GRUB配置
cat /boot/efi/EFI/redhat/grub.cfg  # RHEL 9+
# 或
cat /boot/grub2/grub.cfg  # RHEL 7/8

# 检查系统启动日志
journalctl -b | grep -i grub

💡 六、实战案例:grub.cfg被删除后的修复(RHEL 9+)

场景描述

某RHEL 9系统上,/boot/efi/EFI/redhat/grub.cfg文件被误删,系统无法启动,显示"file not found"错误。运维团队需要恢复 grub.cfg文件。

问题分析

•✅ 根本原因:RHEL 9+将 grub.cfg存储在 /boot/efi/EFI/redhat/grub.cfg,该文件被删除后,GRUB无法找到配置文件•✅ 影响范围:系统无法启动,GRUB无法加载内核•✅ 修复方案:重新安装 grub2-common,触发scriptlet生成 grub.cfg

修复步骤
# ======== Step 1: 进入救援模式并chroot ======
# (参考案例一的Step 1和Step 2)

# ====== Step 2: 检查系统版本 ======
cat /etc/redhat-release
# 输出:Red Hat Enterprise Linux release 9.2 (Plow)

# ====== Step 3: 确认grub.cfg不存在 ======
ls -lh /boot/efi/EFI/redhat/grub.cfg
# 输出:ls: cannot access '/boot/efi/EFI/redhat/grub.cfg': No such file or directory

# ====== Step 4: 重新安装grub2-common ======
# 这会触发scriptlet,生成 /boot/efi/EFI/redhat/grub.cfg
yum reinstall grub2-common

# ====== Step 5: 验证grub.cfg已生成 ======
ls -lh /boot/efi/EFI/redhat/grub.cfg
# 输出:
# -rw-r--r-- 1 root root 1234 Dec 10 10:00 /boot/efi/EFI/redhat/grub.cfg

# 查看grub.cfg内容
cat /boot/efi/EFI/redhat/grub.cfg
# 应该包含内核启动配置

# ====== Step 6: 验证EFI文件完整 ======
ls -lh /boot/efi/EFI/redhat/
# 应该看到:
# shimx64.efi
# grubx64.efi
# grub.cfg  # 已恢复

# ====== Step 7: 退出并重启 ========
exit
# (卸载文件系统并重启,参考案例一)
reboot
验证结果
# 系统重启后,应该能正常启动
# 登录系统后,验证grub.cfg
cat /boot/efi/EFI/redhat/grub.cfg

# 检查GRUB配置是否正确
grub2-mkconfig -t grub2-efi-x64

🎁 写在结尾!

📋 价值总结

今天FYC为你带来了UEFI系统GRUB修复的完整攻略:

UEFI启动原理

•UEFI系统使用EFI可执行文件(.efi)而不是MBR•不能直接在启动磁盘上运行 grub-install•需要重新安装GRUB包,让包管理器自动处理

修复要点

•6步完整修复流程,每一步都很关键•RHEL 6、RHEL 7+、RHEL 9+的处理方式略有不同•必须正确挂载ESP分区并chroot到原系统•使用 efibootmgr添加UEFI启动项时要注意警告

关键陷阱

•5大陷阱要点,帮助你避免踩坑•不要在UEFI系统上直接运行 grub-install•不要从不同系统运行 efibootmgr•RHEL 9+需要额外重新安装 grub2-common

掌握了UEFI系统GRUB修复方法,你就能在主板更换、grub.cfg丢失等场景下快速恢复系统启动,确保业务连续性!

🎯 行动号召

觉得这篇文章还不够过瘾?想要看到更详细的GRUB修复脚本、UEFI启动项管理方法、以及更多真实案例吗?

👉 点击个人公众号【源宇宙十三站】 ,即可获取:

•📚 UEFI系统GRUB修复一键脚本(自动化6步修复流程)•🔧 efibootmgr完整使用指南(启动项管理、备份、恢复)•📊 UEFI系统启动故障排除检查清单(Checklist)•💡 更多GRUB修复案例解析(主板更换、多系统启动等)•🎯 UEFI vs BIOS启动流程对比分析(深入理解启动机制)

FYC的使命:让每个运维工程师都能成为启动故障诊断专家!技术要硬核,文案要上头!🔥


#运维 #Linux #GRUB #UEFI #启动故障 #系统修复 #故障排除 #RCA #根因分析 #技术干货 #RedHat #RHEL