系统: 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
本文大部分数据来源于网络,由于时间已久,来源已无处可寻,如有侵犯到您的著作权,请告知,本站将立即删除!