一.什么是引导加载程序

最简单地讲,引导加载程序(Boot Loader)会引导操作系统。当机器引导它的操作系统时,BIOS会读取引导介质上最前面的512字节(即人们所知的主引导记录(Master Boot Record,MBR))。在单一的MBR中只能存储一个操作系统的引导记录,所以当需要多个操作系统时就会出现问题,所以需要更灵活的引导加载程序。

主引导记录本身要包含两类内容-部分(或全部)引导加载程序,以及分区表(其中包含关于介质其余部分如何划分为分区的信息)。当BIOS引导时,它会寻找硬盘驱动器第一个扇区(MBR)中存储的数据;BIOS使用存储在MBR中的数据激活引导加载程序。

由于BIOS只能访问很少量的数据,所以大部分引导加载程序分两个阶段进行引导。在引导的第一个阶段中,BIOS引导一部分引导加载程序,即初始程 序加载程序(initial program loader,IPL)。IPL查询分区表,从而能够加载位于不同介质上任意位置的数据。首先通过这步操作来定位第二阶段引导加载程序(其中包含加载程序 的其余部分)。

第二阶段引导加载程序是引导加载程序的主体;很多人认为这才是引导加载程序的真正部分。它包含加载程序更需要磁盘空间的部分,比如用户界面和内核引导程序。从简单的命令行到绘声绘色的GUI,这些用户界面的范围很广泛。

引导加载通常配置为两种方式的其中之一:要么是作为主引导加载程序(primary boot loader),要么是作为二级引导加载程序(secondary boot loader)。主引导程序是安装在MBR上的第一阶段引导加载程序。二级引导加载程序是安装在可引导分区的第一阶段引导加载程序。必须在MBR上安装单 独的引导加载程序,并配置它将控制权转交给二级引导加载程序。

很多较新的Linux引导加载程序特别实用,因为它们提供了不同程度的交互,比如高级的GUI和加密的密码,以及通过选择操作系统进行引导的能力。 这样,可以在具有多个物理磁盘的同一机器上共存多个操作系统。这样设置越来越常见,因为它帮助很多用户在安装新的Linux时,能够保留先前由 Windows机器所生成的宝贵数据资料。我个认为这种设置非常美妙,只使用一台机器就可同时拥有Linux和Windows。

随着时间的推移,引导加载程序已经得到了增强,为用户引入了大量的功能。各个引导程序的功能和配置存在差异,但基本的目标是相同的。现在来看两个较为流行的引导加载程序:LILOtkg GRUB。

 

二.LILO简介

LInux LOader(LILO) 已经成为所有 Linux 发行版的标准组成部分。作为一个较老的/最老的Linux引导加载程序,它那不断壮大的 Linux 社区支持使它能够随时间的推移而发展,并始终能够充当一个可用的现代引导加载程序。有一些新的功能,比如增强的用户界面,以及对能够突破原来 1024-柱面限制的新 BIOS 功能的利用。

虽然 LILO 仍在不断地发展,但 LILO 工作原理的基本概念保持不变。

 

三.使用 LILO 作为引导加载程序

要使用LILO作为引导加载程序,需要做的事情取决于是要进行全新安装还是要让已经安装的Linux改为使用LILO。如果是要进行全新安装,那么 直接跳转到配置LILO那一节。如果已经安装了某个Linux发行版,那么通常可以选择安装并配置 LILO(并可以将机器引导到新的 Linux 安装)。要将现有的 Linux 迁移到 LILO,首先必须获得最新版本的 LILO。在做任何其他事情之前,建议您确保在手边拥有一张 Linux 引导盘 —— 如果偶而弄错了某些地方,它可以提供很大的帮助,能够恢复到初始的 Linux 配置!将 LILO 安装到系统中之后,让它接管 MBR 非常简单。以 root 用户身份输入:
# /sbin/lilo -v -v

这将使用当前的 LILO 默认值,抹去 MBR 中当前所有内容。不过,请阅读 配置 LILO,以确保能够按预期引导起来。也要注意,如果想要在同一机器上运行 Windows 和 Linux,那么应该先安装 Windows OS,然后再安装 Linux OS,这样,在 Linux 安装中所选择的引导加载程序就不会被 Windows 引导加载程序所覆盖。与 Linux 引导加载程序不同,多数 Windows 引导加载程序不支持引导 Linux。如果已经先安装了 Linux,那么只需要自己创建一张 Linux 引导盘,这样就可以在安装完 Windows 之后,回到 Linux 安装中并重写 MBR。

 

四.配置 LILO

LILO 的配置都是通过位于 /etc/lilo.conf 的一个配置文件来完成的。下面给出了一个示例配置,使用机器支持Linux 和Windows 机器的双重引导。了解Linux工作站的基本配置如下。

主 HDD(物理磁盘 1)上安装了 Windows XP(最初机器上只有它)。在 Linux 术语中,这个 HDD 是 /dev/hda(在 GRUB 术语中是 hd0,0)。

