/*N久没发博文了`写了一些不过保存在PC上。。最近会整理一下,发表出来*/
今天再次遇到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 filesystem
-
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文件处于那个分区
- 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 也要修改跟分区的分区号
Ok~~Now we have already made it. Enjoy your OS~!
阅读(17621) | 评论(0) | 转发(0) |