今天再次遇到grub修复问题,以前也遇到过一次。
我装的ubuntu 10.04和window 7的双系统,默认的系统启动项是Ubuntu。因为第一次装Ubuntu的时候只划了15G(对于长期使用Linux的人来说 o(∩∩)o...知道很小啦),于是就直接在windows系统下把装Ubuntu的那个分区删除了~~这下。。惨了,windows系统启动不起来了~~grub又不会修复,在网上找的东东又不管用。。当时真是无语了,然后就求助别的童鞋。用WINPE修复了grub。
我这个人不知道要求甚解,于是修好了就修好了~~继续玩去了~
一个跟头不能栽两次,这次我想装meego系统,所以就又给windows分区了,这样由于window分区的碎片和Linux分区碎片不兼容,于是乎~~我再次进入到那个黑框框中~~敲神马命令都是"Unknown Command",除了ls~~列出了一些貌似分区的(hd0),(hd0,8)等等~~(当然啦`这是因为我当时不会嘛,而且grub rescue和grub的命令也不太一样麼)。。但是~~~这次。。我决定自己折腾一下,解决问题。。在网上找到一个所谓的完美解决方案~~但是结果是。。依然不行。。其实人家童鞋的解决方案是对的,只是不适合我的这种情况罢了。还有就是对于我这个对grub命令了解为0的菜鸟来说,照着他给的命令敲也不晓得是神马意思。。。。
不过还好啦,以前有学长给过一些很详细的grub基础教程的pdf,所以我就小学习了一下,如何在rescue模式下启动并修复grub,当然你也可以用当时你安装系统的光盘修复grub,在这里,我只简单的说一下如何在rescue模式下启动并修复呐~~好滴~~进入正题:(我嘚废话好多哈)
由于分区问题,启动时会自动进入grub rescue模式,一般会显示如下内容:
- error: unknown filesystemgrub 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文件处于那个分区
- 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.modnormal 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 Dos0.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
Ok~~Now we have already made it. Enjoy your OS~!