装过linux的大概都知道grub这个引导器吧!很强大,我在前面也说过我电脑的一些情况(连接)3个系统,当初由于不是很懂,在装系统的时候很多选项都是用的默认,结果也导致现在这样的情况。grub装在了MBR,通过grub来引导ntloader,虽然能正常地引导,但还是推荐不要这样。
正确的顺序应该是ntloader装在MBR中,通过ntloader来加载grub,这样做的好处就是尽可能地减少对windows的影响。在不想要linux的时候可以在windows中直接把那个“未知分区”格式化。如果是我那种情况删掉linux后windows就无法正确引导了(因为grub的一些配置在linux分区中)。当然可以通过启动软盘来恢复MBR,使之正确引导windows(前提条件是你必须要有软驱)。
下面介绍一个方法使grub来引导linux(这步其实没有必要,现在装linux都自带grub)
安装Grub的简便方法是用一张带有Grub的Linux LiveCD(比如常见的Knoppix丶Morphix丶Ubuntu,都是可以的),启动系统,在Linux的安装程序内如果能进入shell也是可以的,总之就是为了执行Linux指令,在终端下执行以下指令:
# grub
grub > root (hd0,X-1)
grub > setup (hd0,X-1)
grub > quit
以上指令首先定位Grub所需的/boot目录在分区(hd0,X-1),然后将Grub的引导代码写入(hd0,X-1)分区的第一个扇区,所以你首先应该确保(hd0,X-1)分区内的/boot/grub目录下已经有stage1丶stage2丶*_stage*等文件,这些文件可以通过释放Grub的打包文件来获得,或者直接从LiveCD光盘内的/boot/grub目录复制。
如果LiveCD带有grub-install脚本,也可以直接执行
# mount /dev/hdaX /mnt
# grub-install --root-directory=/mnt /dev/hdaX
以上指令首先将带有Grub目录/boot/grub的/hdaX挂载到/mnt,然后将Grub安装到/hdaX。
二丶将Grub装配到ntloader内
Grub已经安装到了Linux分区内,但它还不能引导系统,我们需要把它和ntloader联接起来,由ntloader对Grub加以引导。这是通过把hdaX分区内的Grub引导扇区转换为文件,并装配到Windows的ntloader内来实施的。
仍然用LiveCD启动Linux系统(因为你所安装的Linux系统目前还是不能引导的),或者在安装程序可以进入shell的情况下,执行以下指令:
# mount -t vfat /dev/hda1 /mnt
# dd if=/dev/hdaX of=/mnt/linux.lnx bs=512 count=1
以上两条指令将Windows的启动分区(本文中为hda1)挂载到/mnt下,然后把Linux分区(hdaX)的第一个扇区(大小为512字节)复制为Windows启动分区根目录下名为linux.lnx的文件。
注意:如果你的Windows启动分区(即Windows下的C盘)不是fat32文件系统,而是ntfs文件系统,你需要在软驱内放入格式化的DOS软盘,并将第一条指令替换为:
# mount -t msdos /dev/fd0 /mnt
因为ntfs文件系统不经过特殊处理,在Linux下是不可写的,即使你将指令中的vfat替换为ntfs,实现了挂载,也是一样,所以我们在这里把linux.lnx写入DOS格式的软盘,然后通过软盘在Windows下把linux.lnx放入C盘。
接着是在Windows下编辑C盘根目录下的boot.ini文件,boot.ini通常是隐藏丶只读的系统文件,所以需要把它的“隐藏”丶“只读”属性去掉,才可以编辑。在“我的电脑”工具菜单“文件夹选项”下的“查看”栏中取消“隐藏受保护的操作系统文件”和“隐藏已知文件类型的扩展名”,并选择“显示所有文件和文件夹”,就可以看到C盘根目录下的boot.ini文件了。在boot.ini内的[operating systems]栏增添一行:
c:\linux.lnx=”Grub Menu”
并将[boot loader]栏内的“timeout=0”,改为“timeout=5”,这样引导Windows时将会显示带有“Grub Menu”字样的操作系统选择菜单,并持续5秒钟,如果选择Grub Menu,就会进入Grub菜单。
三丶设置menu.lst文件
menu.lst是对Grub进行设置的一个文本文件,可以用文本编辑器加以编辑,位于/boot/grub目录内。我们在前面虽然已经把Grub安装到了Linux根分区上,但如果没有生成menu.lst文件并对它加以设置,Grub是没有任何作用的。对menu.lst文件进行设置是个复杂的工作,特别是有关kernel和initrd的各种特殊参数,幸而系统安装的menu.lst文件内通常有详尽的注释。并且你的Grub如果是由安装程序自动设置的,那么通常menu.lst已经被设置好了,我们仅仅根据自己的需要进行一些修改和调整,而不必重写menu.lst。即使你的menu.lst不是由安装程序生成的,也不必担心,还可以参考丶分析安装光盘或者LiveCD上的menu.lst文件来对Linux分区内的menu.lst加以设置。
如果Grub已经由安装程序装到了MBR,并且能够引导所安装的Linux,那么自动生成的Linux系统根分区下的/boot/grub/menu.lst就已经被配置好了,我们只须把Grub重新安装到Linux系统根分区,恢复Windows下的原初MBR,按照上文的方法把Linux系统根分区的Grub引导代码装载到ntloader就可以了。因为Grub的安装位置不是在menu.lst文件内指定,而是在linux shell中执行grub,进入Grub命令行后,应用Grub的内部指令root和setup来指定,或者在可执行的shell脚本文件grub-install中,以参数的形式指定设备文件(如/dev/hda或/dev/hdaX)。
下面这个内容是我电脑上linux的menu.lst文件的内容
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,6)
# kernel /vmlinuz-version ro root=/dev/hda9
# initrd /initrd-version.img
#boot=/dev/hda
default=2
timeout=20
splashimage=(hd0,6)/grub/splash.xpm.gz
hiddenmenu
password --md5 $1$2VWBLn/O$1B14KKRoSF0jP1zo2UTu2.
title Fedora Core (2.6.17-1.2157_FC5)
root (hd0,6)
kernel /vmlinuz-2.6.17-1.2157_FC5 ro root=LABEL=/ rhgb quiet
initrd /initrd-2.6.17-1.2157_FC5.img
title Windows XP
rootnoverify (hd0,0)
chainloader +1
title Windows Server 2003
rootnoverify (hd1,0)
chainloader +1
这里面只用知道几个参数就行,default用来设置缺省引导系统,0表示第一个,1表示第二个。
timeout是grub界面等待时间
title Fedora Core (2.6.17-1.2157_FC5),就是要引导的系统,root (hd0,6)表示第一块硬盘第三个逻辑分区
title Windows XP,引导的是xp
这个是我winXP下的boot.ini信息
[boot loader]
timeout=6
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
multi(0)disk(0)rdisk(1)partition(1)\WINDOWS="Microsoft Windows 2003" /fastdetect
C:\grldr=DOS工具
这个很简单partition代表分区,1表示第一个分区。rdisk代表硬盘,0表示第一块硬盘。timeout倒计时。
从这两个文件中可以看出,grub的功能确实要比ntloader强,因为grub可以引导目前所有的操作系统!!!