🔧 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-install或 grub2-install来修复•❌ UEFI系统:GRUB以EFI可执行文件(.efi)的形式存储在EFI系统分区(ESP)中,不能直接运行grub-install/grub2-install在启动磁盘上•⚠️ 重要警告:在UEFI系统上,如果直接在启动磁盘上运行 grub-install或 grub2-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.efi或 grubx64.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-x64和 shim-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-install或 grub2-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.efi和 grubx64.efi•RHEL 6不支持安全启动(Secure Boot)
⚠️ 四、UEFI系统GRUB修复的5大陷阱:避免踩坑
了解这些陷阱可以帮助你避免在修复过程中出现问题:
陷阱1:在UEFI系统上直接运行grub-install
•❌ 错误做法:在UEFI系统上直接运行 grub-install或 grub2-install在启动磁盘上•⚠️ 风险:可能会破坏UEFI启动配置,导致系统完全无法启动•✅ 正确做法:重新安装 grub2-efi-x64和 shim-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-x64和 shim-x64,忘记重新安装 grub2-common•⚠️ 风险:如果 /boot/efi/EFI/redhat/grub.cfg被删除,系统仍然无法启动•✅ 正确做法:在RHEL 9+上,除了重新安装 grub2-efi-x64和 shim-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