2024年1月12日发(作者:)

一. GRUB的技术特点:

1. 支持多可执行文件格式

GRUB支持各种格式和ELF格式。

2. 支持不符合Multiboot标准的内核

GRUB能够直接支持多种并不符合Multiboot标准的自由操作系统内核(主要是FreeBSD,NetBSD,OpenBSD和 linux)。也能通过chainload间接引导非开放的其他操作系统。

3. 支持操作系统模块装载。

4. 提供文本格式可手工修改的配置文件。

5. 菜单界面

6. 灵活的命令行界面

7. 多文件系统识别

能够透明地识别多种文件系统,现在能够识别的文件系统有BSD FFS,DOS

FAT16,FAT32和Linux ext2fs.这个范围仍然在扩展。

8. 支持压缩文件的解压缩。

能够解压缩被gzip压缩的文件,并且这个识别和解压过程是自动的和对用户透明的,这个功能大大地减少了文件的大小,减少了load的时间,这个功能对于软盘上的系统尤其有用。

可能有些内核模块在装载时要求是压缩状态,这时解压此模块可能会画蛇添足,所以GRUB提供了另一不进行解压缩的模块装载命令。

9. 可以读取任何已安装的设备上的数据

支持读取软盘,硬盘上的数据,不依赖于根设备上任何的设置。

10. 和磁盘定位的表示方法无关。

11. 能够使用BIOS所检测到的所有RAM.

GRUB通常能够找到PC兼容机上的全部RAM,它采用一种先进的BIOS查询技术来找到所有的内存空间。

12. 支持硬盘的LBA模式

GRUB通过支持LBA模式,突破1024柱面的限制,能够访问8GB以外的全部硬盘空间。

13. 支持网络

虽然GRUB是一个基于磁盘的引导程序,但是它也支持网络功能,你可以通过TFTP协议从网络上得到操作系统映象文件并引导。

GRUB的后继版本可能会包括一个内置的可编程语言来支持各种内核的引导参数,这还

只是一个操作系统引导器吗?;),并且计划加入对非PC体系结构的支持。

下载并安装GRUB

下载GRUB包

你可以到;得到GRUB,然后:

zcat | tar xvf -

会生成一个目录grub-0.5.94,再:

cd grub-0.5.94

./configure

make install

这样GRUB就安装好了,下面你需要在你的硬盘或者软盘引导区上安装GRUB引导代码。

制作GRUB引导软盘:

cd /boot/grub

dd if=stage1 of=/dev/fd0 bs=512 count=1

dd if=stage2 of=/dev/fd0 bs=512 seek=1

制作GRUB硬盘引导:

重启动用GRUB引导软盘引导,或者你不想重启动也可以执行/usr/sbin/grub。两种情况都会进入命令行界面。 然后,我们首先要设置GRUB的“根设备”,也就是告诉GRUB安装所在的分区:

grub> root (hd0,0)

这里牵涉到GRUB的设备命名规则,将在下面介绍,此处(hd0,0)是指第一块硬盘的第一个分区。

如果你不能够确定安装GRUB所在的分区号的话,可以通过find指令查找:

grub> find /boot/grub/stage1

GRUB将会查找文件/boot/grub/stage1并显示包含这个文件的设备名,当然就是我们安装GRUB所在的分区。下面就可以写引导记录了:

grub> setup (hd0)

这条命令将会在第一块硬盘的MBR安装GRUB引导,如果你不想在MBR安装GRUB,而是希望将GRUB安装在分区的引导扇区的话,你可以用下面指令指定安装设备:

grub> setup (hd0,0)

这将会在第一块硬盘的第一个分区的引导扇区安装GRUB。

OK,现在你就可以重新启动由GRUB引导你的系统。

设备命名规则

首先GRUB对设备的命名必须包含在小括号内,GRUB不区分IDE硬盘和SCSI硬盘,统一使用hdx,其中x指定BIOS中硬盘的编号,从零开始计数,而且通常计算机内的IDE硬盘编号在SCSI硬盘前。GRUB用fdx指定软盘设备,x是软盘驱动器号。具体命名规则如下:

(fd0):第一软驱,GRUB还可以引导软盘上的操作系统

