grub rescue模式下启动并修复

一般只要grub核心文件还在分区内,我们就能由rescue模式转换到normal模式下,进而通过命令进入系统。
在rescue模式下,只有一下命令可用(我觉得最让我不解的是为什么木有help命令?为神马?是我不知道麼?):
set---设置变量值(同grub2命令)
ls--- 列出当前的所有设备。 e.g:(hd0) (hd0,1) (hd0,8) (hd0,7) and so on这个命令可以有参数:ls / 列出当前设为root的分区下的文件ls (hd0,1)/ 列出(hd0,1)分区根目录的文件
insmod --- 加载模块normal --- 进入正常模式(只有模块加载正确了才能进入normal模式)

因为在rescue模式下,木有search命令,所以我们就用ls命令来查看grub2文件处于那个分区
  1. e.g: grub rescue> ls (hd0)/ error: unknown filesystem /*可以用此命令挨个儿的遍历ls显示的所有设备,直到列出的目录文件,就说明grub2的核心文件在此分区了*/
我看了很多帖子,嗯,发现大家的grub2核心(core.img)文件都在(hd0,8)分区,不晓得是不是巧合(这个我木有深究阿),反正我的也是在(hd0,8)这个分区

/* ok. 小小的记录一下,我刚才有故意给windows分区,把grub搞坏了,这次设备列表里木有(hd0,8)
 * 嗯嗯,,是(hd0,6)看来是巧合咯
 */

ls (hd0,8)/                /* 查看(hd0,8)分区根目录,看有木有boot/ 文件夹*/
ls(hd0,8)/boot/          /*查看此分区的/boot/目录文件,能看到有grub/文件夹*/
ls(hd0,8)/boot/gurb/     /*查看此分区/boot/grub/目录下的文件,能看到很多.mod格式的文件还有.img文件 */
这样确定了grub2的核心文件在哪里之后,我们就开始转换工作咯:

grub rescue> set(回车)                  /* 查看grub当前的启动分区和路径 */
prefix=(hd0,8)/grub                    /* 确定预启动路径 */
root=hd0,8                             /* 确定启动分区 */
grub rescue> set root=hd0,8            /* 设定grub启动分区 *
/grub rescue> set prefix=(hd0,8)/boot/grub       /* 设定grub启动路径 *
/grub rescue> set(回车)                 /* 查看grub设定内容是否和实际的分区路径一致 */
root=hd0,8                            /* 确定启动分区 */
prefix=(hd0,8)/boot/grub              /* 确定启动路径 */
grub rescue> insmod /boot/grub/normal.mod /* 刚才在查看分区/boot/grub/目录文件时,要注意看看是否有normal.mod文件,木有的话,此命令后会提示找不到此文件*/ 
grub rescue> normal                  /* 加载正常模块 */


/*以上操作成功后,我们就会进入正常模式,就能看到熟悉的grub启动菜单了*/
通常情况下,当我们进入到grub启动菜单后,就直接可以选择进入系统。然后更新重建grub。
但是有些人可能会碰到这种情况,虽然进入了normal模式出现启动选择菜单,却依然不能进入系统,这是由于缺少加载内核的Linux命令,直接从菜单不能进入系统。(请直接进入下面操作,因为紧接着我有点跑题咯~如果你急着解决问题的话)
还有一种情况,就是你更新过内核,所以会像我的启动菜单一样会有很多个不同内核的启动项,由于我的本本装的是Ubuntu10.04+win7,默认系统启动项为Ubuntu,这样如果我要进Win7就必须跳过好几个内核启动项,多麻烦阿~~~手疼~~o(∩∩)o...
对此我的解决方法是把/boot/grub/grub.cfg中的其他Ubunut内核启动项用“#”注释掉。但是这样的问题就是一旦你更新了grub,那么其他的内核镜像又会被搜到,于是就又造成了so长的启动项选择菜单。
有学长说,可以用命令移除旧版本的内核镜像,不过这个,现在我暂时还木有去找。等知道了,再补上来~~
好吧,回到我们的进入正常模式加载Linux内核模块问题。我想对于上面我说的多个旧版本的内核镜像,这时候你就可以使用下面的操作,加载指定的内核镜像。

如果不能直接进入系统请继续下面的操作:

进入正常模式后,出现我们熟悉的系统启动项选择菜单,此时需要按c,进入命令行然后加载linux模块
normal grub> insomd  /boot/grub/linux.mod
normal grub> set root=hd0,8                          /* 确定正常启动分区 */
normal grub> linux /boot/vmlinuz-* root=/dev/sda8 (注:*是通配符哦,此处可以以tab键查看具体内核版本镜像)                                               /* 加载内核并确定 /(根)分区 */
normal grub> initrd /boot/initrd.img-* (同上)      /* 加载initrd.img */normal grub> boot

boot启动系统后,打开终端,执行命令修复grub(建议以root用户登录吧,或者直接切换到root用户,这样操作方便些 )

root@wuyun:~# update-grub                         /* 更新重建grub.cfg grub配置文件 */
root@wuyun:~# grub-install /dev/sda               /* 重建grub到第一硬盘mbr */


