1. GRUB 介绍
计算机在启动时候首先由BIOS中执行自检自检通过后就根据CMOS配置找到第个可启动磁盘MBR中Boot Loader(般在启动盘第个物理扇区占416字节)并把控制权交给Boot Loader由Boot Loader进步完成操作系统内核加载当Boot Loader找到内核的后就把控制权交给操作系统内核由内核继续完成系统启动
可以看出Boot Loader 是计算机启动中第 2个要执行它是引导操作系统关键可以引导操作系统Boot Loader主要有LiLo、GRUB以及下MBR其中GRUB是目前使用最为广泛并且非常优秀款启动引导
(1) GRUB特性
q 提供了图形和文本两种操作接口
q 提供文本格式可手工修改配置文件
q 支持动态加载需要模块
q 可以移植到区别平台上
q 支持国际化语言如英文中文日文汉文等多字节语言
q 跨平台安装允许从另个平台上安装GRUB
q 支持rescue模式可用于系统无法引导情况
q 支持多种可执行文件格式支持各种a.out格式和ELF格式
q 多文件系统识别如BSD FFSDOS FAT16FAT32和Linux ext2fs
q 支持压缩文件解压缩能够解压缩被gzip压缩文件
q 能够使用BIOS所检测到全部RAM空间
q 支持硬盘LBA模式能够访问8GB以外全部硬盘空间
q 支持网络引导可以通过TFTP从网络上得到操作系统映象文件并引导
(2) GRUB对设备命名
首先GRUB对设备命名必须包含在小括号( )内;其次GRUB不区分IDE硬盘和SCSI硬盘统使用hdx其中x指定BIOS中硬盘编号并从0开始计数而且IDE硬盘编号小于SCSI硬盘;第 3GRUB用fdx指定软盘设备x是软盘驱动器号下面是些GRUB对设备命名举例:
q (fd0)表示第1个软盘
q (hd0,1)表示第1个硬盘第2个分区
q (hd0,0)/boot/vmlinuz表示第1个硬盘第个分区下boot/目录下vmlinuz文件如果没有指定某个分区则表示使用整个设备否则只使用指定分区
q (hd0,2,a)专用于FreeBSDFreeBSD有个slice概念把个分区进步分为几个slice此处指明是第1块硬盘第3个分区中slice a
(3) GRUB执行流程
GRUB工作原理如图5.2所示当系统加电后固化在BIOS中首先对系统硬件进行自检自检通过后就加载启动磁盘上MBR并将控制权交给MBR中(stage1)stage1执行判断自己是否GRUB如果是且配置了stage1_5则加载stage1_5否则就转去加载启动扇区接着stage2被加载并执行由stage2借助stage1_5驱动文件系统并查找grub.conf显示启动菜单供用户选择然后根据用户选择或默认配置加载操作系统内核并将控制权交给操作系统内核由内核完成操作系统启动
从上面叙述可以看出GRUB涉及到几个重要文件:
第个就是stage1它被安装在MBR扇区(0面0磁道第1扇区)大小为512字节(446字节代码+64字节分区表+2字节标志55AA)它负责加载存放于0面0道第2扇区start
第 2个是stage1_5stage1_5负责识别文件系统和加载stage2所以stage1_5往往有多个以支持区别文件系统读取在安装GRUB时候GRUB会根据当前/boot/分区类型加载相应stage1_5到0面0磁道第3扇区stage1_5是由start加载
第 3个是stage2它负责显示启动菜单和提供用户交互接口并根据用户选择或默认配置加载操作系统内核同前两个文件区别stage2是存放在磁盘上/boot/grub下
第 4个是menu.lst(/boot/grub/grub.conf链接)grub.conf是个基于脚本文本文件其中包含菜单显示配置和各个操作系统内核加载配置GRUB根据grub.conf显示启动菜单提供同用户交互界面GRUB正是根据用户选择或默认配置和grub.conf内核配置加载相应内核并把控制权交给内核使得内核完成真正操作系统启动
其它重要文件GRUB除了上面叙述主要文件的外还包括支持交互功能些磁盘主要包括/sbin/下grub、grub-、grub-md5-crypt和grub-terminfo和/usr/bin/mbchk以及/boot/grub下设备映像文件(device.map)和菜单背景图像文件(splash.xpm.gz)
通过上面分析整理总结可以很容易地看出GRUB实际上包含两部分部分被安装在磁盘特殊扇区另外部分则以文件形式存在要让GRUB启动操作系统就必须首先把GRUBstage1和stage1_5(根据文件系统自动选择是否安装)安装到磁盘特殊扇区另外在磁盘/boot/grub下存在有grub.conf、device.map等文件和支持交互而且这些必须在PATH环境变量指定路径中具备了这些知识相信不管是安装、配置、备份或修复GRUB都不是件很难是情下面就来逐个讲解这些知识
2. 编译安装GRUB
般情况下当完成Linux操作系统安装后系统中已经安装好了LILO或GRUB引导由于系统出现故障或需要更换LILO为GRUB时需全新或重新安装GRUB如何安装和配置GRUB就是下面要介绍内容而有时候GRUB出现了故障但并不需要重新安装从后面内容中读者也可以读到如何修复GRUB知识
(1) 安装包
可以从GRUB源码具体安装思路方法请参考下面内容这里安装过程都是在RHEL 4中进行
(2) 检查是否安装GRUB
#rpm -q grub
如果显示grub-0.95-3.5或其它版本GRUB信息介绍说明系统已经安装了则执行如下命令首先将其卸载:
#rpm -e grub
(3) 编译源码安装
a.) 编译条件
要编译GRUB源代码系统必须具备以下条件:
q GCC2.95或者以上版本
q 安装了GNU Make
q binutils2.9.1.0.23或者个更高版本
q Texinfo 4.0或者更高版本
q Autoconf 2.5x
q Automake 1.7 或者更高版本
b.) 编译安装
这里假设GRUB源代码为grub-0.95.tar.gz并放在~/(当前用户主目录)下通过编译源代码安装GRUB基本过程如下:
#tar -zxvf grub-0.95.tar.gz #解压源代码
#cd grub-0.95 #转入grub目录
#./configure #生成Makefile文件
#make #编译代码并安装
(4) 安装GRUB到MBR
GRUB工作目录是在/boot/grub下而make 并没将其安装到/boot/grub所以安装完成后要执行如下些操作:
a) 把/usr/local/share/grub/i386-pc/目录下所有文件统统拷贝到/boot/grub/目录下
#cp /usr/local/share/grub/i386-pc/* /boot/grub/
b) 在/boot/grub下创建grub.conf文件并建立个到grub.conf软链接menu.lst
#cd /boot/grub
#touch grub.conf
#ln -s grub.conf menu.lst
注意!如果已经存在grub.conf就最好不要再次创建需要时直接修改即可
c) 确认/usr/local/sbin和/usr/local/bin在PATH变量值中执行如下命令检查
#env |grep PATH
如果发现/usr/local/sbin和/usr/local/bin不在PATH变量中可以通过如下命令修改:
#export PATH=$PATH /usr/local/sbin:/usr/local/bin
d) 安装GRUB到MBR
GRUB在启动中被BIOS只有放在MBR中才可以被所以GRUB要让BIOS就必须安装在MBR中实际上是将stage1安装到MBR中也可能根据文件系统选择安装了stage1_5下面提供几个安装GRUB例子:
#grub- /dev/hda //将GRUB安装到第1块IDE硬盘MBR
#grub- /dev/sda //将GRUB安装到第1块SCSI硬盘MBR
#grub- /dev/fd0 //将GRUB安装到软盘
#grub- /dev/hda1 //将GRUB安装到第1快硬盘0扇区当用其它引导引导系统时往往选择这种方式以免覆盖其它引导
e) 在GRUB命令行模式下安装GRUB
有关GRUB命令行模式及其操作思路方法请参考3小节内容在系统显示启动菜单时候按下c键或者系统启动后在命令行执行/usr/sbin/grub都可以进入GRUB命令行模式命令行模式下安装GRUB基本过程如下:
q 指定启动设备
grub>root (hd0,0) #除了root后必须有空格别位置均不能有空格!
此处(hd00)是指第1块硬盘第1个分区如果不能确定包含GRUBstage1文件分区可以通过find指令查找确定:
grub> find /boot/grub/stage1 #查找stage1
GRUB将会查找文件/boot/grub/stage1并显示包含这个文件设备名这个设备就是上面要用到设备
q 安装GRUB
grub> up (hd0) #除了up后必须有空格别位置均不能有空格!
这条命令将会在第1块硬盘MBR安装GRUB如果不想在MBR安装GRUB而是希望将GRUB安装在某分区引导扇区话可以用下面命令安装:
grub> up (hd0,0) #除了up后必须有空格别位置均不能有空格!
这将会在第1块硬盘第1个分区引导扇区安装GRUB
q 退出GRUB
grub>quit
f) 重启机器新安装GRUB生效
3. GRUB交互操作
为了方便用户交互使用GRUBGRUB提供了交互模式下面分别作介绍:
(1) 命令行模式
登陆Linux系统后在命令行中输入grub便可以进入到命令行模式如图4-3所示进入命令行模式后GRUB会给出个命令提示符“grub>”此时就可以键入命令按回车执行此模式下允许类似于Bash shell命令行编辑功能:
启动时GRUB命令行模式在命令行模式下键有补全命令功能如果你敲入了命令前部分键入系统将列出所有可能以你给出串开头命令如果你给出了命令在命令参数位置按下键系统将给出这条命令可能参数列表
在计算机启动时候GRUB首先显示启动菜单这是如果用户按键盘“c”键便进入如图4-4所示命令行模式它操作和在Linux命令行模式是样
(2) 菜单模式
系统在启动时如果找到/boot/grub/menu.lst则grub显示grub并进入菜单模式如图4-4所示菜单模式下用户可以选择要启动操作系统或者修改配置菜单定义在menu.lst文件中也可以从菜单模式按键进入命令行模式并且可以按键从命令行模式返回菜单模式菜单模式下按键将进入菜单编辑模式
(3) 菜单编辑模式
菜单编辑模式用来对菜单项进行编辑改变其界面和菜单模式界面十分类似区别是菜单中显示是对应某个菜单项命令列表如果在编辑模式下按下则取消所有当前对菜单编辑并回到菜单模式下在编辑模式下选中个命令行就可以对这条指令进行修改修改完毕后按下回车GRUB将提示你确认并完成修改如果你想在当前命令列表中增加条命令按在当前命令下面增加条指令按在当前命令前处增加条指令按删除条指令
在实际中菜单模式用于选择要启动操作系统菜单编辑模式用于临时修改编辑启动菜单这样修改可疑通过命令写入MBR活指定分区但并不影响grub.conf命令行模式也是样可以通过命令方式动态启动个操作系统同时也不影响grub.conf所以菜单编辑模式和命令行模式常常用来安装GRUB到MBR或动态引导个操作系统而GRUB配置文件则是系统启动时GRUB必须加载配置文件这个文件中有有关GRUB各种配置不需要用户每次启动都执行繁琐命令了
4. GRUB配置文件
grub.conf是GRUB配置文件其结构比较简单可以分为两部分第步分是全局配置另外部分就是每个操作系统启动配置其中可以有多个操作系统菜单配置下面就是个具体例子
#=/boot/grub/grub.conf文件范例
timeout 30 # 等待用户选择菜单项时间(以秒计)超时则引导默认选项
default 0 # 默认选项第项
fallback 1 # 如果第项出错则启动下面后备选项
splashimage=(hd0,0)/grub/splash.xpm.gz #GRUB启动画面
#以下是启动Linux配置
titleRed Hat Linux Enterprise AS3 for syd168 #启动项菜单标题
root (hd0,0) #指定根文件系统第1块硬盘第1个扇区中/boot
kernel /vmlinuz-2.4.18 ro root=LABEL=/ #内核在/boot中
initrd /initrd-2.4.18-14.img #启动RAM盘在/boot下
#以下是启动配置如果只有Linux就不需要
title Windows2003 Enterprise for syd168 #Windows启动菜单标题
root novery(hd0,1) #该操作系统在hd0第 2分区不mount
chainloader +1 #从第个硬盘第 2个分区引导Windows
#=/boot/grub/grub.conf文件范例
上面例子只是简单介绍说明了GRUB中启动Linux和Windows配置思路方法更多启动配置请参考下面内容
5. 引导多系统配置
GRUB支持多操作系统引导用GRUB引导后可以进入命令行模式或者菜单模式可以通过灵活命令行模式选择引导各个分区操作系统指定引导参数GRUB支持 3种引导思路方法种是直接引导操作系统内核另种是通过chainload进行间接引导第 3种就是通过网络引导操作系统
对于GRUB能够支持LinuxFreeBSDOpenBSDNetBSDGUN Mach等可以通过直接引导完成但是对于GRUB不支持操作系统(如Windows)需要用第 2种思路方法chainload来完成下面就分别来看看这几种引导思路方法:
(1) 直接引导
配置过程通常如下:
a) 用root命令设置包含操作系统内核根设备
b) 用kernel命令装载内核映象文件如果这个内核引导时有参数话可以直接将参数加在内核文件名后面
c) 用module或modulenounzip装载内核模块
d) boot开始引导
(2) chainload引导
a) 设置GRUB根设备用rootnovery (hdxy)指定
b) 开始引导用chainloader +1指定此处“+1”是指示GRUB读入分区第个扇区引导记录
c) 执行boot开始引导
以上是般chainloader方式对于DOS和WINDOWS可以简单地用两条指令进行引导:chainloader (hdxy)+1然后boot其中xy用来指明所在分区号
(3) 从网络引导:
为了使GRUB能够支持从网络引导需要在编译时打开网络支持选项(请参考源文件中netboot/README.netboot)另外要在网络中设置两个服务:动态IP服务(BOOTP、DHCP或RARP)和FTP服务然后分别针对区别BOOTPDHCP或RARP运行bootpdhcp或rarp如果切设置无误话GRUB就会给出IPIP netmask和TFTPIP和网关IP地址最后从网上得到操作系统映象文件下面是个例子:
grub> bootp
Probing……[NE*000]
NE2000 base ……
Address: 192.168.110.23 Netmask: 255.255.255.0
Server: 192.168.110.14 Gateway: 192.168.110.1
grub> root (nd)
grub> kernel /tftproot/gnumach.gz root=sd0s1
最新评论