Grub2 与Ubuntu的那些事

Windows7与Ubuntu双启动的那些事 姊妹篇

之前那篇讲到我升级到Ubuntu 10.10,然后杯具的从Windows的启动菜单进不去了,出现grub rescue黑洞洞冷冰冰的界面:

error: the symbol ‘grub_xputs’ not found
grub rescue>

为了把Ubuntu救活,找了n多办法,还差点把Win7搞丢了。后来有些后怕就没动Ubuntu了,期间也尝试过几次,都未果。终于昨天心血来潮,好好研究了一番,终于在今天发现了问题的关键所在。而且最让人吐血的是最后找到的原因不是自己苦苦尝试的。。。好了,废话少说,听我慢慢道来。

先说下我的问题的根源,想看grub恢复方法的在后面有详细的介绍:

当我尝试过所有Ubuntu修复grub的方法后,还是提示grub_xputs。无奈在Ubuntu中文论坛发帖。然后继续找资料。刚好看到有人提到EasyBCD里面有个grub2模式。我记得我之前是的EasyBCD只有grub模式。然后发现EasyBCD确实多了个grub2选项,看来是2.0之后添加的。遂删除之前的条目,重新添加了grub2的条目,保存后重启,从启动项里面进入,grub列表终于出现了!这个跨年的问题终于解决,哈哈哈

Ubuntu出现grub rescue画面后最方便的解决方法就是使用对应的Live CD来处理。用U盘就能做 (省光盘就是低碳环保嘛),工具有好几个都不错:

  • Universal-USB-Installer:这个是官方推荐的工具:官方下载地址下面选USB,然后点右边的Show me how就可以看到下载了
  • unetbootin-windows:这个和上面那个差不多,不过会在启动后出现一个定制的菜单,更方便一些
  • LinuxLive USB Creator:图形化的工具,支持中文,可以安装作者定制的VirtualBox从Windows启动。适合新手。我用这个就10.04成功了,之后再没成功过。。而且那个VB虚拟机总出错。

从Live系统进入之后就可以对原有系统的grub重新安装了,Ubuntu forum里面有一篇非常棒的HOWTO介绍怎么操作的:HOWTO: Purge and Reinstall Grub 2 from the Live CD。还是啰嗦下:

我的ubuntu的 / 分区是sda7,/boot分区是 sda6,用livecd启动,在终端下(Application>Accessories>Terminal)输入

#切换到root权限
sudo –i
#挂载根目录 /
mount /dev/sda7 /mnt
#如果没 /boot 单独分区下面这步跳过
mount /dev/sda6 /mnt/boot
#从Live系统复制grub安装到被挂载的系统
grub-install --force --root-directory=/mnt /dev/sda6

注意:我因为要把grub安装到分区里面而不是MBR里面(就是grub-install那个命令的最后的参数是/dev/sda6,而不是/dev/sda或者/dev/sdb等),需使用了–force命令。不使用–force会提示如下信息

/usr/sbin/grub-setup: warn: Attempting to install GRUB to a partition instead of the MBR. This is a BAD idea..
/usr/sbin/grub-setup: warn: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and its use is discouraged..
/usr/sbin/grub-setup: error: if you really want blocklists, use –force.

使用–force之后也会出,但是会有

Installation finished. No error reported

表示安装成功了。

如果你系统的grub.cfg文件损坏了或者不见了,那么还需要从Live系统进入到你出问题的系统你们更新一下这个文件。这时候要用到chroot

#下面的for循环是挂载你目标系统的各种必备设备
for i in /dev /dev/pts /proc /sys; do sudo mount -B $i /mnt$i; done
#然后就是进入挂载后的系统里面,也就是你出问题那个系统里面
chroot /mnt
#执行grub更新命令
grub-update
#成功后卸载挂载过的设备,如果没有单独的/boot分区就删除下面的/boot
for i in /dev/pts /dev /proc /sys /boot /; do sudo umount /mnt$i ; done

到此你的Ubuntu的grub就修复好了。那些个用grub rescue的命令的纯粹是找难受,虽然这方法我也用过。。太容易晕,也容易敲错;错了有可能很崩溃。。。

所以碰到rescue问题最好还是Live系统解决。主要是你需要了解linux分区的规则:再奉上一片关于分区的讲解,非常棒:Partitioning basics

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s