ubuntu12.04 升级 grub error的修复

ubuntu12.04 升级 grub error的修复
系统: ubuntu12.04 beta (development version) 环境: 这台是测试机,多系统并存在一枚硬盘上(ubunntu12.04/10.04/debian 6/win7/Xen server等等)

几天前通过apt 把ubuntu12.04 beta2升级软件到ubuntu 12.04LTS。升级时,在apt的输出中,看到grub软件包更新有warning,写着“…not a good choice..”,有不详预感,grub的升级一定出了问题。果然,升级后,启动时,进入grub菜单选择后提示:

grub error: no such partition

于是有了这篇短文,此方法对 grub rescue 同样有效

 

出错原因

grub2在升级过程中出错,重新install一遍即可。问题是,连系统都进入不了,如何reinstall呢?

解决方法

使用u盘或cd等外部系统启动,chroot到原系统后 re-install grub。

步骤

找一张liveCD的linux系统,发行版任意,ubuntu/fedora/等等,都行。目的是用它启动机器,挂载硬盘,然后chroot回到原来的系统路径。笔者是使用SD卡中的tinycore linux启动机器。

启动后,检查分区情况,定位你升级失败的ubuntu12.04的根目录安装在哪个分区。

sudo fdisk -l

挂载、绑定所需要的系统设备到原ubuntu12.04系统的分区下

# 例如,我的ubuntu12.04的根目录是在/dev/sda6下。  sudo mkdir /mnt/sda6 sudo mount /dev/sda6 /mnt/sda6  sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys

一切就绪后,chroot到原系统下

sudo chroot /mnt/sda6 /bin/bash      # 若这里提示不能chroot,请看下面的注1

执行grub的恢复 (reinstall)

grub-install /dev/sda       # 安装到MBR 或者 grub-install /dev/sda6      # 把grub安装到分区

安装好后,请退出chroot的环境

logout 或者  exit 或者 CTRL-D

退出挂载的设备和分区

sudo umount /mnt/sda6/sys sudo umount /mnt/sda6/proc sudo umount /mnt/sda6/dev sudo umount /mnt/sda6

至此,重启即可。

 

注1:这个过程中,请注意liveCD运行环境和已安装linux版本的兼容性问题,32bit的要使用32bit的liveCD,64bit的要使用64bit的liveCD,否则在chroot时会出现提示:

can't execute 'bin/bash': Exec format error

 





----------------------------------------------------------------------------

 

自从ubuntu 9.10开始,ubuntu正式开始使用grub2作为引导程序。对于多系统用户,可能有时候会将引导搞丢了(比如双系统下重新安装windows系统等),下面奶牛来介绍下ubuntu等linux系统的grub2的修复。

1.需要一张可以引导的ubuntu live-cd,并且版本在9.10+

用live-cd引导进入系统,然后在mnt目录下挂载分区。

首先我们需要确定一个问题,你的/boot是否单独分区了,如果单独分区了请按照方法A进行,如果/boot没有单独分区,可以按照B来进行。

A:以/boot为sda8,/为sda9为例,如果还有其它linux分区也用同样的方法挂上来就可以了。

打开终端,

sudo su

fdisk -l (查看分区内容,并且确定硬盘为sda啊还是sdb,或者hda还是sda)

mount /dev/sda9 /mnt

mount /dev/sda8 /mnt/boot

mount –bind /dev /mnt/dev

mount –bind /proc /mnt/proc

如果还有其它linux分区,用同样的方法挂载上

chroot /mnt

这时没有意外的话我们就已经进入了ubuntu的系统了

sudo grub-install /dev/sda

sudo update-grub

完工,重启,linux系统应该可以进入了。

B:方法与A类似,但是不用挂载/boot分区,所以mount /dev/sda8 /mnt/boot可以省略。其它操作一样。

如果在sudo update-grub后出现提示

Cannot find list of partitions!

请不要慌张,因为在多系统的环境下会出现这个提示,告诉我们无法识别linux之外的windows系统,正常重启还是可以进入linux的,进入系统后就啥都好说了,继续多来一次update-grub就可以了。

-------------------------------------------------------------

由于寒假,本站已经相当长时间没有更新了。如今开学自然可充分利用时间,所以现在就讲下我前段时间碰到的一个问题:前阵子我硬盘分区失误,导致系统启动时自动进入rescue模式。

当时折腾了好些时间,都解决不了,现在就将解决办法晒出来。

首先声明一下,要解决此问题必须保证grub核心文件core.img还在分区内,然后通过:set,ls,insmod,root,prefix等命令解决。

此问题还需要分类解决,分为两种情况:1. /boot 没有单独分区,默认包含在 / 分区;2. /boot 分区有单独分区。

第一种情况:

先确定grub核心文件所在分区

ls (hd0,x)/查看(hd0,x)分区目录的文件。(##x为未知数,假如我的grub核心文件在(hd0,9),就输入ls (hd0,9))

ls (hd0,x)/boot/grub/ 查看(hd0,x)分区/boot/grub目录下文件

ls (hd0,x)/boot/ 查看(hd0,x)分区的/boot目录下文件ls (hd0,x)/boot/grub/ 查看(hd0,x)分区/boot/grub目录下文件

确定分区之后,执行下列命令:

grub rescue>root=(hd0,x)

grub rescue>prefix=/boot/grub

grub rescue>set root=(hd0,x)

grub rescue>set prefix=(hd0,x)/boot/grub

grub rescue>insmod normal

rescue>normal ——–>若出现启动菜单,按c进入命令行模式

rescue>linux /boot/vmlinuz-xxx-xxx root=/dev/sdax

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

rescue>boot

内核版本号 -xxx-xxx可以按Tab键查看后再手动补全。

第二种情况:

首先用同样的方法找出 /boot 独立分区(hd0,x)和 / 分区(hd0,y),然后执行下列命令:

grub rescue>root=(hd0,x)

grub rescue>prefix=/grub

grub rescue>set root=(hd0,x)

grub rescue>set prefix=(hd0,x)/grub

grub rescue>insmod normal

rescue>normal ——–>若出现启动菜单,按c进入命令行模式

rescue>linux /vmlinuz-xxx-xxx root=/dev/sday

rescue>initrd /initrd.img-xxx-xxx

rescue>boot

boot启动系统后,再在系统下打开终端,执行命令修复grub 重建配置文件grub.cfg

sudo update-grub

重建grub到第一硬盘mbr

sudo grub-install /dev/sda

本文大部分数据来源于网络,由于时间已久,来源已无处可寻,如有侵犯到您的著作权,请告知,本站将立即删除!


 

你可能感兴趣的:(ubuntu12.04 升级 grub error的修复)