(hd0,1): 第一块硬盘的第二个分区。

(hd1,4): 第二块硬盘的第一个扩展分区,扩展的分区是从4开始编号的。

(hd0,2,a): 专用于FreeBSD,FreeBSD有一个slice概念,把一个分区进一步分为几个slice,此处指明是第一块硬盘的第三个分区中的slice a。你也可以用(hd0,a),这样GRUB就会在第一块硬盘上找到第一个FreeBSD分区的slice a。

让我们再来看看GRUB对于磁盘文件的命名方法:

(hd0,1)/vmlinuz,很简单只要指定分区号和文件的绝对路径名就可以了。

引导多系统

现在来看看如何用GRUB引导我们的多操作系统,用GRUB引导后可以进入命令行模式或者菜单模式,你可以通过灵活的命令行模式选择引导各个分区的操作系统,指定引导参数。

GRUB支持三种引导方法,第一种是直接引导操作系统内核,第二种是通过chainload进行间接引导。

对于GRUB能够支持的LINUX,FreeBSD,OpenBSD,NetBSD,GUN Mach可以通过直接引导完成,不需要其他的引导扇区了,但是对于GRUB不直接支持的操作系统,需要用第二种方法chainload来完成。另外GRUB还支持网络引导,我们分别来看看这几种引导方法:

(a) 直接引导:

通常步骤如下:

1.用root命令设置包含操作系统内核的根设备

2.用kernel命令装载内核映象文件,如果这个内核引导的时候有参数的话,可以直接将参数加在内核文件名的后面。

3.用module或modulenounzip装载内核模块。

开始引导。

(b) chainload引导:

1.首先设置GRUB的根设备,用:

grub> rootnoverify (hdx,y)

2.开始引导

grub> chainloader +1

此处'+1'是指示GRUB读入分区的第一个扇区的引导记录。

3.执行boot开始引导

以上是一般的chainloader方式,对于DOS和WINDOWS,可以简单地用两条指令进行引导:

chainloader (hdx,y)+1,然后boot,其中x,y用来指明所在分区号。

(c) 从网络引导:

为了使GRUB能够支持从网络引导,你需要在编译时打开网络支持选项,关于这个你可以参考源文件目录里的`netboot/t为了从网络引导,你首先要在网络设置两个服务,首先是动态IP配置服务,可以是BOOTP,DHCP或RARP服务器,另一个是TFTP服务。

然后分别针对不同的服务器BOOTP,DHCP或RARP(三个选一个)运行bootp,dhcp,rarp。如果一切设置无误的话GRUB就会给出IP,IP netmask和TFTP服务器的IP和网关的IP地址。最后,从网上得到操作系统的映象文件,网络的设备名称是(nd).如下例:

grub> bootp

[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/ root=sd0s1

grub> module /tftproot/

grub> boot

实例

GNU/Hurd

--------

因为GNU/Hurd是符合Multiboot规范的操作系统,所以非常容易引导:

grub> root (hd0,2)

如果你不记得Hurd所在的分区号的话,可以用find /boot/gnumach查找。

grub> kernel /boot/gnumach root=hd0s1

grub> module /boot/serverboot

grub> boot

GNU/Linux

---------

grub> root (hd1,3)

grub> kernel /vmlinuz root=/dev/hda1

如果你需要指定内核启动参数的话,可以直接加到命令的最后面如:

grub> kernel /vmlinuz root=/dev/hda1 vga=ext

如果你使用initrd的话,在kernel命令之后执行:

grub> initrd /initrd

grub> boot

FreeBSD

-------

GRUB能够直接装载.ELF和两种格式的内核,但是由于FreeBSD的内核引导接口有时有较大的变动,所以,对FreeBSD最安全的引导方法是引导/boot/loader

grub> root (hd0,a)

grub> kernel /boot/loader

grub> boot

NetBSD,OpenBSD,NetBSD

-------------------------------------

这三种系统的引导指令序列一样,如下:

1. 'root'设置根设备.

2. `kernel'装载内核.