从 HDD(物理磁盘 2)上安装了 Red Hat Linux;root 分区位于这个硬盘驱动器的第三个分区,即 /dev/hdb3(在 GRUB 术语中是 hd1,3)。

lilo.conf 示例文件

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=100
compact
default=Linux
p_w_picpath=/boot/vmlinuz-2.4.18-14
label=Linux
root=/dev/hdb3
read-only
password=linux
other=/dev/hda
label=WindowsXP

 

lilo.conf 示例文件中的选项如下。

1.boot=告诉 LILO 在哪里安装引导加载程序。在上面的示例中,将把它安装到第一块硬盘的 MBR。也可以选择将 LILO 安装到 /dev/hdb3(示例中的 Linux 分区),这样需要向 /dev/hda 安装另一个引导加载程序,并令其指向 LILO 引导加载程序;然后只需要让 LILO 作为二级引导加载程序。通常,引导加载程序应该位于 /dev/hda。还可以将这个参数指向软盘驱动器(最常见的是 /dev/fd0),来制做 LILO 软盘引导磁盘。

 

2.map= 指向引导期间 LILO 内部使用的映射文件。当使用 /sbin/lilo 命令安装 LILO 时,它会自动生成这个文件,其中包含有描述符表(还有其他内容)。建议不要改动这个文件!

 

3.install= 是 LILO 在引导过程中内部使用的文件之一。它同时包含有引导加载程序的主要部分和二级部分。boot.b 文件的一个片段被写入到 MBR(引导加载程序的主要部分),它会指向那个映射,接下来指向二级引导加载程序。同样,不要改动它!

 

4.prompt= 告诉 LILO 使用用户界面(本例中给出了两个选择 —— Linux 和 WindowsXP)。除了使用 prompt/user 界面以外,在适当情况下还可以为 Linux 内核等指定具体的参数。如果不在配置文件中指定此选项,那么 LILO 将引导到默认的 OS,不发生任何用户交互,也不会等待。(但是请注意,如果在引导时按下了 SHIFT,那么还是可以得到提示,当不想把引导加载程序暴露给普通用户时,这非常有用)。

 

5.timeout= 是引导提示在自动引导默认 OS(本例中是 Linux)之前的等待时间(以十分之一秒为单位)。如果在 lilo.conf 没有指定 prompt,那么这个参数就会被忽略。

 

6.compact 选项可以大大加速引导过程,它会将连续的读磁盘的请求合并为一个单独的请求。不过,这可能是一件祸福参半的事情,因为我在论坛上看到过很多贴子提到了关于此选项的问题。当希望从软盘引导时,这个选项尤其有用。

 

7.default= 选项告诉 LILO 默认使用哪个映像进行引导,比如在等待超时之后。这与 lilo.conf 文件中的某个映像的标签相关联。如果没有在配置文件中指定此选项,那么它将引导文件中指定的第一个映像。

 

8对于允许用户引导到的每一个 Linux 版本,都应该指定 p_w_picpath= 及以下三个选项。p_w_picpath 选项指定希望引导到的内核版本。

 

9.label= 标明了在运行期间希望能够从用户界面引导的不同 OS。另外,这个标签用于指定引导的默认 OS。(注意:标签名称中避免出现空格;否则,引导那个文件时会出现无法预期的错误。)

 

10.root= 告诉 LILO OS 文件系统实际所在的位置。在我们的示例中为 /dev/hdb3,即第二块硬盘上的第三个分区。

 

11.read-only 告诉 LILO 以只读的方式初始引导到文件系统。OS 一旦完全引导起来,就会以读写方式挂载。

 

12.password= 允许您为将要引导到的特定 OS 设置口令。不幸的是,这个口令是以可读文本的方式保存在 lilo.conf 文件中,所以,所有人都能够读取它。如果需要,还可以对想要引导自的每个操作系统设置口令(示例中,只为 Linux 的引导设置了一个口令)。

 

13.other= 的动作类似于 p_w_picpath 和 root 选项的组合,但是用于除了 Linux 以外的其他操作系统。在我们的示例中,它告诉 LILO 到哪里去找到 Windows OS(位于第一块硬盘的第一个分区)。如果先安装 Windows,后安装 Linux,通常会是这样。

 

14.label= 与所有其他 label 选项相同。

 

在 lilo.conf 文件中可以使用很多其他参数,不过以上的参数就足以让机器可用了。要获得关于 lilo.conf 的这些以及其他参数的进一步资料,请参考手册页(man lilo.conf)。由于在引导时不会读取 lilo.conf,所以,当这个文件有改动时,需要“更新”MBR。如果不完成此步骤就重新引导,那么对 lilo.conf 的修改不会在启动中反映出来。与先前将 LILO 写入 MBR 类似,需要运行:
$ /sbin/lilo -v -v

