双系统引导管理器GRUB详细教程.docx
《双系统引导管理器GRUB详细教程.docx》由会员分享,可在线阅读,更多相关《双系统引导管理器GRUB详细教程.docx(15页珍藏版)》请在冰豆网上搜索。
双系统引导管理器GRUB详细教程
双系统引导管理器GRUB详细教程
一、什么是多重操作系统引导管理器,什么是GRUB;
1、什么是多重操作系统引导管理器及工作原理;
系统启动引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载、传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化及启动过程则完全由内核来控制完成;
Briefly,bootloaderisthefirstsoftwareprogramthatrunswhenacomputerstarts.Itisresponsibleforloadingandtransferringcontroltotheoperatingsystemkernelsoftware(suchastheHurdortheLinux).Thekernel,inturn,initializestherestoftheoperatingsystem(e.g.GNU).
在X86架构的机器中,Linux、BSD或其它Unix类的操作系统中GRUB、LILO是大家最为常用,应该说是主流;
Windows也有类似的工具NTLOADER;比如我们在机器中安装了Windows98后,我们再安装一个WindowsXP,在机器启动的会有一个菜单让我们选择进入是进入Windows98还是进入WindowsXP。
NTLOADER就是一个多系统启动引导管理器,NTLOADER同样也能引导Linux,只是极为麻烦罢了;
在Powerpc架构的机器中,如果安装了Linux的Powerpc版本,大多是用yaboot多重引导管理器,比如Apple机目前用的是IBMPowerpc处理器,所以在如果想在Apple机上,安装Macos和LinuxPowerpc版本,大多是用yaboot来引导多个操作系统;
因为目前X86架构的机器仍是主流,所以目前GRUB和LILO仍然是我们最常用的多重操作系统引导管理器;
2、什么是GRUB;为什么我要选择GRUB;
1)什么是GRUB;
GNUGRUB是一个多重操作系统启动管理器。
GNUGRUB是由GRUB(GRandUnifiedBootloader)派生而来。
GRUB最初由ErichStefanBoleyn设计和应用;
GNUGRUBisaMultibootbootloader.ItwasderivedfromGRUB,GRandUnifiedBootloader,whichwasoriginallydesignedandimplementedbyErichStefanBoleyn.
2)“GRUB太不好用”──对GRUB的认识的误区;
GRUB真的不好用吗?
不是的,通过LinuxSir.Org社区近四年来的运行,我发现了大多新手弟兄还是不太了解GRUB;当然这也有中文Linux社区的责任,虽然也有GRUB的中文译本,初学Linux的弟兄可能有点看不懂;
我们欣喜的看到LinuxSir.Org社区的好多弟兄都曾经或正在写GRUB实践文档,也有的弟兄也总结了GRUB的一些基础知识,比如probing兄弟的《GRUB学习笔记》;由于每个人的写文档时风格不同,可能同一份文档不同的人来写就有不同的风格;所以今天也抖胆也一篇入门级的教程,由于北南不会写高级教程,所以还得请高手弟兄指教,先谢过;
3)为什么要选择GRUB;
基于在X86架构的CPU而开发操作系统,系统引导管理器不仅仅有GRUB,而且也有LILO,但对于多重系统引导管理器,你只能选择其一而用;不能两个同时使用;
目前这两个多重系统引导管理器是大家最常用的,也是主流Linux发行版而采用的;有的弟兄喜欢GRUB,比如我个人,有的弟兄喜欢LILO,比如etony兄(谁是etony,请参见http:
//debian.linuxsir.org);
主流发行版Fedora、Redhat、Centos等基于RPM包的系统,在最新版本中都默认GRUB引导;Slackware目前仍采用LILO;而Debian发行版目前最新的版本也是采用GRUB;
从目前看来,GRUB有逐渐取代LILO之势,GRUB2.0正在开发之中;所以我们有理由用GRUB,我也有理由写GRUB使用教程;
二、GRUB软件包版本选择和安装;
1、GRUB的版本选择,Linux版本的GRUB及Windows版本的GRUB的说明;
GRUB不但有Linux版本,也有Windows版本;现我们一一介绍;
如前面所说,目前在在Unix类的操作系统中,大多是都有GRUB;GRUB几乎能引导所有X86架构的操作系统;功能之强,使用简单是GRUB最大的卖点;由于Windows操作系统的先入为主的优势,使得大家对Windows的NTLOADER了解的比较多,而对开源社区的GRUB显得有点寞生,由此而带来使用上的“心理恐惧”;究其初学者对GRUB“恐惧”的主要原因还是对GRUB没有太多的了解和深入;无论是WINGRUB还是Linux版本的GRUB,最方便的还是对GRUB命令行的操作;一谈到命令行(Command)的操作,可能初学者对此恐惧;其实没有什么难的,象北南这样低级的写手,还能操作得起来,您也应该能行;
2、GRUB的Windows版本WINGRUB;
请参考:
《以WINGRUB引导安装Fedora4.0为例,详述用WINGRUB来引导Linux的安装》
3、GRUB的Linux版本软件包的安装;
其实对于Linux的GRUB,几乎所有的Linux主流发行版都有打包,如果您安装了Linux,并且在开机后出现GRUB字样的,证明您已经安装了GRUB;而无需再次安装;Linux的GRUB软件包安装部份并不是本文的重点;
如果您的Linux系统没有安装GRUB,或者采用的是LILO,而您想用GRUB,可以用系统安装盘自带GRUB软件包来安装,或者到相关发行版本的软件仓库下载后安装;
GRUB的Linux版本目前在各大发行版中都有打包;比如Fedora/Redhat/Centos/Mandrive/Mandriva/SuSE等以RPM包管理机制的系统,可以通过如下的命令来安装;
请参考《Fedora/Redhat软件包管理指南》
[root@localhost~]#rpm-ivhgrub*.rpm如果是Slackware您可以用如下的办法来安装;
[root@localhost~]#installpkggrub*.tgz其它的发行版本请用其自己特色的软件包管理工具来安装;
当然您也可以通过源码包,在任何Linux的发行版上安装;至于源码包的安装方法;
请参考:
《如何编译安装源码包软件》
[root@localhost~]#tarzxvfgrub*.tar.gz
[root@localhost~]#cdgrub-xxx
[root@localhost~]#./configure;make;makeinstall确认您是否成功安装了GRUB,您可以测试是否有如下两个命令;
[root@localhost~]#grub
[root@localhost~]#grub-install如果您不能找到这两个命令,可能您的可执行程序的路径没有设置;
请参考:
《设置可执行程序路径》,当然您可以用绝对路径;比如下面的;
[root@localhost~]#/usr/sbin/grub
[root@localhost~]#/usr/sbin/grub-install如果您还是找不到GRUB软件包安装在哪了;您可以用下面的命令来解决和查找;
[root@localhost~]#updatedb 注:
这个要花很长时间;是索引slocate的库,然后再通过locate来查找;
[root@localhost~]#locategrub比如找到的是有类似如下的;
[root@localhost~]#locategrub
/sbin/grub-md5-crypt
/sbin/grub
/sbin/grub-install
/sbin/grub-terminfo在一般情况下,在路径中带有bin或sbin中字样的,这些路径下都是可执行程序;sbin是超级权限用户才能使用的管理命令;要使用这些命令一般的情况下得切换到root用户下才能使用;比如
[beinan@localhost~]$su- 注:
切换到root用户,并且切换到其家目录;
Password:
[root@localhost~]#/sbin/grub 注:
用绝对路径来运行grub命令;
三、在Linux中,GRUB的配置中的安装和写入硬盘的MBR;
1、在Linux中,GRUB配置过程中的安装grub-install;
grub-install命令有何用呢?
其实就是把我们前面已经安装的软件包中的一些文件复制到/boot/grub中;对于新安装GRUB软件包后,也是一个必经的过程;我们前面所说的GRUB软件包的安装;而现在我们说的是GRUB配置的过程中的安装;虽然在洋文中都是install,但表达的意思是不一样的;
我们首先要运行fdisk-l来确认到底是硬盘的标识;
这个过程主要是确认硬盘的标识是哪个调备,到底是/dev/hda还是/dev/hdb还是其它的;
[root@localhost~]#fdisk-l
Disk/dev/hda:
80.0GB,80026361856bytes
255heads,63sectors/track,9729cylinders
Units=cylindersof16065*512=8225280bytes
DeviceBoot Start End Blocks Id System
/dev/hda1 * 1 970 7791493+ 7 HPFS/NTFS
/dev/hda2 971 9729 70356667+ 5 Extended
/dev/hda5 971 2915 15623181 b W95FAT32
/dev/hda6 2916 4131 9767488+ 83 Linux
/dev/hda7 4132 5590 11719386 83 Linux
/dev/hda8 5591 6806 9767488+ 83 Linux
/dev/hda9 6807 9657 22900626 83 Linux
/dev/hda10 9658 9729 578308+ 82 Linuxswap/Solaris如果通过fdisk-l出现有/dev/hda字样的,我们就要用下面的命令来安装;
[root@localhost~]#grub-install/dev/hda
Installationfinished.Noerrorreported.
Thisisthecontentsofthedevicemap/boot/grub/device.map.
Checkifthisiscorrectornot.Ifanyofthelinesisincorrect,
fixitandre-runthescript`grub-install'.
(fd0) /dev/fd0
(hd0) /dev/hda如果是您fdisk-l出现的有/dev/hdb呢,那就如下运行;
[root@localhost~]#grub-install/dev/hdb如果既有/dev/hda和/dev/hdb就安装到/dev/hda中;
[root@localhost~]#grub-install/dev/hda值得注意的是如果您有一个/boot分区,应该用如下的办法来安装;
[root@localhost~]#grub-install--root-directory=/boot/dev/hda
[root@localhost~]#grub-install--root-directory=/boot/dev/hdb注解:
具体是/dev/hda还是/dev/hdb,请以fdisk-l为准;如果两个都有,就看您把/boot分区是放在第一块硬盘还是第二块硬盘上了,以实际情况为准;
2、设定GRUB的/boot分区并写入MBR;;
在Linux中,GRUB软件包的安装,及在配置过程中安装grub到/boot中还是不够的,还要把GRUB,写入MBR才行;有时我们重新安装了Windows,Windows会把MBR重写,这样GRUB就消失了;如果您出现这样的情况,就要进行这个过程;
[root@localhost~]#grub会出现grub>提示符,这是grub命令行模式,如果能在开机中出现提示符,没有引导不起来的系统,除非您的系统破坏的极为严重。
如果仅仅是GRUB被破坏了,GRUB命令行是能让操作系统引导起来的;
接着看例子,我们要找到/boot/grub/stage1的,在grub>后面输入;
grub>find /boot/grub/stage1
(hd0,6)
(fd0) 注:
这个是软驱;现在很少用软驱了,如果您有这方面的需要,自己看GRUB的DOC吧;注解:
(hd0,6) 这是/boot所在的分区;不要误解为是Linux的/所在的分区,这是值得注意的;
(fd0) 注:
这个是软驱;现在很少用软驱了,如果您有这方面的需要,自己看GRUB的DOC吧;
grub>root(hd0,6) 注:
这是/boot所在的分区;
grub>setup(hd0) 注:
把GRUB写到MBR上;注解:
上面这步骤是根据find/boot/stage1而来的,仔细看一下就明白了;现在我们一般安装很少会把/boot分区列为一个单独的分区;不过有的弟兄可能也喜欢这么做;所以还是有必要说一下为好;
四、GRUB的配置文件的menu.lst的写法;
对于GRUB来说,如果没有配置menu.lst,无论是Linux版本的GRUB,还是WINGRUB,都会有命令行可用,通过命令行是一样能把操作系统引导起来的;有些弟兄总以为menu.lst配置错了,或者在机器启动后出现grub>命令行模式就要重新安装系统,其实根本没有这个必要;只要学会GRUB的命令行的用法,根本没有必要重装系统;
menu.lst位于/boot/grub目录中,也就是/boot/grub/menu.lst文件;您可以用vi或您喜欢的编辑器来编辑他;如果您不会用vi,还是去学习一下吧;简单的用法怎么也得会,对不对?
毕竟这个文档不是讲vi的用法的;
有的弟兄会说,我没有menu.lst怎么办?
那就创建一个;用下面的命令;
[root@localhost~]#touch /boot/grub/menu.lst
然后我们再做一个/boot/grub/menu.lst的链接/boot/grub/grub.conf
[root@localhost~]#cd/boot/grub
[root@localhost~]#ln-smenu.lstgrub.conf现在我们来写GRUB的menu.lst了,因为/boot/grub/grub.conf是/boot/grub/menu.lst的链接文件,改哪个都行。
链接文件相当于Windows的快捷方式,这样可能能更好的理解;
1、menu.lst的写法之一;
首先我们看一下我的Fedora4.0中的/boot/grub/menu.lst的内容;
default=0
timeout=5
#splashimage=(hd0,6)/boot/grub/splash.xpm.gz
hiddenmenu
titleFedoraCore(2.6.11-1.1369_FC4)
root(hd0,6)
kernel/boot/vmlinuz-2.6.11-1.1369_FC4roroot=LABEL=/
initrd/boot/initrd-2.6.11-1.1369_FC4.img
titleWinXp
rootnoverify(hd0,0)
chainloader+1注解:
default=0
default=0是默认启动哪个系统,从0开始;每个操作系统的启动的定义都从title开始的,第一个title在GRUB的启动菜单上显示为0,第二个启动为1,以此类推;
timeout=5
注:
表示在开机后,GRUB画面出现几秒后开始以默认启动;如果在启动时,移动上下键,则解除这一规则;
#splashimage=(hd0,6)/boot/grub/splash.xpm.gz 注:
GRUB的背景画面,这个是可选项;我不喜欢GRUB的背景画面,所以加#号注掉,也可以删除;
hiddenmenu注解:
隐藏GRUB的启动菜单,这项也是可选的,也可以用#号注掉;
一般的情况下对Linux操作系统的启动,一般要包括四行;title行;root行;kernel行;initrd行;
1)在menu.lst中,通过root(hd[0-n],y)来指定/boot所在的分区;
titleXXXXX注:
title后面加一个空格,title是小写的,后面可以自己定义;比如FC4,自己定义一个名字就行;
root(hd[0-n],y),在本例中,我们看到的是root(hd0,6),root(hd[0-n],y)表示的是/boot所在的分区;有时我们安装Linux的时候,大多是不设置/boot的,这时/boot和/所在的同一个分区;这个root(hd[0-n],y)很重要,因为/boot目录中虽然有grub目录,最为重要的是还有kernel和initrd文件,这是Linux能启动起来最为重要东西;
有的弟兄会问,root(hd[0-n],y)是怎么来的?
请参考:
《在Linux系统中存储设备的两种表示方法》
2)在menu.lst中,kernel命令行的写法;
kernel一行,是通指定内核及Linux的/分区所在位置;
比如例子中是;
kernel/boot/vmlinuz-2.6.11-1.1369_FC4roroot=LABEL=/
在这里以kernel起始,指定Linux的内核的文件所处的绝对路径;因为内核是处在/boot目录中的,如果/boot是独立的一个分区,则需要把boot省略;如果/boot是独立的分区,这行要写成:
kernel/vmlinuz-2.6.11-1.1369_FC4roroot=LABEL=/ 因为/boot所处的分区已经在title下一行root(hd[0-n],y)中指定了,所以就无需要再指明内核处在哪个分区了;另外Linux系统的硬盘分区的挂载配置文件在/etc/fstab,原理是通过mount/dev/hd[a-z]X/boot来进行的;您可以对照着来理解;
ro表示只读;root=LABEL=/来表示Linux的根所处的分区。
LABEL=/这是硬盘分区格式化为相应文件系统后所加的标签;如果您不了解什么是标签,也可以直接以/dev/hd[a-z]X或者/dev/sd[a-z]X来表示;就看您的Linux是根分区是在哪个分区了。
比如我的是在/dev/hda7,那这里就可以写成root=/dev/hda7;
如果查看系统运行所挂载的分区,请用df-lh来查看,就能明白是不是/boot是独立的分区,或者查看/etc/fstab也能知道;
[root@localhost~]#df-lh
Filesystem 容量 已用可用已用%挂载点
/dev/hda7 11G 9.2G 1.2G 90%/
/dev/shm 236M 0 236M 0%/dev/shm在这个例子中,我们可以发现/boot并没有出现只有/dev/hda7,这表示/boot并不是独立的一个分区;所有的东西都包含在/中;于是我们在/boot中查看内核版本;
[root@localhost~]#ls/boot/vmlinuz*
/boot/vmlinuz-2.6.11-1.1369_FC4 注:
看到内核vmlinuz所处的目录;于是我们就可以这样kernel这行了;
kernel/boot/vmlinuz-2.6.11-1.1369_FC4 roroot=/dev/hda7
3)initrd命令行的写法;
如果是/boot独立一个分区,initrd一行要把/boot中省略;如果/boot不是处于一个分区,而是和Linux的/分区处于同一分区,不应该省略;
比如我们在2)中用的例子;现在拿到这里,我们应该首先查看/boot中的initrd的文件名到底是什么;
[root@localhost~]#ls/boot/initrd*
/boot/initrd-2.6.11-1.1369_FC4.img如果是通过df-lh得知或查看/etc/fstab也行,得知/boot是独立的分区;这时initrd应该写成;
initrd /initrd-2.6.11-1.1369_FC4.img如果是/boot不是独处一个分区,而是在/同一处一个分区,则要写成;
initrd /boot/initrd-2.6.11-1.1369_FC4.img
4)menu.lst第一种写法的总结和实践;
在这里,我们只说重要的,不重要的就一带而过了;
1]用fdisk-l;df-lh;more/etc/fstab来确认分区情况;
我们过fdisk-l;df-lh;more/etc/fstab来确认/boot所在的分区,及Linux的根分区所在位置;
比如我们确认/boot和Linux的/分区同处一个分区;
[root@localhost~]#df-lh
Filesystem 容量 已用可用已用%挂载点
/dev/hda7 11G 9.2G 1.2G 90%/
/dev/shm 236M