您的位置:首页 > 其它

[经验] win7,ubuntu12.04和redhat 6.4三系统共存遇到的一些问题及解决

2013-12-06 21:03 447 查看
导读:


本文偏重对Linux系统的启动引导讲解,并采用ubuntu的boot loader引导启动。如果要快速解决三系统共存的引导问题,可参考另一博文:http://blog.csdn.net/xiaolanzao/article/details/19831473

安装LINUX系统时,分区时一般这样分:

/boot:第一个要分出100~200M的/boot分区,里面放着内核文件和boot loader.
/:然后有一个根目录的分区“/",大小根据你的需要和磁盘大小;
/tmp:如果是企业的系统时,一般会单独分出/tmp分区,几G+不等,个人计算机则不需要;
swap:最后有一个swap分区,一般是实际内存大小的1~2倍,如果你的内存很足够了,可以不需要。

如果没有选择”自定义分区”的话:

会默认将系统的引导写进MBR(MasterBoot Recorder),
如果只有windows 和linux两个系统的话,可以先装windows再装linux,也可以使其和平共处。

如果装三个系统,则第三个linux系统的boot loader会覆盖掉之前的linux系统的boot loader,因此无法实现两个linux的系统自动引导。

因此,就会产生无法自动引导存在两个linux系统的问题,也就是本文要讨论解决的问题。

注:我是先装win7,再装ubuntu,最后装redhat
如果想用ubuntu的boot loader来进行引导,则在装redhat时,选择“自定义分区”,最后选择“不将boot loader写入MBR”
然后再修改ubuntu的boot loader文件(即grub.cfg),加入redhat的引导选项。
本人装linux系统时并没有选择自定义分区,根据顺序,我是用了redhat的boot loader(文件位置/boot/grub/grub.conf),加入ubuntu的引导,所以此博文都是根据这个来写的。其实都是大同小异,理解其中原理就行。

为什么可以先装windows后装linux实现双系统正常引导,而两个linux却不行?
如果先装linuxs后装windows,windows的引导会直接覆盖掉MBR,导致无法引导linux,因此要先装linux
linux的引导记录是写在MBR,所以会直接去MBR里寻找,而windows的是写在PBR(partitionboot recorder),当有激活分区时,就去PBR寻找引导记录;
当检测到已经安装有windows系统时,linux的bootloader可以选择是否继续选择跳转到windows的boot loader去引导启动,因此可以实现正常引导

我的安装过程:

1,原本电脑里有win7和redhat 5.5。

2,进PE系统,用DiskGenius删除掉redhat的分区后,装了ubuntu 12.04。成功后启动可正常进入两个系统。

3,装redhat 6.4,选择安装分区时选了从现有linux分区中切割出一部分空间来装。

4,安装成功后,重启,果然只能选择进入redhat和win7,而没有ubuntu的选项。

由于丢失了ubuntu引导,所以需要我们手动添加。由于已经有了redhat的grub引导,我决定加入ubuntu的引导选项。以下步骤需要小心操作,避免误改文件而导致新的系统问题。

 进入redhat系统,执行“fdisk -l”查看分区情况。看你的两个linux系统分别装在哪里,一般先装的会在前面。
 把ubuntu系统挂载到/mnt下。执行“mount /dev/sda7 /mnt”
 进入ubuntu系统查看你的内核文件位置.我的在直接在boot/initrd.img-3.2.0-24-generic和boot/vmlinuz-3.2.0……
 修改redhat下的/boot/grub/grub.conf文件。(ubuntu的引导是/boot/grub/grub.cfg)。
 观察该文件语法,在适当位置加入代码(红色部分):

××××××××××××××××××××××××如下为/boot/grub/grub.conf文件部分代码××××××××××××××××××××××××××××××

title Red Hat Enterprise Linux (2.6.32-358.el6.x86_64)
        root (hd0,8)
        kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg_lanzaocomputer-lv_root nomodeset rd_NO_LUKS rd_LVM_LV=vg_lanzaocomputer/lv_root rd_NO_MD rd_LVM_LV=vg_lanzaocomputer/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 
KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-358.el6.x86_64.img
title Windows7
        rootnoverify (hd0,0)
        chainloader +1
title ubuntu                   
//在开机启动引导进系统时显示的名称,随便起一个你自己认得的名字
        root (hd0,6)          
//根据你的ubuntu所在分区来填,可以先从本文下个模块将的步骤里查看到是hd(0,?)
        kernel /boot/vmlinuz-3.2.0-24-generic root=UUID=cdbf0740-3243-4bd0-bbe6-8fe512660adf ro quiet splash
        initrd /boot/initrd.img-3.2.0-24-generic                      //内核位置,一般来说都是在/boot下。

之后保存退出。

5,重启计算机,可看到3个引导选项,可成功进入win7,ubuntu和redhat,成功在grub引导启动ubuntu!

附图1:



[align=center] BIOS与boot loader及内核加载流程示意图(from《鸟哥的LINUX私房菜基础片》)
[/align]

PS:

第一次操作很容易遇到各种各样的问题和报错,可以去网上找相应教程查看,不要轻易放弃和重装。

涉及硬盘分区的操作要谨慎,不要轻易格式化和删除分区,避免造成数据丢失。

如果启动无法进入linux系统,出现"grub>"的解决方法:

grub>find /grub/stage1  会显示 hd(0,x) x是你的系统的分区号
grub>root  (hd0,x) x是你的系统的分区号,按Tab可以列出选项
grub>setup  (hd0)  回车后会看见……successful,Done.
grub>root  (hd0,x)
grub>kernel (hd0,8)/boot/vmlinuz-3.2.0-24 (按Tab查看提示或补齐) ro root=/dev/sdax(进系统后执行fdisk -l查看)
grub>initrd  (hd0,8)/boot/initrd.img-…… (按Tab补齐)
grub>boot
正常来说是可以进入到系统的,如果不行再放入系统光盘,进入Live系统后再查看相关参数,重复以上步骤。

为什么需要initrd?
会需要initrd的原因,是因为内核模块放置于/lib/modules/$(uname -r)/kernel/当中,这些模块必须要根目录(/)被挂载时才能够被读取。但是如果内核本身不具备磁盘的驱动程序时,当然无法挂载根目录,也就没有办法取得驱动程序。
initrd可以将/lib/modules/...内的启动过程当中一定需要的模块打包成一个文件(文件名就是initrd),然后在启动时通过主机的INT13硬件功能将该文件读出来解压缩,并且initrd在内存中会仿真成为根目录,由于此虚拟文件系统主要包含磁盘与文件系统的模块,因此我们的内核最后能够认识实际的磁盘,那就能够进行实际根目录的挂载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