首页 > 代码库 > Ubuntu与Win7双系统下,改变分区导致error:no such partition grub rescue>

Ubuntu与Win7双系统下,改变分区导致error:no such partition grub rescue>

我电脑装的是windows和ubuntu双系统。在windows下改变分区,包括新建分区、删除分区、合并分区等操作,会造成Ubuntu的grub找不到分区,以致进入grub rescue模式。这时可以通过如下方式恢复。摘抄http://www.cnblogs.com/ZhangZhifeng1988/archive/2011/12/19/2294018.html如下:

上网找了很多方法问题终于解决了。网上的内容大概有那么三种,一种是用LiveCD,只有挂了的这一台电脑,在公司里也懒得再下系统刻CD或U盘了。第二种方法是用SurerGrubDisk这个软件。在公司下了个,刻在U盘里,回来试了一下,不知道是没有刻好还是什么原因,屏幕闪了一会儿后,就卡在卡在Booting From USB device 那儿不动了。接下来是第三种方法,也就是解决问题的方法,不需要其它盘和设备,直接就能解决问题。下面是步骤:
首先是要找到自己的系统启动分区, (如果记得话就不用查了)通过输入ls命令可以列出所有的分区,如下所示:

Grub Rescue> ls 
hd0 (hd0,msdos1) (hd0,msdos5) ...(hd0,msdos10)
接下来就是找到系统启动分区, 首先输入ls (hd0,1)系统会提示Unkonw Filesystem ,接着输入ls (hd0,5),连续输入下去,直到系统不再提示Unknow Filesystem
接下来的工作就是对启动的分区和路径进行设定,比如刚才找到的分区为(hd0,8) ,确定输入ls (hd0,8) 后,列表中是否有/grub这个文件夹,没有的话看是否有/boot 这个文件夹,一般grub在这个文件夹下,我的就是在这个文件夹下找到的。下面是输入的命令(//为注释的内容,不需要输入):

Grub Rescue> set root=(hd0,8)                                 //刚找到的分区
Grub Rescue> set prefix=(hd0,8)/boot/grub                     //刚才找到的grub的目录
接下来就是加载普通模式模块,命令如下:

Grub Rescue> insmod /boot/grub/normal.mod                    //与刚才grub目录对应,normal.mod 文件在grub文件夹下面
加载完后,进入normal模式,命令如下:
Grub Rescue> normal
这时,系统就进入我们平时用的系统(模式)中了。然后我们要做的工作就时重新设定系统启动的分区和路径,因为我们的系统启动不了就是找不到路径引起的。这个过程有两个步骤,一个是对grub 进行更新,grub这时能够发现分区的改变,另一个是对启动分区重新设置。步骤如下:
打开终端,输入sudo update-grub 回车,命令运行完后,输入第二个命令:sudo grub-install /dev/sda            //sda是启动磁盘
完成这些步骤以后,系统就完全恢复了。

他提示的是unknown filesystem,而我提示的是no such partition。

下面另附另一笔记如下http://blog.sina.com.cn/s/blog_6c9d65a10100n76w.html

我的linux在调整分区后,出现了grub rescue>
这表示grub2的配置文件坏了,由于分区调整或分区UUID改变造成GRUB2不能正常启动,从而进入修复模式(grub rescue)也称救援模式。

在救援模式下只有很少的命令可以用:
set  ,  ls , insmod , root , prefix

(1)set  查看环境变量,这里可以查看启动路径和分区。
(2)ls   查看设备
(3)insmod  加载模块
(4)root  指定用于启动系统的分区,在救援模式下设置grub启动分区
(5)prefix 设定grub启动路径

一、分区乱了,我不知道boot目录在什么地方了
ls  #查看一下设备状态
如图:
grub <wbr>rescue救援模式的处理

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启动路径
查看一下设置情况:
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-install /dev/sda
更新:update-grub



虚拟机实验:
经过上面的经历,我在虚拟机里进行了一下实验,加深巩固。
一、把boot目录移到别的分区
mv /boot/   /home/
这样重启之后就出现了
grub rescue>救援模式。
二、手动启动过程记录
ls (hd0,msdos6)/  #找到了boot所在的分区
set root=(hd0,msdos6)  #设置grub启动分区
set prefix=(hd0,msdos6)/boot/grub/  #设置grub启动路径
insmod /boot/grub/normal.mod  #加载基本的模块
normal #从救援模式进入正常模式

set root=(hd0,msdos6) #设置系统启动分区,在这里指向内核所在的分区
linux /boot/vmlinuz-2.6.35-22-generic ro text root=/dev/sda1 #加载内核
initrd  /boot/initr .....  #加载initrd.img
boot  #启动

测试中正常启动并出现登录对话框。