-v -v 标记会为您给出非常详细的输出。当像我们那样运行 LILO 时,有很多参数可以指定。参阅手册页以获得更进一步的信息(man lilo)。

 

五.初始引导过程

当 LILO 初始引导时,它会按次序打印出每个字母 —— L-I-L-O。如果所有字母都显示出来,那么第一阶段引导就成功了。缺少任何内容都表示出现了问题。

L第一阶段引导加载程序已经被加载。如果 LILO 停止在这里,那么是在引导第二阶段引导加载程序时出现了问题。这通常会伴随有一个错误代码。在这个阶段的常见问题是介质问题,或者在 lilo.conf 文件中指定了不正确的磁盘参数。

LI第二阶段引导加载程序已经被加载。LILO 在此处停止表示第二阶段引导加载程序不能被执行。同样,这可能是因为出现了与只显示 L 类似的问题:正在加载,或者因 boot.b 文件被破坏、移动或删除而不能加载。

LIL第二阶段引导加载程序正在被执行。此时,可能会再次出现介质问题,或者映射文件(如 lilo.conf 文件中所指定的)在寻找描述符表时可能会出现问题。

LIL?加载到与上面相同的阶段。这通常意味着加载第二阶段引导加载程序使用了错误的地址,最常见的原因是 boot.b 所在的位置与 lilo.conf 文件所指定的不同。

LIL-加载到与上面相同的阶段。加载描述符表时出现问题,最常见的原因是描述符表错误。

LILOLILO 成功被加载,没有出现任何错误。

 

LILO运行时会给出一些提示信息,这些信息对于深刻地了解Boot Loader是很有益的。下面表是一些出错信息,供参考。

LILO出错信息

 

代表意义

LILO提示信息

NULL

LILO没有安装或者安装LILO的分区没有被激活

L

LILO的第一部分已经被装入并运行了,但它不能装入第二部分的引导程序。这种情况通常发生在介质访问失败或硬盘参数错误时

LI

LILO第一部分正确,但是第二部分执行时出错。一般是硬盘参数有误或/boot/boot.b与map程序不相匹配

LIL

LILO第二部分开始执行,但是不能从“map”文件中读取描述符表(Descriptor Table)。硬盘介质错误或磁盘参数有误

LIL?

LILO在错误的地方加载

LIL-

描述符表错误。硬盘参数的不匹配或/boot/boot.b与map程序不相匹配

硬盘错误码

0x00

由LILO扇区读取子程序产生。map文件被破坏,或者当使用“linear”参数时访问超出1024的柱面

0x01

LILO访问了BIOS不支持的硬盘

0x02

磁盘介质出现问题

0x03

磁盘介质写保护错

0x04

磁盘扇区未找到,硬盘参数错误

0x05

磁盘激活顺序改变

0x06

错误的磁盘介质

0x07

无效的初始化,BIOS没有适当地初始化硬盘

0x08

DMA超出限度

0x09

DMA试图超过64KB边界。由于“compact”参数造成

0x0C

无效的磁盘介质

0x010

“CRC错误”,检测到介质错误。建议多启动几次,运行map安装程序,把map文件从坏块写到正常的介质上

0x11

ECC纠正成功。读错误发生然后被纠正,但是LILO并不知道这个情况,终止了启动过程

0x20

磁盘控制器错误

0x40

磁盘定位失败,磁盘介质问题

0x80

磁盘超时。磁盘或驱动器没有准备好,介质坏了或没有磁盘

0xBB

BIOS错误。磁盘与BIOS配置不符

 

 

六.引导时的附加配置

LILO 被成功加载后,将看到 LILO 提示符。还是使用前面的示例 lilo.conf 文件,此时将有两个选择,可能对 LILO 新手来说并不直观。首先,可以让 LILO 超时(10 秒后),这将引导 /dev/hdb3,即 Linux 分区。另外,可以按下 TAB 键,这将列出将要引导的操作系统选项。在我们的示例 lilo.conf 中,将得到的选项是 “Linux” 和 “Windows”。输入哪一个,就会引导到哪个 OS。指定加载 Linux 选项,会提示输入一个口令,在本例中是 linux。如果输入的口令有误,则会返回 LILO 提示符。

不过LILO 不支持引导期间的交互式配置,所以,只能在 lilo.conf 中或者运行 /sbin/lilo 时指定选项。

 

七.LILO安全建议

关于第一次尝试 LILO 的最后一点建议是:我发现使用软盘引导磁盘比使用硬盘实现 LILO 配置更为安全。为此,必须在 lilo.conf 文件中使用 boot=/dev/fd0 替换 boot=/dev/hda。那样,如果弄乱了 lilo.conf 文件中的任何配置,都可以取出引导磁盘并像先前一样引导到 Linux。当使用软盘进行引导一切正常以后,可以将 lilo.conf 修改回 boot=/dev/hda,然后最后一次运行 /sbin/lilo 来上传修改。