简要版本解决办法
ls查看已有分区
ls (hd0,6)可以看到里面有GRUB目录
set命令查看当前的变量,发现都是hd0,7
set root=(hd0,6)
set prefix=(hd0,6)/grub
insmod normal
normal
每次开机都这么折腾一遍太麻烦,怎么办呢?解决办法:
sudo update-grub
sudo grub-install /dev/sda
Grub2的运行模式
Grub2中的运行模式,有了些许变化:
Normal 也就是常规模式,包括了菜单界面与控制台,即是 Grub 传统版的默认模式。
Rescue 这个是受限模式,比如 Grub 没有能找到 root 设备,就会进入这种模式。
通常,我们可以在 normal 模式下输入 'rescue' 即可进入 rescue 模式;在 rescue 模式下输入 'normal' 即可进入 normal 模式。
可是,通常后一种情况,需要我们做些一个相关设置才可以进入菜单:
1
2
3
set
root=(hd0,1) # 指定根分区为第一个磁盘,里面包含了 grub.cfg
set prefex=/boot/grub # 指定路径前缀,以构成菜单文件字符串'(hd0,1)/boot/grub/grub.cfg'(通常也不需要修改)
然后输入 'normal' 就可以换回常规的菜单模式了。
在rescue救援模式下只有很少的命令可以用:
set 查看环境变量,这里可以查看启动路径和分区。
ls 查看设备
insmod 加载模块
root 指定用于启动系统的分区,在救援模式下设置grub启动分区
prefix 设定grub启动路径
修复操作说明
我的linux在调整分区后,出现了grub rescue>
这表示grub2的配置文件坏了,由于分区调整或分区UUID改变造成GRUB2不能正常启动,从而进入修复模式(grub rescue)也称救援模式。
确认boot目录位置
1
2
3
4
5
6
7
8
# ls查看一下设备状态,可使用tab键自动补全,并有各分区提示信息
grub rescue> ls (hd0,msdos3)
error: bad filename.
# 提示:错误的文件名,我在测试时发现必须是后面加一个/
grub rescue> ls (hd0,msdos3)/
./ ../ lost+found/
# 通过查看发现在(hd0,msdos1)/下有一个boot目录
设置grub的启动分区和路径
set root=(hd0,msdos1) #设置grub启动分区
set prefix=(hd0,msdos1)/boot/grub/ #设置grub启动路径
# 查看一下设置情况,直接输入set可以查看root和prefix的配置
grub rescue> set
prefix=(hd0,msdos1)/boot/grub
root=hd0,msdos1
加载基本模块
insmod /boot/grub/normal.mod #加载基本模块
进入正常模式
normal #进入普通模式,出现菜单,如果加载grub.cfg(错误的)可能出现问题,按shift可以出现菜单,之后按c键进入控制台
进入正常模式后就会出现grub>这样的提示符,在这里支持的命令就非常多了。
引导系统
set root=(hd0,msdos1) #设置正常启动分区
linux /boot/vmlinuz .... ro text root=/dev/sda1 #加载内核,进入控制台模式
initrd /boot/initrd .... #加载initrd.img
boot #引导
更新grub
# 进入系统后,先更新grub
更新:update-grub #更新
# 修改grub.cfg后,再执行install
安装:grub-install /dev/sda #安装
原文:
http://xstarcd.github.io/wiki/Linux/grub_rescue.html
参考:[SOLVED] How to Fix Grub Rescue - Error: file '/boot/grub/i386-pc/normal.mod' not found
https://www.geekswarrior.com/2020/03/solved-how-to-fix-grub-rescue-error.html