注:
1.命令grub-install /dev/sda 是将grub装入第一硬盘的mbr,如果要装入第二硬盘的mbr则把sda改为sdb即可,第三第四分别为sdc,sdd等。至于要把grub装到那个硬盘的mbr上,根据自己的实际情况而定,主要是看要设置哪一块硬盘为启动盘,就把grub装到哪个硬盘的mbr上。
2.分区号例(hd0,8)单独使用时可以不加括号,在使用路径时必须加括号;
3.由于我在装Ubuntu 10.04时没有使用/boot单独分区,直接就一个/分区就完了,如果你使用了/boot单独分区了,那么就应该修改路径:
prefix=(hd0,8)/grub
insmod /grub/normal.mod
root=/dev/sda8 也要修改跟分区的分区号

1:1.Ubuntu Grub Rescue 双系统重装  Windows 造成grub2被改写的修复 
       grub4  Dos 0.4.4    在Windows启动项上加上grub4dos启动(不多说了,看置顶贴),重启选择进入grub,在命令行下输入(/boot单独分区的去掉 /boot) 
代码:
grub>find --set-root /boot/grub/core.img
grub>kernel /boot/grub/core.img
grub>boot
进入grub2菜单,进入系统后再执行
代码:
sudo grub-install /dev/sd?
Ubuntu Grub Rescue方法二 进入Livecd 后修复
引用:
sudo -i
mount 你的根分区 /mnt
mount 你的/boot 分区 /mnt/boot #如果有的话
#挂载你其他的分区,如果有的话
# 重建grub到sda的mbr
grub-install --root-Directory=/mnt /dev/sda

2:Ubuntu Grub Rescue由于root分区uuid改变造成的不能正常启动,只能进入grub rescue模式的修复 
grub rescue>set  grub rescue>prefix=(hd?,?)
/grub  grub rescue>root=hd?,?  
grub rescue>set root=hd?,?  
grub rescue>set prefix=(hd?,?)/boot/grub  
grub rescue>set  
grub rescue>root=hd?,?  
grub rescue>prefix=(hd?,?)/boot/grub  
grub rescue>insmod /boot/grub/normal.mod  
grub rescue>normal  
这时就可以调出 /boot/grub/grub.cfg,修改相应uuid,
改到命令行下
grub>insmod /boot/grub/linux.mod  grub>set root=hd?,?  
grub>linux /boot/vmlinuz-*** root=/dev/sd??  
grub>initrd /boot/initrg.img-****  进入系统
hd?,? 是grub文件所在分区 sda? 是/分区。

3:grub模块和配置文件grub.cfg受损无法启动时修复 
Livcd启动进入试用
引用:
sudo -i
mount 你的根分区 /mnt
mount 你的/boot 分区 /mnt/boot #如果有的话
# 挂载你其他的分区,如果有的话
# 重建grub到sda的mbr
grub-install --root-directory=/mnt /dev/sda
# 重建grub.cfg
mount --bind /proc /mnt/proc  
mount --bind /dev /mnt/dev  
mount --bind /sys /mnt/sys  chroot /mnt update-grub  
umount /mnt/sys  
umount /mnt/dev  
umount /mnt/proc


另一种方法

找到“/”挂载点所在的分区后,就可以修改启动分区了:

    grub rescue >root=(hdx,msdosx)

    grub rescue >prefix=(hdx,msdosx)/boot/grub

    grub rescue >insmod normal

    grub rescue >normal

执行完normal命令后,如果normal模块加载成功,那我们就可以看到久违的grub引导菜单了。此时,按“c”切换到grub的命令行模式,修改grub菜单:

   grub >root=(hdx,msdosx) //设置系统启动分区,在这里指向内核所在分区

   grub >prefix=(hdx,msdosx)

接下来加载Linux.mod模块,并将新的启动信息写入grub:

   grub >insmod (hdx,msdosx)/boot/gurb/linux.mod

   grub >linux /boot/vmlinuz-xxx-xxx root=/dev/sdax //里边的xxxx可以按Tab键

   grub >initrd /boot/initrd.img-xxx-xxx

5.执行boot命令,启动系统(如果系统不能启动,可以重复1-4步,多试几次):

   grub >boot

6.正常启动系统后,在终端中输入“sudo update-grub”命令,重新生成“grub.ccfg”文件,更新grub信息,屏幕会出现“generating…”的信息。

如果没有安装grub-pc软件包,或者grub-legacy,会出现无法找到命令的错误。这时,只需安装一下grub-pc软件包即可。(注意:安装过程中会出现提示要不要新建grub到第一分区,由于我的本本第一分区是Windows系统,所以在此我选择“NO”,而是将grub建立在“/”挂载点所在的分区)

7.更新完毕之后,重启,问题解决了。如果问题还没解决,重复1-6步的同时,重新建立grub到第一硬盘mbr:

sudo grub-install /dev/sda


整合自:
http://www.oschina.net/question/565065_68193
http://blog.csdn.net/miromelo/article/details/6132702

你可能感兴趣的:(Linux)