分类: LINUX
2012-01-07 12:44:39
论坛上关于 GRUB 的贴子不少,但很多都是讲怎么安装而已。这篇文章是我通过翻译 info grub
并动手做实验总结出来的,增加了一些平常不太常见的内容。如有错误,敬请指正。同时由于 info
grub 的内容太多,对部分内容没有进行翻译,希望各位热心人能够补充!!!
btw :为了方便大家阅读,还提供了 pdf 版本下载,就位于该层底部。
**************************************************************************************
注 :该文章参考了如下内容 :
A)官方文档 :
B)grub info 文档
作者 :ailms <>
版本 :v1
最后修改 :2007/03/09 02:04
**************************************************************************************
目录
1、GRUB 基础
2、命名习惯
3、安装 GRUB
4、GRUB 接口
5、GRUB 常用命令
6、保护 GRUB 设置
7、GRUB 和 stage 文件
8、GRUB 常见错误信息
9、制作 GRUB 引导软盘
10、使用 GRUB 通过网络引导操作系统
11、把配置文件嵌入到 GRUB 中
12、总结
13、个人建议
一、GRUB 基础
1.1 GRUB 简介
“boot loader”是计算机启动后第一个运行的软件。它负责加载一个操作系统的内核,并把控制权交给内核。内核则负责剩下的初始过程。
GRUB 一个很重要的特色就是灵活性;GRUB 可以识别文件系统和二进制格式的内核,所以你可以加载任何操作系统,而不需要记录内核在
磁盘上的物理位置。
1.2 GRUB 的现状
我不打算介绍 GRUB 的发展历史,有兴趣的朋友可以自己到官方站点或者执行 info grub 自行获取信息。我们着眼于 GRUB 当前的现状。
目前 GRUB 分成 GRUB legacy 和 GRUB 2。版本号是 0.9x 以及之前的版本都称为 GRUB Legacy ,从 1.x 开始的就称为 GRUB 2。目前
GRUB Legacy 已经停止开发了,只是出于一个 bug fix 的状态,不再增加新的功能了,所有的开发都转移到 GURB 2 之上了。
1.3 GRUB Legacy 和 GRUB 2
GRUB 2 是源自于一个名为 PUPA 的项目,目的是建立下一代的 boot loader。GRUB 2 几乎是从零开始开始开发的,它和 GRUB Legacy 不
同的地方有很多,例如支持 scripts、国际化语言、动态加载模块、带有 resuce 模式等等,这些都是 GRUB Legacy 所没有的。
下面是 GRUB2 新特性的介绍 :(原文请参 )
a)支持脚本语言,例如条件判断,循环、变量和函数
b)图形接口
c)在运行时动态加载需要的模块,而不是在 biuld 的时候指定加入那些模块(静态)
d)可以移植到不同的架构上
e)国际化语言。包括支持非ASCII的字符集和类似 gettext 的消息分类,字体,图形控制台等等。
f)实际内存管理。使得 GNU GRUB 更加具有可扩展性
g)针对文件系统、文件、设备、驱动、终端、命令、分区表、 os loder 的模块化、层次化、基于对象的框架
h)跨平台的安装,允许从另外一个架构上安装 GRUB
i)支持 rescue 模式,可用于系统无法引导的情况。stage 1.5 被取消了
j)修复 GRUB Legacy 设计上的错误,同时又保持向后的兼容性。
1.4 Multiboot 规范
Multiboot 规范是在 boot loader 和 kernel 之间的一个协议,用于统一各种引导操作系统的方法。Linux 和 BSD 目前并不支持该规范。
1.5 可用资源
GRUB 的 homepage )
info grub
1.6 旧版 GRUB(GRUB Legacy)的功能特色
a)识别多种可执行格式,支持 “a.out” , ELF, symbol tables)
b)支持 non-Multiboot 内核。主要是FreeBSD、NetBSD、OpenBSD、Linux。
c)支持加载多个模块
d)支持配置文件
e)提供菜单接口。菜单项的数量并没有限制,目前版本支持数百个菜单条目
f)有一个灵活的命令行接口。如果没有配置文件存在,GRUB 会自动进入命令模式
g)支持多种文件系统格式。主要有BSD FFS”、“DOS FAT 16 、FAT32”,“Minix fs”、ext2/ext3、ReiserFS 、jfs、xfs、VSTa fs
h)支持自动解压
i)能够访问任何已经安装的设备上的数据
j)Be independent of drive geometry translations (这个不知道怎么翻译好)
Unlike many other boot loaders, GRUB makes the particular drive
translation irrelevant. A drive installed and running with one
translation may be converted to another translation without any
adverse effects or changes in GRUB's configuration.
k)检测所有已经安装的 RAM
l)支持 LBA 模式。在传统的磁盘调用(称为 CHS 模式),存在一个限制 :就是 BIOS 无法访问在 1024 柱面。之后的内容,所以 BIOS
只能访问最小 508 MB ,最大8GB 的空间。(这也就是 /boot 分区必须在 1024 柱面之前的原因)。GRUB 并不能解决全部问题,因为
并没有统一的解决方法,不过 GRUB 可以检测是否支持 LBA 模式,如果支持则使用 LBA 模式。
m)支持网络引导,可以使用 TFTP 协议通过网络加载内核
n)支持远程终端,目前只支持串口
二、命名习惯
首先 GRUB 要求设备名被括在一个 ( ) 中。fd表示软盘,hd 表示硬盘(不区分 IDE 还是 SCSI)。其次设备是从 0 开始编号,分区也是如此,
分区和设备之间用一个 ‘,’ 分开。下面给出几个例子 :
(fd0) :表示整个软盘
(hd0,1) :表示 BIOS 中的第一个硬盘的第2个分区
(hd0,0)/boot/vmlinuz :表示 BIOS 中的第一个硬盘的第一个分区下的 boot/ 目录下的vmlinuz 文件。
如果没有指定某个分区,则表示使用整个设备,否则只使用指定的分区。
三、安装 GRUB
3.1 下载 tarball
有两种方法,一种是 rpm ;一种是 tarball 。rpm 没有什么好说的,只是 rpm –Uvh 就可以了。不过一般不会启用网络引导功能,
所以我们决定采用 tarball 的方式安装。 首先到下面的地址下载 tarball
上面有 GRUB Legacy 和 GRUB 2 ,就选择目前 RHEL AS4 用的 0.95 版本做实验。
不过在安装之前先要用 rpm –q grub 检查一下 grub 是否安装了。如果是的话,用 rpm –e grub 删除,即使你在安装时指定不安装
boot loader ,安装程序还是会安装 grub rpm 包的。
3.2 安装需求
INSTALL 文件中给出了 build 所需要的软件包条件 :
GCC :当前版本的 GCC 应该也可以用,不过还是建议用 2.95 或者以上版本的 GCC
GNU Make :生成 Makefiles 所用
GNU binutils 2.9.1.0.23 或者个更高版本
如果你想自己开发 GRUB ,还需要 Texinfo 4.0 或者更高 ,同时还有GNU Autoconf 2.5x ,GNU Automake 1.7 或者更高颁布。
3.3 参数介绍
下面我们介绍几个 configure 过程中可能用到的选项,要完整的选项列表,可以参看 INSTALL 文件和 netboot/README.netboot 文件.
a)--enable-preset-menu=FILE :默认情况下 grub.conf 和 stage2 文件是分离的,使用该选项,可以直接把配置文件嵌入到 stage2 中,
这样启动时可以立即获得配置文件。对于一些嵌入式的系统来说比较有用,又或者在前面提到的没有显示器/键盘的主机有用,因为在切
换显示输出到你的笔记本之前,你是看不到启动的画面的,所以执行切换显示操作也是在看不到输出的情况下进行的(切换显示之后就不会了)。
通过这个选项你可以在
b)--enable-diskless :如果使用了该选项,你会得到额外的两个文件,nbgrub 和 pxegrub。接下来你需要指定网卡的驱动程序,
netboot/ 目录下有较常见的几种 ,可以看到几种网卡可以合用一个驱动。常见的有 :
Intel Etherexpress Pro/100
--enable-eepro100
Novell NE2100 and NE1500
--enable-ne2100
Realtek 8139
SMC 1211
D-Link DFE530TX+ and DFE538TX
--enable-rtl8139
3Com90x
--enable-3c90x
复制代码
如果你不想那么麻烦,则按照下面的过程进行 :
./configure
make
make install
复制代码
安装结束。默认命令会放在 /usr/local/bin 和 /usrlocal/sbin 下。Stage 文件则放在 /usr/local/share/grub/i386-pc/ 目录下。
3.4 安装之后的操作
a)把 /usr/local/share/grub/i386-pc/ 目录下的所有文件统统拷贝到 /boot/grub/ 目录下。
b)接下来是创建 grub.conf ,并在 /boot/grub/ 目录下建立一个 menu.lst ,指向 grub.conf。
c)注意,这个 symbol link 在 Redhat 9 是必需的,否则启动时会直接进入命令模式,即使已经存在 grub.conf ;但在 RHEL AS4 下却不是。
d)确认 /usr/local/sbin 和 /usr/local/bin 在 PATH 变量的值中。
e)执行 grub-install /dev/hda1 把 stage1 写入到 /boot 分区的引导扇区。
也可以执行 grub 进入 grub shell ,然后通过 root 和 setup 命令来安装 stage1 。
f)重启机器,安装过程到此结束。
四、GRUB 接口
GRUB 除了菜单模式,还提供了一个命令模式和 grub shell 。当系统启动并显示菜单时,按 c 键就可以进入命令模式。提示符是 grub> 。
如果你已经成功引导操作系统并登录,可以在 shell 提示符下执行 grub ,这会启动一个 grub shell。提示符也是 grub> 。
GRUB 能够象 bash 一样使用上下键来访问 command history ,ctrl-u、ctrl-k、ctrl-l 等快捷键也可以使用。想要编辑菜单,可以按下 e 键;
想要新增一空白行,可以按下 o 键(当前行之后)或者 O 键(当前行之前)。想要删除当前行,按下 d 键;ESC 键放弃当次修改并返回上级菜单。
有些命令只能在命令模式下,有些命令只能用于配置文件(菜单模式),有些命令在两个模式下都可以使用。下面我们就介绍 GRUB 常用的命令。
五、GRUB 常用命令
5.1 只能用于配置文件的命令
下面这5个命令只能出现于配置文件中,分别是 :
a)default :定义默认引导的操作系统。0 表示第一个操作系统,1表示第2个,依此类推
b)fallback :如果 default 所指定的操作系统引导失败,则默认引导由 fallback 指定的操作系统
c) hiddenmenu :用于启动时隐藏菜单,除非在 timeout 之前按下 ESC 才能看到菜单。
d)timeout :定义多少秒内如果用户没有按下键盘上的某个按键,就自动引导 default 所指定的操作系统。
e)title :定义引导项目的名称。
f)password :用于定义进入 GRUB 命令模式的密码。你还可以为每个操作系统都定义一个密码,方法是把 password 命令放在 title行之后。
而且每个操作系统的引导密码可以不同,也可以和进入命令模式的那个密码不同,最大程度的保证 GRUB 的安全。
5.2 只能用于命令模式或者 grub shell 的命令
a)device :用于定义 BIOS 中的磁盘设备和操作系统的磁盘设备之间的映射关系。
例如 device (hd0)/dev/hdb 把 BIOS 中的第一个硬盘相当于 Linux 的 /dev/hdb
b)serial :用于初始化一个串口设备。
例如 :serial –-unit=0 –-speed=9600 表示初始化 COM1(--unit=0),速率为 9600 Baud
不过 grub shell 下执行该命令会显示 “无法识别的命令”
c)terminal :用于切换显示输出。有两这个值可选 :console 和 serial 。当你把笔记本接到一个没有显示器/键盘的主机上时,执行
terminal serial 就可以在你的笔记本上操作这台主机的 GRUB 了。执行 terminal console 把显示输出还原到该主机。
不过 grub shell 下执行该命令会显示“无法识别的命令”
d)splashimage :用于定义启动时的背景图片。例如 splashimage /grub/splash.xpm.gz
经过测试,发现用 tarball 安装的不支持该命令,这似乎是 redhat grub rpm 专有的。
e)blocklist :用于显示某个文件在文件系统中的位置,以 block list 的形式显示。例如 blocklist /vmlinuz
f)ca :用于显示文件内容。由于 GRUB 可以直接访问多种文件系统,所以可以用 cat (hd0,1)/etc/passwd 来在 GRUB 命令模式下查看 /etc/passwd 文件
g)root :用于指定含有 stage 文件的分区。如果有 /boot 分区,则 root device 就是 /boot 分区,否则
就是 / 分区。
h)rootnoverify :和 root 类似,但不会尝试挂载该分区。例如用于指定 windows 操作系统所在的分区。
i)chainloader :用于加载另外一个 boot loader ,通常是用于加载 windows 的 boot loader 。它的参数是一个 block list ,
例如 chainloader (hd0,0)0+1 表示加载第一个磁盘的第一个分区的第1块,0 是开始位置(block 从0开始编号),+1 表示总共读取多少个 block。
所以 chainloader 2+0 表示读取第3个block (编号为2)
j)find :可以用于在所有分区上搜索文件。注意,是所有分区,而不是某个分区。例如 find /vmlinuz 将会在所有分区上查找位于该分区的顶级目录下的
vmlinuz文件,如果找到就打印该分区名,例如 (hd0,1)。
k)geometry :用于显示或者设置某个硬盘的 CHS 参数,同时还显示分区信息。例如 geometry (hd0)
l)halt :关机
m)reboot :重启机器
n)kernel :指定操作系统内核文件,还可以在内核文件名后加上参数。例如
kernel /vmlinuz ro root=LABEL=/
表示以只读的方式挂载 / 分区,且根分区设备是 label 为 / 的那个设备;也可以直接给出设备名。
o)initrd :用于指定 RAM Disk 文件,例如 initrd /initrd-2.xx.img 。
p)boot :引导 kernel 所指定的内核,对于 linux 来说,必须先加载了 kernel 和 initrd 才能执行 boot 。
q)setup :用于安装 stage1 到磁盘的 MBR 或者某个分区的引导扇区。
六、保护 GRUB 设置
下面是一个例子
password –-md5 <密码1>
timeout=30
default=0
title “redhat AS 4”
password –-md5 <密码2>
root (hd0,1)
kernel /vmlinuz ro root=LABEL=/
initrd /initrd-xxx.img
title “windows”
password –-md5 <密码3>
rootnoverify (hd0,0)
chainloader +1
复制代码
当出现 GRUB 菜单时,必须按下 p 并输入 <密码1> 才能进入命令模式,如果选择 “redhat AS 4”并按下回车,会出现提示信息,要求输入密码,
这时应该输入 <密码2>。同样只有输入 <密码3> 才能进入 windows 系统。--md5 告诉 GRUB 后面的内容是已经用 md5 算法加密过的了。所以 GRUB
会将你输入的口令用 MD5 加密后再与之比较。你可以命令模式下用md5crypt 命令或者在 shell 下执行 grub-md5-cypt 来得出一个字符串用 MD5 加密
后的结果,再插入到配置文件中。为每个引导项目设置 GRUB 密码有好处也有坏处 :
a)好处是 :你可以禁止用户随便引导某个操作系统,即使普通用户可以接触GRUB 菜单,没有密码也没有用;
b)坏处是 :如果你一旦重启机器,就必须手工输入口令,否则会一直停在那里。如果你是在半夜远程重启某个主机的话…. Hoho
c)建议 :只设置 GRUB 密码,也就是限制用户进入命令模式,具体菜单项不设置密码。
七、GRUB 和 stage 文件
GRUB 含有几个 images 文件,两个基础(必需的)stages 文件(stage1和 stage2),可选的 stage(也称为 stage1.5),和两个网络引导的images 文件
nxgrub 和 pxegrub)。stage1 是用于引导 GURB 的一个必须的映象文件。通常它是被嵌入到 MBR。或者一个分区的引导扇区之中。因为 PC 的引导扇区是
512 字节,所以 stage1 也是 512 字节。stage1 的作用就是从一个本地磁盘加载 stage 2 或者 stage 1.5 。因为大小的限制,stage1 对 stage2 或者
stage 1.5 的位置进行编码,也就是说,stage1 是无法识别文件系统格式的。stage2 是 GRUB 的核心映象。它几乎处理所有的事情(除了加载它自己),
通常可以把他放在文件系统上,但不是必须的。
一旦你执行了 grub-install 安装了 boot loader ,stage1 文件就不是必须的,可以把它移动到任意位置,因为它已经被嵌入到 MBR 或者 PBR 了。
stage1和stage2 文件一般位于 /boot/grub/ 目录下,在这个目录下还有很多 stage 1.5 的文件,而且都是以文件系统格式命名的。它们的目的是在 stage1
和 stage2之间搭建一个桥梁,也就是 stage 1 加载 stage 1.5, stage 1.5 加载 stage2。stage1 和 stage 1.5 的不同之处是 stage1 无法识别文件系统,
stage 1.5 可以。因为 Stage2 太大了,无法被嵌入到某个固定的区域,而 Stage1.5可以安装在 MBR 之后的位置。
至于 nxgrub 和 pxegrub 我们在第10节才介绍。
十二、总结
写了这么多,现在总结一下大概的内容
a)GRUB 是一种 boot loader ,它分成两个阶段 :stage1 和 stage2(中间可能有 stage 1.5)
b)stage1 嵌入到 MBR 或者 PBR 中,stage2 留在文件系统中。
c)build GRUB三部曲 :configure 、make、make install、
d)grub-install 和 grub shell 都可以用于安装 stage1 ,但 grub-install 功能更加强大
e)GRUB 支持菜单模式、命令模式。命令模式下的快捷键 :c、o、O、e、d、ESC
f)使用 GRUB 口令保护 GRUB 设置
g)GRUB 支持从网络引导操作系统,不过在编译时事先指定 –-enable-diskless 和网卡驱动。可惜的是,GRUB 支持的网卡驱动不多。
h)GRUB 支持通过串口来访问 GRUB 的命令和菜单模式
i)GRUB 可以把配置文件事先嵌入到 GRUB ,但删除时也需要重装 GRUB 。
双硬盘三系统,sda(80G) :win + ubuntu7.10 ;sdb(160G) ubuntu8.04
双硬盘均安装有gurb,发现从sdb引导时无法正常引导win,提示miss NTLoad;参考下面文章,使用map命令重新映射解决该问题~
//////////////////////以下引用//////////////////////////////////////
Windows 可以和Linux共存同一台电脑上,如果只有一块硬盘,通过Grub引导Windows不成问题。(其实也有问题,那就是Windows和Linux的 boot分区必须位于硬盘前1024柱面。这是由于BIOS为了和以前的版本兼容,这个限制在2000年以后生产的主机板不存在)
如果有多个硬盘,并且Windows和Linux安装在同一块硬盘的不同分区,引导也不成问题。
如果Windows和Linux安装在不同的硬盘上,如何启动Widnows取决于Grub装在哪块硬盘。
以两块硬盘为例,第一块硬盘安装Windows,第二块硬盘安装Linux.
1. 如果Grub和Windows在同一硬盘,修改/etc/grub.conf 或/etc/menu.lst
title Windows XP
rootnoverify (hd0,0)
chainloader +1
2. 如果Grub和Linux在同一硬盘,并且通过CMOS/BIOS设置为第一引导盘,那么Windows将自动作为第二引导盘。Windows的霸道就在于它只能从第一个引导盘启动,因此必须通过磁盘重映射骗过Windows,这个功能由map命令实现。
title Windows XP
map (hd0) (hd1)
map (hd1) (hd0)
rootnoverify (hd1,0)
chainloader +1
事实上,map功能是Grub调用BIOS实现的。如果BIOS不支持磁盘映射,此方法失效。(2000年以后生产的机器大部分BIOS支持磁盘映射)。
3. 假设有四块硬盘,第一块硬盘(hd0)安装Windows,第四块硬盘(hd3)安装Linux+Grub,则配置如下
title Windows XP
map (hd0) (hd3)
map (hd3) (hd0)
rootnoverify (hd3,0)
chainloader +1
希望以上解释能有所帮助。