
1. GRUB引导故障的常见场景与诊断遇到GRUB引导故障时最常见的现象就是开机后卡在grub命令行界面或者直接黑屏无响应。这种情况往往发生在以下几种场景双系统安装后比如在Windows旁边安装Linux时Windows的引导程序可能会覆盖GRUB内核升级后新内核的initramfs镜像生成失败会导致无法加载根文件系统磁盘分区调整后修改分区表可能导致GRUB找不到原来的/boot分区意外断电或强制关机可能导致GRUB的配置文件损坏我遇到过最棘手的情况是一台老服务器在断电后GRUB的stage1.5损坏了。当时开机直接显示Error: no such partition连救援模式都进不去。后来是通过Live CD才修复成功。诊断GRUB问题时首先要确认你的系统使用的是传统BIOSMBR还是UEFIGPT。这个区别很重要因为修复方法完全不同。检查方法很简单# 查看是否使用EFI ls /sys/firmware/efi # 如果目录存在就是UEFI启动 # 查看分区表类型 sudo parted -l | grep Partition Table # 显示msdos就是MBRgpt就是GPT2. MBR环境下的GRUB修复实战在传统BIOSMBR环境中GRUB分为三个部分stage1446字节存放在MBR中stage1.5存放在MBR之后的间隙stage2存放在/boot分区。这种设计导致MBR一旦损坏整个引导链就会断裂。2.1 手动引导临时方案当GRUB损坏但还能进入grub命令行时可以尝试手动引导。这个方法适合应急但每次启动都要重复操作grub ls # 列出所有磁盘和分区 grub set root(hd0,msdos1) # 设置/boot所在分区 grub linux /vmlinuz-$(uname -r) root/dev/sda1 # 加载内核 grub initrd /initramfs-$(uname -r).img # 加载initramfs grub boot # 启动系统注意这里的(hd0,msdos1)对应第一个磁盘的第一个分区GRUB的编号从0开始。如果不知道哪个分区是/boot可以逐个尝试ls (hd0,msdos1)/查看内容。2.2 完整修复MBR引导更彻底的修复方法是重装GRUB到MBR。需要准备一个Live CD/USB启动到Live环境后先挂载原系统的根分区和/boot分区如果有单独分区sudo mkdir /mnt/sysroot sudo mount /dev/sda1 /mnt/sysroot # 假设sda1是根分区 sudo mount /dev/sda2 /mnt/sysroot/boot # 如果有单独/boot分区绑定必要的目录并chrootsudo mount --bind /dev /mnt/sysroot/dev sudo mount --bind /proc /mnt/sysroot/proc sudo mount --bind /sys /mnt/sysroot/sys sudo chroot /mnt/sysroot重新安装GRUBgrub-install /dev/sda # 安装到磁盘而非分区 update-grub # 生成新的配置文件我曾遇到过一个坑在CentOS 7上执行grub-install时报failed to get canonical path错误。后来发现是因为/boot是单独的分区但没有挂载。记住一定要确保/boot分区正确挂载3. UEFI环境下的GRUB修复要点UEFIGPT环境的修复逻辑完全不同。UEFI不再使用MBR而是依赖ESP分区EFI System Partition中的.efi文件。常见的故障点是ESP分区被意外格式化NVRAM中的启动项丢失多系统冲突导致默认启动项被修改3.1 检查ESP分区首先确认ESP分区是否正常挂载mount | grep efivars # 应该显示efivars挂载点 ls /boot/efi/EFI # 查看是否存在发行版对应的目录如果ESP分区损坏需要先修复文件系统假设ESP是/dev/sda1sudo mkfs.vfat -F32 /dev/sda1 sudo mount /dev/sda1 /boot/efi3.2 重装GRUB到ESP在chroot环境中执行grub-install --targetx86_64-efi --efi-directory/boot/efi --bootloader-idGRUB关键参数说明--target指定EFI架构--efi-directoryESP分区挂载点--bootloader-id在UEFI启动菜单中显示的名称3.3 修复NVRAM启动项有时候GRUB文件完好但UEFI固件找不到它。这时可以用efibootmgr工具sudo efibootmgr -c -d /dev/sda -p 1 -L GRUB -l \\EFI\\GRUB\\grubx64.efi这个命令会在NVRAM中创建新的启动项。注意Windows经常会在更新后清除Linux的启动项这是双系统用户的常见痛点。4. 特殊场景处理技巧4.1 双系统引导修复Windows和Linux双系统最容易出现引导冲突。我的经验是先安装Windows再安装Linux在BIOS中禁用快速启动和安全启动使用os-prober自动检测其他系统sudo grub2-mkconfig -o /boot/grub2/grub.cfg如果Windows分区调整导致UUID变化需要手动编辑/etc/grub.d/40_custom添加正确的启动项。4.2 加密分区的处理对于LUKS加密的根分区GRUB需要特殊配置在/etc/default/grub中添加GRUB_ENABLE_CRYPTODISKy重新生成initramfssudo dracut -f安装GRUB时会提示输入密码这个密码就是LUKS密码4.3 无Live环境的应急方案如果没有Live USB可以尝试从其他Linux系统网络引导sudo mount /dev/sda1 /mnt sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo chroot /mnt这个方法适合服务器环境但要求原系统的文件系统没有损坏。