Linux GRUB(Grand Unified Bootloader)是Linux系统中常用的引导加载程序,负责在系统启动时加载内核和initrd文件,并管理多系统启动菜单,当GRUB配置损坏、引导记录被覆盖或分区表变化时,系统可能无法正常启动,表现为黑屏、GRUB命令行提示或“error: no such partition”等错误,修复GRUB需要根据具体问题场景逐步排查,以下是详细修复流程。
修复前准备
- 准备启动介质:需要Linux Live CD/U盘(如Ubuntu、CentOS官方镜像),用于启动系统并访问终端。
- 确认分区信息:提前记录Linux系统的根分区(/)和引导分区(/boot,若独立)的设备名(如/dev/sda1、/dev/nvme0n1p2),可通过
lsblk
或fdisk -l
命令查看。 - 备份重要数据:若系统可部分启动,优先备份用户数据;若完全无法启动,需通过Live环境挂载分区后备份。
修复步骤
进入Live环境并挂载分区
从U盘启动系统,选择“Try Ubuntu”或“Live CD”模式,打开终端,使用lsblk
查看磁盘和分区,找到Linux根分区(通常文件系统为ext4/xfs,大小与系统分区匹配),假设根分区为/dev/sda2
,执行以下命令挂载:
sudo mount /dev/sda2 /mnt # 挂载根分区 # 若/boot独立为分区(如/dev/sda1),需额外挂载: sudo mount /dev/sda1 /mnt/boot
若为UEFI+GPT分区,还需挂载EFI系统分区(ESP,通常为FAT32格式,如/dev/sda1
):
sudo mount /dev/sda1 /mnt/boot/efi
重新安装GRUB引导记录
根据启动模式(BIOS/UEFI)选择对应的安装命令:
-
BIOS模式(MBR分区表):
sudo grub-install --target=i386-pc --boot-directory=/mnt/boot /dev/sda
参数说明:
--target=i386-pc
指定BIOS架构,--boot-directory=/mnt/boot
指定GRUB安装目录(与挂载点一致),/dev/sda
为安装引导的磁盘(而非分区)。 -
UEFI模式(GPT分区表):
sudo grub-install --target=x86_64-efi --efi-directory=/mnt/boot/efi --boot-directory=/mnt/boot --removable
参数说明:
--target=x86_64-efi
指定UEFI架构,--efi-directory
指定ESP挂载点,--removable
表示安装到ESP分区的默认路径(避免路径错误)。
生成GRUB配置文件
GRUB配置文件grub.cfg
通过update-grub
命令自动生成,包含内核路径、启动参数等信息:
sudo chroot /mnt # 切换到系统环境 update-grub # 扫描内核并生成grub.cfg exit # 退出chroot
若提示“/boot/grub/grub.cfg not found”,需先检查/mnt/boot
目录是否存在,或手动创建/mnt/boot/grub
。
修复initramfs(可选)
若内核启动时提示“initramfs unpacking failed”或找不到根设备,需重新生成initramfs文件:
sudo chroot /mnt update-initramfs -u # 更新当前内核的initramfs # 若需更新所有内核: update-initramfs -u -k all exit
验证GRUB配置
重启系统,移除U盘,检查是否进入GRUB启动菜单,若仍无法启动,可通过Live环境手动编辑grub.cfg
(位于/mnt/boot/grub/
),检查linux
和initrd
行中的根分区路径是否正确。
# 手动编辑grub.cfg(使用nano/vim) sudo nano /mnt/boot/grub/grub.cfg
确保root
参数指向正确分区(如root=/dev/sda2
),linux
行包含内核路径(如/boot/vmlinuz-5.15.0-88-generic
)。
常见问题与解决
以下为修复过程中可能遇到的错误及处理方法:
错误提示 | 可能原因 | 解决方案 |
---|---|---|
grub-install: error: cannot find EFI directory. |
UEFI模式下ESP分区未挂载或路径错误 | 检查/mnt/boot/efi 是否正确挂载,确认ESP分区设备名 |
error: no such partition. |
GRUB配置文件中的分区路径错误 | 使用lsblk 确认分区设备名,手动修改grub.cfg 中的root 参数 |
Symbolic link /boot/grub/locale/en.mo not found. |
缺少locale文件 | 在chroot环境中执行apt install locales (Debian/Ubuntu)或yum install glibc-common (CentOS/RHEL) |
Failed to mount /mnt/boot: No medium found |
引导分区未识别或设备名错误 | 重新执行lsblk 确认分区,检查分区是否为Linux文件系统 |
双系统修复(Windows+Linux)
若为双系统且Windows覆盖了GRUB,需在修复GRUB后添加Windows启动项:
- 在chroot环境中安装
os-prober
(用于自动检测其他系统):sudo apt install os-prober # Debian/Ubuntu sudo yum install os-prober # CentOS/RHEL(可能需EPEL源)
- 运行
os-prober
扫描Windows系统:os-prober
- 更新GRUB配置以添加Windows启动项:
update-grub
FAQs
Q1:修复GRUB后仍提示“error: no such partition”,如何解决?
A:通常因grub.cfg
中的分区路径错误,进入Live环境挂载分区后,手动编辑/mnt/boot/grub/grub.cfg
,将root
参数修改为实际分区设备名(如root=/dev/sdb1
),并确保linux
和initrd
路径正确,若为UEFI模式,还需确认ESP分区挂载点是否正确。
Q2:如何预防GRUB引导损坏?
A:可通过以下方式降低风险:
- 定期备份GRUB配置文件:
sudo cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak
。 - 避免直接在Windows中修复引导(如使用bootrec/fixmbr),可能覆盖GRUB。
- 使用启动管理工具(如EasyBCD)管理多系统启动,而非手动修改GRUB。
- 更新系统时确保GRUB配置同步更新:
sudo update-grub
。
通过以上步骤,可解决大部分GRUB引导问题,若问题仍存在,需检查分区表是否损坏(使用testdisk
工具修复)或磁盘硬件故障。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/23784.html