centos安装后导致原有的ubuntu无法启动的解决方法

来源:互联网 发布:我是山姆 知乎 编辑:程序博客网 时间:2024/04/29 18:26

    我的主机上原有的操作系统是ubuntu,现在我在空出的硬盘空间上安装centos5.4操作系统。在安装过程中,我选择了安装centos的grub启动项。安装成功后,centos的grub启动项覆盖了ybuntu的grub启动项,导致无法进入ubuntu系统。

    通常的解决方法为编辑centos下的/boot/grub/grub.conf添加ubuntu的启动项。

进入centos,在root权限下使用命令blkid查看磁盘分区,获取相应的UUID。我的主机上显示为

/dev/sda5: LABEL="/" UUID="25bc99b3-39e4-4db8-a923-ab4a8f936512" TYPE="ext3"
/dev/sda1: UUID="475aa54a-5e1b-48d1-915c-ca8db913c497" TYPE="swap"
/dev/sda2: UUID="96da6e09-7387-46d2-b157-48483aa0d6a0" TYPE="ext4"
/dev/sda3: UUID="f6f2fa4c-62ba-4915-ba89-c163f38ef6c0" TYPE="ext4"


    我的ubuntu安装在/dev/sda2和/dev/sda3分区上。其中/dev/sda2挂载在“/boot”上,/dev/sda3挂载在“/”上。这是我在安装centos前,在ubuntu使用df命令查看到的。

#vi /boot/grub/grub.conf

在末尾添加:

title Ubuntu .2.6.32-37-generic
root (hd0,2)
kernel /boot/vmlinuz-2.6.32-37-generic root=UUID=f6f2fa4c-62ba-4915-ba89-c163f38ef6c0 ro   quiet splash
initrd /boot/initrd.img-2.6.32-37-generic

重启后,虽然多了一项名为Ubuntu .2.6.32-37-generic的启动项,但是选择后报错:

root (hd0,2)
kernel /boot/vmlinuz-2.6.32-37-generic root=UUID=f6f2fa4c-62ba-4915-ba89-c163f38ef6c0 ro   quiet splash

Error2:Bad file or directory type。

    经过一系列的思考,我发现问题的根源是ubuntu一来grub1.98以上来启动的,也就是所谓的grub2。而新安装的centos用的确是grub0.97。所以首先我要升级grub。

第一步,升级grub:

一、下载Grub2源代码

ftp://ftp.gnu.org/gnu/grub

二、下载依赖软件

sudo yum install -y bison

sudo yum install -y flex

yun下载的flex版本低,不符合要求。所以手动下载flex2.5.35,然后在root权限下用./configure,make,make install命令安装好。

三、进入源码目录安装Grub2

sudo ./configure

sudo make

sudo make install

默认安装在/usr/local/bin和/usr/local/sbin。

四、下面先把grub2安装到MBR

sudo ./grub-install /dev/sda

    这是最关键的一步,这一行命令执行后,再次开机时,就会进入grub1.99的界面,从而使用grub2提供的命令,进入ubuntu。


第二步,重新进入Ubuntu:

    现在我们重启计算机,自动进入了grub界面,执行以下命令进入ubuntu.

grub>ls #查看分区情况

grub>set root=(hd0,2)

grub>ls $Boot #查找$Boot分区的uuid,显示为96da6e09-7387-46d2-b157-48483aa0d6a0

grub>search --no-floppy --fs-uuid--set 96da6e09-7387-46d2-b157-48483aa0d6a0

grub>linux /vmlinuz-2.6.32-37-generic root=UUID=f6f2fa4c-62ba-4915-ba89-c163f38ef6c0 ro quiet splash

grub>initrd /initrd.img-2.6.32-37-generic

grub>boot

        在安装centos前,我把ubuntu下的/boot/grub/grub.cfg下载了下来,然后在grub界面下就可以参照ubuntu的grub.cfg进行操作了。因为我知道安装centos对于其他操作系统来说时件危险的事情,所以我留了个心眼。如果没有把ubuntu下的/boot/grub/grub.cfg的内容记下来也不要紧。只要执行命令:

#mount /dev/sda2 /mnt/boot

        把ubuntu的/boot挂载到centos下的/mnt/boot,就可以从/mnt/boot/grub/grub.cfg查看到buntu下的/boot/grub/grub.cfg了。


第三步,修改ubuntu的grub启动项

        按照第二步的方法,进入ubuntu后,执行命令:

#update-grub2

        但是一般update-grub2没有安装好。所以执行:

#apt-get install grub-pc #可以添加update-grub2命令,并且自动执行该命令。

显示:

Setting up grub-pc (1.98-1ubuntu13) ...
Installation finished. No error reported.
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.32-37-generic
Found initrd image: /boot/initrd.img-2.6.32-37-generic
Found linux image: /boot/vmlinuz-2.6.32-24-generic
Found initrd image: /boot/initrd.img-2.6.32-24-generic
Found memtest86+ image: /memtest86+.bin
File descriptor 3 (pipe:[196736]) leaked on lvs invocation. Parent PID 5360: /bin/sh
Found CentOS release 5.4 (Final) on /dev/sda5

done

        这说明update-grub2命令已经搜索到centos的分区,自动添加了启动项。当然我也留了心眼,早在安装好centos的时候,就已经把centos下的/boot/grub/grub.conf拷贝出来了。如果自动添加的centos启动项有问题,可以参照grub.conf修改ubuntu下的grub.cfg。当时为了能够启动ubuntu我尝尽了各种方法,包括通过挂载把ubuntu下的vmlinuz-2.6.32-37-generic和initrd.img-2.6.32-37-generic复制到centos的/boot目录下。结果导致执行update-grub2命令时,grub.cfg的centos启动项为

initrd initrd.img-2.6.32-37-generic,导致无法进入centos。修正为initrd /boot/initrd-2.6.18-164.el5.img才进入了centos。

把centos启动项自动添加进了/boot/grub/grub.cfg。重启计算机后就可以在grub1.99界面下看到ubuntu和centos的启动项了。


其他经验:

        最后,还要提醒一件重要的问题。如果ubuntu下已经安装了grub2,请不要再执行

#apt-get install grub

        否则会覆盖原有的grub2。当时我就是为了使用grub命令而去下载安装grub。结果导致这样一个坑爹的局面,以至于有了本博客。

           如果本机上有其他操作系统,早在安装centos的时候,就不要安装grub启动项。等安装好后,再往ubuntu下的grub.cfg添加centos的启动项。

           但是既然centos的grub已经安装好了,并且覆盖了原ubuntu的启动项,那就安装本文的说法去做吧。

        这是个人实战经验,欢迎留言交流。