3. `boot'引导.

DOS/Windows

grub> rootnoverify (hd0,0)

grub> chainloader +1

grub> boot

SCO UnixWare

------------

grub> rootnoverify (hd1,0)

grub> chainloader --force +1

grub> makeactive //注意这条指令将设置UnixWare分区为活动分区,这样要求你的GRUB安装在MBR,否则下次启动时将直接进入UnixWare而不会进入GRUB grub> boot

当然,如果每次引导都需要敲入命令的话实在是太麻烦了,因此,类似于LILO,GRUB提供了一个菜单方式,你需要一个配置文件将这些命令放入配置文件中就可以实现菜单方式的多引导,当然在菜单方式下你可以切换到命令模式下。GRUB引导时查找/boot/grub/,如果存在这个文件的话,就根据这个文件生成一个引导菜单,文件格式很简单。

菜单设置

# 等待用户选择菜单项的时间(以秒计),超时则引导默认的选项

timeout 30

# 默认选项,第一项

default 0

# 如果第一项出错,则启动下面的后备选项

fallback 1

# 引导 GNU Hurd,其中title就是菜单中显示的提示字符串

title GNU/Hurd

root (hd0,0)

kernel /boot/ root=hd0s1

module /boot/

# 引导 Linux

title GNU/Linux

root (hd1,0)

kernel /vmlinuz root=/dev/hdb1

# 引导Mach (kernel映象文件放在软盘)

title Utah Mach4 multiboot

root (hd0,2)

pause Insert the diskette now!!

kernel (fd0)/boot/kernel root=hd0s3

module (fd0)/boot/bootstrap

# 引导 FreeBSD

title FreeBSD 3.4

root (hd0,2,a)

kernel /boot/loader

# 引导 OS/2

title OS/2

root (hd0,1)

makeactive

chainloader +1

# 引导 Windows NT 或者 Windows95,98

title Windows NT / Windows 95,98 boot menu

rootnoverify (hd0,0)

chainloader +1

# 安装 GRUB 到硬盘MBR

title Install GRUB into the hard disk

root (hd0,0)

setup (hd0)

# 改变显示菜单的颜色

title Change the colors

color light-green/brown blink-red/blue

用户界面

GRUB的用户界面有三种:命令行模式,菜单模式和菜单编辑模式

(a) 命令行模式:

进入命令行模式后GRUB会给出一个命令提示符`grub>`,此时就可以键入命令,按回车执行。此模式下可执行的命令是在中可执行的命令的一个子集。此模式下允许类似于Bash shell的命令行编辑功能:

或<右箭头键> 光标右移一个字符

或<左箭头键> 光标左移一个字符

到这一行的开头

到行尾

删除光标处的字符

删除光标左边的字符

删除光标右边的所有字符(包括光标处的字符)

删除光标左边的所有字符(包括光标处的字符)

恢复上次删除的字符串到光标位置

或<向上键> 历史记录中的上一条命令

或<向下键> 历史记录中的下一条命令

在命令行模式下键有补全命令的功能,如果你敲入了命令的前一部分,键入系统将列出所有可能以你给出的字符串开头的命令。如果你给出了命令,在命令参数的位置按下键,系统将给出这条命令的可能的参数列表,具体的可用命令集将在后面给出。

(b) 菜单模式

当存在文件/boot/grub/文件时系统启动自动进入此模式。菜单模式下用户只需要用上下箭头来选择他所想启动的系统或者执行某个命令块,菜单的定义在文件中,你也可以从菜单模式按键进入命令行模式,并且可以按键从命令行模式返回菜单模式。菜单模式下按键将进入菜单编辑模式。

(c) 菜单编辑模式

菜单编辑模式用来对菜单项进行编辑改变,其界面和菜单模式的界面十分类似,不同的是菜单中显示的是对应某个菜单项的命令列表。如果在编辑模式下按下,则取消所有当前对菜单的编辑并回到菜单模式下。在编辑模式下选中一个命令行,就可以对这条指令进行修改,修改完毕后按下,GRUB将提示你确认并完成修改。如果你想在当前命令列表中增加一条命令,按在当前命令的下面增加一条指令,按在当前命令前处增加一条指令。按删除一条指令。

命令列表

下面是GRUB的可用命令列表:

仅用于菜单的命令(不包括菜单项内部的启动命令)