当前位置:Linux教程 - 安装启动 - 安装启动 - 全面探讨lilo---lilo学习笔记

安装启动 - 全面探讨lilo---lilo学习笔记

全面探讨lilo---lilo学习笔记
2004-04-23 15:18 pm
来自:Linux文档
现载:Www.8s8s.coM
地址:无名

声明:本笔记并非原创,只是我个人的学习笔记!
很多的内容来自www.linuxsir.com www.linuxfans.org www.linuxAID.com www.lslnet.com
非常感谢以上网站对我的学习提供的莫大的帮助,本着学习和分享的原则我贴出我的学习笔记,更希望兄弟们能给我指出其中错误的地方.谢谢!!!
学习这部分知识,首先要学到问题的思路,其次你还要记住一些东西,是死记硬背下来!你会发现这点东东的确是很有用的!
本文参考了大概有10来位作者(记得的有周迪,徐永久,郑良,Albert,江永忠等)的文章,出自上面所列网站,所以我就不再单独列出这些作者的名子了,请原谅!
尽管如此,本文档归属linuxsir-probing!转载请注明出处!更不能被用到商业用途上!

1 首先要了解的几个概念

1.1一般的开机引导过程。
在PC机上,最初的启动由BIOS完成。当开机自检结束时(Power-On Self Test,POST), BIOS尝试读入软盘的第一个扇区,把它看作引导扇区。若没有软盘,则尝试读入硬盘的第一个扇区。新的BIOS可以改变这种次序,先从硬盘启动。甚至从光盘启动。由于大多数BIOS不提供SCSI支持,若要从SCSI磁盘启动,SCSI适配器要提供他自己的BIOS.如果什么都找不到,老的BIOS会启动内置的ROM BASIC,或直接打印"NO ROM-BASIC".
操作系统的启动分几步完成。由于引导扇区比较小,通常它主要任务是读入第二 个loader,第二个loader再读入第三个loader,直到整个操作系统被完全读入。
  DOS 引导区:
OFFSET
0x000 JMP xx Near jump into the program code
0x003 Disk parameters
0x03E Program code loading the DOS kernel
0x1FE 0xAA55 Magic number for BIOS
  可见,引导区的结构相对比较简单。它的长度总是512字节。以上,磁盘参数只对DOS有意义。重要的是引导区从0开始,以BIOS的magic number 结束。
  从软盘启动比较简单,因为只有一个引导扇区:第一个扇区。硬盘则困难一些, 它被分成很多分区。但是,BIOS根本不管分区信息,它象对待软盘一样对待硬盘, 仍读入第一个分区,叫作:master boot record.(MBR).      所以MBR也应该和上面介绍的结构一样:从0开始,以BIOS的magic number 结束 在MBR的最后部分,有分区表。如下图:
OFFSET Length
0x000 0x1BE code loading and starting the boot sector of the active partitian
0x1BE 0x010 partition1
0x1CE 0x010 partition2
0x1DE 0x010 partition3
0x1EE 0x010 partition4
0x1FE 0x0012 0xAA55 Disk parameters
 每个分区信息占16字节,结构如下:
1 BOOT Boot flag: 0=not active ,0x80 active
1 HD Begin:head number
2 SEC CYL Begin:sector and cylinder number of boot sector
1 SYS System Code:0x83 linux , 0x82 linux swap etc.
1 HD End:head number
2 SEC CYL End: sector and cylinder number of boot sector
4 low byte high byte Relative sector number of start sector
4 low byte high byte Number of sectors in the partition
  所以硬盘可以有4个分区。这四个分区叫做主分区rimary prititions.假如它 们不够用,可以设置所谓的扩展分区。扩展分区包含至少一个逻辑分区。扩展 分区的第一个扇区结构类似MBR,它的分区表的第一表项对应第一个逻辑分区。如果 存在第二个逻辑分区,那么分区表的第二个表项就包含了一个指针。这个指针指向 第一个逻辑分区后面的一个地址。这个地址包含一个分区表。该分区表的第一表项 对应第二个逻辑分区。这样就组成一个链表,从而扩展分区可以有任意多的逻辑分 区。
  每一个主分区和扩展区都包含一个引导扇区。系统只能从这几个地方之一启动。 BOOT标志决定哪个区被引导。
  原来,只有主分区,因此,MS-DOS的fdisk和大多数同类工具只能激活主分区.. MBR的代码要作以下的操作:
  1:确定活动分区。
  2:使用BIOS,将活跃分区的启动扇区读入。
  3:跳到启动扇区的0位置。
  MBR的空间足够完成这些工作。如上所述,每个分区理论上包含一个引导扇区, 而且,存在的第二个硬盘也包含和第一个类似的结构。MBR完全可以容纳一个复杂 的引导程序。即所谓的boot manager,动态的决定活动分区。Linux 为我们提供了lilo.

1.2LILO的引导机制
  如上所述,计算机的最初启动是由BIOS控制的,在对一些硬件(如:内存、键盘等)初始化之后,它会试图加载硬盘的主引导记录(MBR)或软盘的引导扇区。
  MBR可通过两种方式运行,其一是定位到活动分区并加载相应的引导扇区,然后由引导扇区完成该分区内操作系统的基本组件的加载;其二是直接从一指定分区中加载信息,并通过它装入任一分区的操作系统,诸如LILO、OS/2 boot loader及Partition Magic等引导加载程序都可以配置成这种方式。
  软盘的引导扇区相当于硬盘活动分区的引导扇区,它通常用于装入软盘上的操作系统。
  由此可见,只要把LILO安装在MBR、活动分区或者引导软盘上,就能接管计算机的控制权,然后由LILO完成后继的引导过程。LILO中建有一个引导表地址编码,借此它的引导程序就能定位到Linux的内核文件,这种地址编码既可以按照柱面/磁头/扇区(CHS)模式,又可以采用LBA的线性块号模式,因此,即使对某些SCSI控制程序LILO也能运转良好。
  当LILO定位到配置文件后,经过预引导过程,就显示提示符:
  LILO boot:
  此时,系统允许选择引导不同的操作系统或者不同的内核配置,按Tab键显示可选项列表,然后输入可选项或者直接回车选择缺省配置,如果选择了引导Linux,还可以直接传递参数到系统内核。

1.3LILO的特点  
和其他系统的引导加载程序相比,LILO具有更大的灵活性,其引导方式也更丰富多彩。当然,GRUB也非常不错,在本版中我们也曾经有过详细的介绍.
  ● 当LILO被安装在硬盘的MBR、活动分区或引导软盘上时,作为原引导程序的替身,它能引导任一硬盘任一分区上的Linux和其他操作系统;
  ● 除了引导扇区,它没有任何隐含文件,也不需要使用特定的分区,它的配置文件可以在任何分区、甚至是存放在与Linux毫不相干的DOS分区的某个子目录下;
  ● 它能引导几个不同的内核配置,甚至是几个不同的内核;
  ● 它能引导同一机程序上的多个Linux版本;
  ● 它能从网络上引导Linux。
● 新版LILO 0.21.4.2突破1024-cylinder限制,新版本最大的更新是通过使用EDD BIOS EXTENSIONS消除了1024-cylinder的限制,现在LILO能够支持达2TB的硬盘。
Download: ftp://sd.dynhost.com/pub/linux/lilo/ (10691 hits)
Alternate Download: ftp://metalab.unc.edu/pub/Linux/system/boot/lilo/ (1762 hits)
Appindex Record: http://freshmeat.net/appindex/1998/12/04/912827201.html
  LILO的灵活性使得其配置变得相当复杂,当有多个系统共存时,建议先安装其他操作系统,最后再装Linux,这样,设置LILO对其他系统的引导会相对简单一些。

1.4什么是LILO以及本文档的一些约定
把这个问题放到最后来回答是因为在看了以上的内容后你可以深刻的理解了lilo而不是简单的说lilo就是一个启动管理器.
LILO(Linux Loader)是Linux自带的一个优秀的引导管理器,使用它可以很方便地引导一台机器上的多个操作系统。与其他常用的引导加载程序相比,LILO引导方式显得更具有艺术性,对其深入的理解,将有助于我们方便地处理多操作系统、网络引导、大硬盘及大内存等诸多棘手的问题。
  通常我们谈到LILO,会涉及到两个方面--LILO引导程序和LILO安装命令/sbin/lilo。为了不至于混淆这两个概念,本文将用LILO表示LILO引导程序,而lilo表示/sbin/lilo。
  一般地,LILO使用一个文本文件/etc/lilo.conf作为其配置文件。lilo读取lilo.conf,按照其中的参数将特定的LILO写入系统引导区。任何时候,修改了/etc/lilo.conf,都必须重新运行lilo命令,以保证LILO正常运行。lilo.conf使用的配置参数很多,配置起来也相当复杂。下面以RedHat Linux为例作一些初步探讨,RedHat的lilo程序包版本为0.20,可能这个版本相对来说老了,并且别的Linux发行版本可能会有所出入,但你要学会的不是简单的按步就班的做,而是学会基本概念后有自己的思路,用自己的思路来解决问题。
  lilo.conf文件中的配置参数分为两部分,一部分是全局参数,另一部分是引导映像参数。与Linux系统其他的配置文件一样,"#"号后的一行文字表示注释。
LILO引导扇区包括一个分区表的空间,所以,LILO即可以安装在MBR中,也可以安 装在某个分区的引导扇区。LILO拥有DOS引导扇区的所有功能,而且,它还可以引导 逻辑扇区和第二硬盘分区。LILO还可以和另外的引导者合作(例如:NT loader),这样, 用户就可以有很多选择。

2 LILO的调试

LILO 最大的好处就是它独立于文件系统,可以启动各种操作系统:从Microsoft、OS/2、SCO Unix、Unixware、PC-DOS到Linux等等。LILO 能处理最多16个不同的映像,LILO 写入MBR 时就作为主引导程序,写入扩展分区的引导扇区时就是第二引导程序。采用LILO,可以有多种组合方式启动系统。我们先来看看引导过程,硬盘上的数据被准确的分配到对应的"磁道"和"扇区",硬盘上的数据分布首先是引导扇区,然后是文件分配表(FAT),接下来就是数据区。硬盘分区时,被分为基本分区和扩展分区。基本分区可以作为引导分区,可以通过任何引导程序标记为可引导。扩展分区可以分成好几个逻辑分区,很多的BIOS 不允许从逻辑分区启动。
Linux 最多支持4个基本分区,如果需要额外的分区,那么就要其中的一个基本分区变成扩展分区,然后在扩展分区里面,划分逻辑分区。很重要的一点是有些逻辑分区的分区表不能被识别为设备的第一块。分区表通常存放于分区的引导扇区,而且,通常只有整个盘的分区启动扇区用作引导扇区,称为主引导记录(MBR)。
LILO 可以用于以下情形:
1、第一硬盘的引导扇区。
2、软盘的引导扇区。
3、位于第一硬盘的Linux 文件系统分区上的引导扇区。
LILO 不能用于以下情形:
1、交换分区。
2、扩展分区中的逻辑分区的引导扇区。
所以,如果你在第二硬盘上安装了Linux ,而不能启动的话,可以采取在第一硬盘上建立/boot 的办法来解决。
引导加载过程由很多程序组成,我们先来看看LILO 安装时的各种不同程序:
MAP 安装程序: 这个程序把LILO 的文件放到合适的位置并记录这些信息(会在LILO 启动时用到),这个程序就是/sbin/lilo ,每次配置文件有改动或者有新内核时,需要重新运行一遍。
/boot/*.*: 其他LILO 启动时需要的文件存放在 /boot 目录下,map 文件是十分重要的,map 安装程序把新内核的位置记录到这个文件。
引导加载程序: 这个程序无需多言是最重要的部件了。它被BIOS 调入内存,然后调用内核或者其他操作系统的引导扇区。
包含引导加载程序第一部分的引导扇区被调入内存,然后调用引导加载程序的第二部分,一般位于文件 /boot/boot.b,接下来就启动内核。
如果从可引导软盘启动的话,BIOS 把软盘的第一个扇区调入内存,一般,这个扇区包含一段程序来启动对应的操作系统。和软盘一样,如果LILO 写入MBR ,那么,MBR 就被调入内存,执行对应的操作,给用户提示选择需要引导的操作系统。具体地说,MBR 的头 446 个字节由引导加载程序利用,剩余的64 字节是分区表信息。还剩下的两个字节就是分区激活标志"55 AA" 了。
在软盘上备份 MBR 信息:
bash# dd if=/dev/hda of=/dev/fd0 bs=512 count=1
恢复:(万一的情况下)
bash# dd if=/dev/fd0 of=/dev/hda bs=446 count=1
卸载LILO:
  当LILO覆盖了引导扇区时,它会保留一个引导扇区的备份在/boot/boot.xxyy中,其中xxyy是16进制的设备主/次号码(major/minor numbers),利用命令"ls -l /dev/device"就可获得硬盘或分区的主/次号码。如果这些备份文件已经存在,那么,当你重新安装LILO或重构内核时,它将不再生成此文件,这就保证了此备份文件是最原始的引导扇区。
  若要卸载LILO,你只需恢复初始的引导扇区就可以了。例如:LILO安装在/dev/had,对应的备份文件为/boot/boot.0300,简单地使用下面的命令即可:
  dd if=/boot/boot.0300 of=/dev/had bs=446 count=1
  当然,若想完全卸掉Linux,必须用Linux的fdisk对Linux分区进行破坏,因为DOS的fdisk无法移去非DOS分区。
还可在DOS下用命令:
c:> fdisk /mbr
恢复 LILO:
重新安装 Windows 以后,就会把LILO 干掉。无论什么原因我们都应该知道怎样恢复LILO。
最好手头有一张安装 CD ,这年头,干净并且确实好用的软盘太少了。所以不推荐你使用软盘。当然,如果你认为你的软盘质量可靠,那么可以从CD-ROM上建立应急启动盘:
dd if=/cdrom/disks/rescue of=/dev/fd0
在 DOS 下面,采用:
rawrite image-name a:
也可以在 www.bootdisk.com上下载一个,按照说明制作一张启动磁盘。
如果从 CD 启动的话,各个不同的Linux 版本有不同的方法进入应急状态。Red Hat 启动后有一个应急模式,SuSE 的话,需要先进入安装界面,然后按Ctrl+Alt+Fn 键找到shell 提示符,可以在这个提示符下来恢复。
下面介绍恢复步骤:
首先建立挂接点:
mkdir mount
然后把丢失的 Linux 挂接到这里:
mount /dev/hda6 mount
如果 /boot 位于另外的分区,
需要把他挂接到 mount/boot 目录下,例如:
mount /dev/hda1 mount/boot
使用 chroot 命令,把 mount 作为根目录,cd /boot
命令实际上进入的是 "mount/boot" 目录:
chroot mount
运行 /sbin/lilo ,这样就把 LILO 安装回了 MBR,重新启动就会看到 LILO 提示符回来了。

2.1 LILO started by MS-DOS MBR
如果系统至少有一个linux主分区,(非交换区,且在第一硬盘上),那么LILO就可 以安装在这些分区中的一个。当 LILO对应分区被激活后,引导过程如下:
BIOS 读入 MBR
MBR 读入 活跃主分区:LILO所在的分区。
LILO 引导Linux或另外的操作系统。
要引导其它OS且不用LILO很简单,激活那个分区。Linux分区没有任何变化,非常安全。
2.2 LILO started by a boot manager
假如用户不想删除老的boot manager,或者某个OS LILO不能引导,可以考虑该途径。
1. 假如boot manager可以引导扩展区,那儿是LILO的好去处。
2. 假如 boot manager 可以引导第二硬盘分区,linux可以装在第二硬盘上。
3. 有些 boot manager 甚至可以引导逻辑分区,那LILO就可以装在逻辑分区上。
当然,也要注意以下情况:
1 某些操作系统直接改写MBR,这会将原来的boot manager破坏。
2 重新分区会破坏扩展分区的引导扇区,这是LILO可能要重装。
当安装新的系统时,是否要重新安装(linux)依靠新的boot manager,要么LILO引 导扇区被注销,要么boot manager 为它提供一个引导项。重新分区或分区格式化会将 LILO和linux全部删除。
2.3 LILO占据MBR
假如整个linux系统都在第二硬盘上,且第一硬盘没有扩展分区,那么,LILO只有装 在MBR上。这样,会将老的MBR冲去,所以,在安装LILO前,要将老的MBR(包括分区 表)做一个备份。DOS下有很多工具可以完成这个任务。在linux下,这样备份:
# dd if=/dev/had of=/backup/MBR bs=512 count=1
写会使用命令:
# dd if=/backup/MBR of=/dev/had bs=446 count=1
这样,原来的MBR就被写会但不包括分区表。如果分区表也要恢复,那么bs=512. 注意,这样,新的分区表会被破坏!
2.4 LILO 文件
  与LILO有关的文件通常放在/boot/下,配置文件lilo.conf在/etc/下。包含实际 引导系统信息的映射文件有/sbin/lilo安装。对于任何LILO安装,配置文件应该被定 置以适合个人需要。
The configuration file:配置文件
  基本上,配置文件是一些变量赋值。每一行包含一个标志变量或一个变量赋值. 配置文件被特殊的变量赋值分成几个区,每个区引导一个linux或其它OS.
  下面解释常见的行:
boot = device
  说明那一个设备或哪一个分区包含引导扇区。假如没有给boot赋值,取当前缺省值。
Compact
  激活一种模式,在此模式下,LILO一次向BIOS请求读入相邻的几个分区。这极大的 缩短了装载时间,特别是从软盘启动。
Delay=tenths
  以10秒为单位,规定LILO在引导第一个引导配置前应等待用户的时间。若没有定义,则 直接引导。
Linear
  使LILO生成线性地址,而不使用通常的Sector/Head/Cylinder机制。Linux地址机制 可以不依赖磁盘的物理结构。
Install = boot sector
  使用指定的boot sector写入引导扇区,缺省用/boot/boot.b
disktab=disktab
  使用指定的disktab,缺省使用/boot/disktab.disktab保存了硬盘物理结构信息。
Map=map file
  说明映射文件的路径。
Message=file
  指定一个文件,该文件的内容将会在LILO引导是被显示。假如没有说明该文件,那么就 只会出现"LILO"。
Verbose=level
  说明LILO的调试级别。从0(不显示任何信息)到5(所有的状态信息)。
Backup = backup file
  以前引导扇区内容的备份文件。缺省使用/boot/boot.device number
force-backup=backup file
  和backup 相同,当时假如备份文件存在,被覆盖。
Prompt
  指定要用户通过键盘选择要引导的内核。不会缺省选择。
Timeout=tenths
  设置一个超时值,在此时间内必须有键盘输入,否则用第一个配置。类似,假如超 时,就不能再输入密码。一般情况下,该取缺省值,无穷大。    注:delay 与 timeout的区别(joe 认为),delay 是"LILO"出现后用户必须有 输入的最长时间。Timeout 是用户在按了任意键后,系统等待选择,用户 两次击键的最大间隔时间。
Serial=port, bps parity bits
  设置串口参数。如果LILO会从该文件获取串口参数的话。如果其中之一无效, 那所有三个参数都无效。Port从四个标准串口选择一个:0对应COM1 或者 /dev/ttyS0.。支持的波特率范围为:100-9600。所有校验设置都支持
  (n:none,e:even,odd) bits为7或者8。缺省为serial=0,2400n8.
Ignore-table
  让LILO忽略被破坏的分区表。
Fix-table
  允许LILO将每个分区的(sector/head/cylinder)地址转化为线性地址。通常, 分区地址从cylinder boudary开始。某些操作系统,会改变这一点。由于LILO只能 将它的启动扇区写于两种地址都一致的分区上,不正确的3D地址可以用fix-table 来纠正。但是,这种纠正不能被保证是永远的,所以重分区以保证对齐cylinder boudary 是最好的选择。
Password=password
  为引导配置设置password
restricted
  放松对password的限制。只有用户想传附加的启动参数给内核时才需要password
optional
  允许配置的几个内核有错误的,或者不存在,如果不说明optional,LILO遇到这种 情况就会打印一些错误信息然后退出。
  每个从LILO引导的配置从image行开始。
   Image = kernel
   Label = name
  Image包含要引导的内核。Label是给用户选择用的。Image行通常指向一个设备, 例如/dev/fd0,可以找到内核的范围用range来注明。
   Range = range
  range可以用start sector -end sector 或者 start sector + length 表示。例如:
   image = /dev/fd0
   label = floppy
   range = 1+512
以下变量赋值有可能出现:
append=string
  将string作为引导参数传给内核。例如,硬件参数。
Literal=string
和append查不多。但是,他会冲掉原来的设置。所以不能被全局说明。
Ramdisk=size
  设置RAM disk的大小。
Read-only
read-write
设置根文件系统的访问方式。
Root=device
设置根文件系统存在的设备。
Vga=mode
  屏幕设置。可能模式为:normal,extended 和ask. 。
以下设置是针对别的操作系统的:
loader=loader   说名用来引导操作系统的文件。缺省为 /boot/chain.b . 另外,LILO包含以 下的loader:
os2_d.b 可以从第二硬盘上引导os/2
any_d.b 在引导操作系统之前试图将两个硬盘的次序颠倒,从而可以引导第二硬盘 上的os.
Table=device   说明一个设备,该设备的某个分区上存放要引导的os.假如没有说明table, LILO就不会将该信息传给要引导的osunsafe
  关掉对要引导的os的检查。只有要从软盘引导时,才使用该设置。没有该设置, 每次map installer开始运行时,引导盘都要插入软驱。
The disktab file
disktab文件包含LILO要引导的设备的物理结构信息。通常,这些信息可以从设备驱 动程序获取。所以,只有这种方法不行时才会用到disktab 文件。在此情况下,如 果文件不能用,LILO报告错误信息:
   geo_query_dev HDIO_GETGEO(dev …)
或者
   HDIO_REQ not supported for your SISI controller
   Please use /boot/disktab
然后,物理结构信息就必须手工地输入:
# /boot/distab-LILO parameter table
#
#This table contains the geometry parameters for SCSI and
# IDE disks,which can not be recognized automatically
# Entries in this table overwrite recognized parameters!
#
# Dev. BIOS Secs/ Heads/ Cylin - Par.
# num. Code track cyLin. Ders. Offset
(optional)
#0x800 0x80 32 64 202 0 # /dev/sda
各个域含义如下:
0x800
设备号.由主副设备号组成。
设备号.由主副设备号组成。
0x80
设备的BIOS 码。0x80代码系统的第一个硬盘。0x81第二个,。。。。
所有同一硬盘上的分区该值相同。
32,64,203
sector 数目(每个track)
heads 数目
cylinders 数目
0
分区的开始。也可以从分区表中读,所以可以不说明。
2.5 LILO 启动信息
在启动过程中,LILO会显示'LILO':每完成一个特定的过程显示一个字母。如果LILO在某个地方失败了,屏幕上就停留几个字母,以指示错误发生的地方。如果LILO出错退出,可以根据显示来判断系统的 出错原因。
注意,如果磁盘发生瞬间故障,可能会在第一个字母"L"后插入一些十六进制数字(磁盘错误码)。除非LILO停在那里并不停地产生错误码流,否则并不说明有严重问题。
没有信息:LILO根本就没有被读入,没安装LILO,或LILO驻留的分区没被激活。
  L(number): LILO的第一部分被读入并开始执行。但第二部分不能被读入。后面 的数字表明出错原因。这可能是由于硬盘的物理错误或不正确的物理结构信息。
  LI: LILO的第一部分可以读入第二部分,第二部分执行时出错。这可能是不正确的物理结构信息或重装了boot.b而没有运行LILO重新安装。
  LIL:LILO的第二部分启动起来了,但是不能从map文件读入描述符表(descriptor tables).这说明不正确的物理结构信息或物理错误。
  LIL?: LILO的第二部分被读到不正确的地址。原因同LI
  LIL-: descriptor tables有错。这可能是不正确的物理结构信息或重装了 map file而没有运行LILO重新安装。
LILO: LILO执行正确。
1010101010: 分区情况已经改变却没有重新安装LILO,另外,超频也可能会出这种情况。
磁盘错误码 :
  0x00:"内部错误"。 由LILO扇区读取子程序产生。可能是因为被破坏的文件,重建map文件试试看。另一个原因也许是,当使用"linear"参数时去访问超出1024的柱面。
  0x01:"非法命令"。这意味着LILO访问了BIOS不支持的硬盘。
  0x02:"没找到地址标记"。通常是介质问题,多试几遍看看。
  0x03:"写保护错"。 仅在写操作时出现。
  0x04:"扇区未找到"。典型的原因是硬盘参数错误。
  0x06:"激活顺序改变"。这应该是短暂的错误,再试一次。
  0x07:"无效的初始化"。BIOS没有适当地初始化硬盘,热启动一次或许有帮助。
  0x08:"DMA超出限度"。这不应当发生,重新启动。
  0x09:"DMA试图越过64kB边界"。这不应当发生,建议忽略"compact"参数。
  0x0C:"无效的介质"。这不应当发生,重新启动看看。
  0x10:"CRC错误"。检测到介质错误。建议多启动几次,运行map安装程序,把map文件从坏块写到正常的介质上。
  0x11:"ECC纠正成功"。读错误发生然后被纠正,但是LILO并不知道这个情况,终止了启动过程。
  0x20:"控制器错误"。一般不应发生。
  0x40:"定位失败"。这可能是介质问题,重新启动试试。
  0x80:"磁盘超时"。磁盘或驱动器没有准备好。介质坏了或磁盘没有转,也有可能是从软盘启动而没有关上软驱门。
  0xBB:"BIOS错误"。一般不应发生,如果反复发生,可考虑去掉"compact"参数或添加删除"linear"参数。
  如果在写操作过程中发生错误,则在错误码前有个前缀"w"。尽管写错误并不影响启动过程,但它们暗示了系统中存在某种错误,建议重新配置LILO成只读格式(read-only)。

3 几个重要的LILO引导参数
  LILO的引导参数有很多,在此对一些比较重要的参数作一介绍。
  1. "boot="
  此参数指明包含引导扇区的设备名(如:/dev/had),若此项忽略,则从当前的根分区中读取引导扇区。
  2. "root="
  此参数告诉内核启动时以哪个设备作为根文件系统使用,其设定值为构造内核时根文件系统的设备名,可用的设备名有:
  (1)/dev/hdaN~/dev/hddN:ST-506兼容硬盘,a到d上的N个分区
  (2)/dev/sdaN~/dev/sdeN:SCSI兼容硬盘,a到e上的N个分区
  (3)/dev/xdaN~/dev/xdbN:XT兼容硬盘,a到b上的N个分区
  (4)/dev/fdN:软盘,A:(N=0)或B:(N=1)
  (5)/dev/nfs:由网络取得根文件系统的标志
  3. "nfsroot="
  若需通过NFS提供根文件系统来引导无盘工作站,此参数为内核指定了网络根文件系统所在的机程序、目录及NFS,其格式为:nfsroot=[〈server_ip〉:]〈root_dir〉[,nfs_options〉]
  4. "nfsaddrs="
  设定网络通讯所需的各种网络界面地址,如无此参数,则内核会试图用反向地址解析协定(RARP)或启动协定(BOOTP)找出这些参数,其格式为:
  nfsaddrs=〈客户端IP〉:〈服务端IP〉:〈网关IP〉:〈子网屏蔽〉:〈客户端名称〉:〈网络设备名 〉:〈auto〉
  5. "image="
  指定Linux的内核文件。
  6. "delay="
  设定引导第一个映像前的等待时间。
  7. "disk="
  此参数为某一特殊的硬盘定义非标准参数。
  8. "append="
  为内核传递一个可选的参数行,其典型的应用是为不能完全由系统自动识别的硬盘指定参数,如: append = "hd=64,32,202"
  9. "label="
  此参数为每个映像指定一个名字,以供引导时选择。
  10. "read-only"
  设定以只读方式挂入根文件系统,用于文件系统一致性检查(fsck)。
  11. "install="
  安装一个指定文件作为新的引导扇区,缺省为/boot/boot.b。
  12. "loader="
  说明所使用的链加载程序(chain loader),缺省为/boot/chain.b,如果不是从首硬盘或软盘启动,那么,此选项必须说明。
  13. "table="
  说明包含分区表的设备名,如果此参数忽略,引导加载程序将不能传递分区信息到已引导的操作系统。当此参数指向的分区表被修改时,必须重新运行/sbin/lilo。
  14. "init="
  内核初始化时执行的程序,通常过程为init、getty、rc和sh,版本1.3.43以来的Linux内核能够执行/sbin/init说明的命令行,若在引导过程中出现问题,则可设置init=/bin/sh直接跳到Shell。
  15. "ramdisk_start="
  由于内核不能放在压缩的内存文件系统映像内,为使内核映像能够和压缩的内存映像放在一张软盘内,加入"ramdisk_start=〈offset〉",这样内核才能开始执行。
  16. "mem="
  此参数的目的之一是为Linux指定使用的内存数量:如mem=96MB,目的之二是指定mem=nopentium告诉内核不要使用4MB分页表。
  17. "vga="
  设置显示模式,如80×50、132×44等。


4 LILO的全局参数
  全局参数是全程有效的,它可以出现在文件lilo.conf中的任何地方。以下是具体的参数项:
  1.backup=backup-file
  在装入LILO之前将原先的引导区备份到backup-file,而不是RedHat 缺省的/boot/boot.NNNN。也可以备份到一个设备上,如: /dev/null。注意:如果原先已有一个同名文件,该参数将被忽略。我们可通过这个备份恢复原先的引导扇区:
  dd if=/boot/boot.NNNN of=/dev/hda bs=446 count=1
  恢复原先的MBR。(注:虽然boot.NNNN有512字节,但只能恢复前446字节到MBR。)
  2.boot=boot-device
  指定一个用于安装LILO的设备。通常LILO可安装在如下几个地方:
  MBR:第一个硬盘的主引导区, 对应于/dev/hda、/dev/sda等。
  Root:Linux根分区的超级块(Super block), 对应于/dev/hda1、/dev/hda2、/dev/hda5、/dev/sda1、/dev/sda5等。
  Floppy:LILO安装在软盘上,对应于/dev/fd0。
  不指定时,lilo缺省安装在根分区超级块上。
  3.compact
  该参数用于优化LILO,产生一个更小的"map"文件。如果在软盘上安装LILO,强烈推荐使用此参数。
  4.default=name
  指定缺省引导的操作系统。如default=dos 表示将label为DOS的系统作为缺省引导的操作系统。如不指定该参数,排在lilo.conf中的第一个操作系统将作为缺省操作系统。
  5.delay=tsecs
  在没有指定"prompt" 参数时,LILO将立即引导缺省的操作系统,"delay"参数在这之间插入一段延时,单位是1/10秒。
  6.disk=device-name
  为某些非标准硬盘定义参数。其内部还包括有几个可选的子参数。
  bios=〈bios_device_code〉:  设备号。十六进制数0x80表示第一硬盘;0x81表示第二硬盘,依此类推。
  sectors=〈sectors〉:硬盘扇区数。
  heads=〈heads〉:硬盘磁头数。
  cylinders=〈cylinders〉:硬盘柱面数。受系统BIOS限制,柱面数必须在1024以内。
  partition=〈partition_device〉:用于物理定位特殊硬盘上的分区,有一个子参数start。
  start=〈partition_offset〉:每一分区的起始扇区。
  例如:
  disk = /dev/sda
  bios=0x80
  #指定SCSI硬盘为第一硬盘
   sectors = 32
   heads = 64
   cylinders=632
  #硬盘参数为632/64/32
  partition=/dev/sda1
  start=2048
  #第一分区起始扇区为2048
  partition = /dev/sda2
  start=204800
  #第二分区起始扇区为204800
   partition = /dev/sda3
    start = 500000
   partition = /dev/sda4
    start = 900000
  当机器上有两块硬盘,一块为SCSI硬盘,另一块为IDE硬盘时,LILO很有可能无法自动识别它们的主、从顺序,这时可进行如下设置:
  disk = /dev/sda
   bios = 0x80
  disk = /dev/hda
   bios = 0x81
  #SCSI硬盘为主硬盘,IDE硬盘为从硬盘
  该参数是为Linux无法识别的硬盘准备的,一般Linux可以正确识别和使用大多数硬盘,除非最坏的情况,否则不用设置它。
  7.force-backup=backup-file
  类似"backup"参数,但是将覆盖原有的同名文件。
  8.ignore-table
  通知lilo忽略无效的硬盘分区表。
  9.install=boot-sector
  LILO实际上包含有几个部分,而这几部分都存放在/boot/boot.b文件中。如果忽略"install"参数,则lilo认为install=/boot/boot.b。
  10.linear
  产生用于替换硬盘sector/head/cylinder地址(硬盘几何参数)的linear扇区地址。linear地址在运行时产生并且不依赖于硬盘几何参数。某些SCSI硬盘和一些以LBA方式使用的IDE硬盘可能会需要使用这个参数。注意,在将LILO安装到软盘上时不能使用"linear"参数。
  11.lock
  出现LILO提示后立即按最近一次的引导映像启动计算机。也就是说,当我们在lilo.conf中加入了该参数,然后运行lilo安装LILO,再重新启动计算机,这时LILO会提示我们选择引导哪一种操作系统,这一选择将被LILO记录下来,即"锁定",下次启动计算机时,LILO将忽略"delay"、"prompt"等参数及键盘输入而直接跳转到其"锁定"的操作系统。
  12.map=map-file
  指定map文件。 没有本项时缺省使用/boot/map,每次执行lilo命令都会产生一个新的map文件。
  13.message=message-file
  该命令用于指定一个包含注释信息的文件,该文件将在系统打印出字符串"LILO"之前显示。如果在LILO启动时想获取较多的信息,可以编辑一个文件,再使用该命令就可以了。文件中如果包含有ASCII码为0xFF的字符(Ctrl+L)则表示清屏。注意,文件的大小不能超过65535个字节。每次文件改变之后,都必须重新运行lilo命令重建map文件,以保证其正常显示。
  14.optional
  当用于启动的引导映像不存在时,该参数使lilo忽略它。这对用于测试一个不长期存在的Linux核心是有用的。
  15.password=password
  为LILO设置口令保护,每次重新启动计算机提示用户输入口令。设置了口令后,建议将lilo.conf的文件属性改为600,以免让非root用户看到口令。
  16.prompt
  给出"boot:"提示,强制LILO等待用户的键盘输入,按下回车键则立即引导默认的操作系统,而按下Tab键则打印可供选择的操作系统。当"prompt"被设置而"timeout"没有被设置时,系统会一直处于等待状态而不引导任何操作系统。不设置该参数时,LILO不给出"boot:"提示而直接引导默认操作系统,除非用户按下了Shift、Ctrl、Alt三键中的任何一个。大多数情况下,如果你的硬盘上有多个操作系统,建议使用参数,它留给用户一个选择的余地。
  17.restricted
  与"password"联用,使"password"仅作用于在LILO提示后有命令行输入的时候。
  18.serial=parameters
  使用串行口控制。这将初始化指定的串口,并将使引导管理器能接受来自串口的输入。从串口发送一个中断信号相当于从控制台键盘上按下Shift键,它同样会被LILO捕捉到。如果不能保证来自串口的访问和控制台一样安全,比方说有一个modem连在串口上,建议为每个引导映像加上口令保护(password)。参数串有如下语法:
  〈port〉[,〈bps〉[〈parity〉[〈bits〉]]]
  〈port〉:数字表示的串口号,0表示COM1,其余类推。所有四个串口都可被使用。
  〈bps〉:串口速率,支持110、 150、300、600、1200、2400、4800和 9600 bps,缺省值为2400bps。
  〈parity〉:设置串口校验。一般情况下,LILO忽略奇偶校验。n表示无校验,e 表示偶校验,o 表示奇校验。
  〈bits〉:字符位数,只能取7或8,缺省值是8。当有奇偶校验时只能取7。
  如果设置了"serial",即使没有设置"delay",系统也会将"delay"项的值自动增加20。
  19.timeout=tsecs
  设置等待键盘输入的时长,单位是0.1秒。超过这段时间没有输入则为超时,系统将自动引导缺省的操作系统。如果不设置本参数,缺省的超时时间长度为无穷大。


5 引导映像参数
  引导映像参数作用于每一个引导映像区。如果某一引导映像参数(例如:password)与全局参数的定义相抵触,则以该引导映像参数的定义为准,但仅限于该引导映像区。以下是具体参数项:
  image=pathname
  设置包含Linux核心引导映像的文件或设备。
  other=pathname
  设置包含非Linux操作系统,如DOS、SCO UNIX、Windows 95等系统引导映像的文件或设备。
  range=start-end
  如果"image"参数被设置为一个设备,则Linux核心引导映像的存放范围必须被设置。
  image = /dev/fd0
  range = 1-512  
  # Linux核心引导映像存放在软盘上的第一至512扇区
  label=name
  通过此参数来标识当前操作系统,即操作系统名。用户可通过在LILO提示后输入"标识"来决定引导哪一个操作系统。
  alias=name
  给当前操作系统起一别名。
  lock
  类似同名全局参数。
  optional
  类似同名全局参数。
  password=password
  类似同名全局参数。
  restricted
  类似同名全局参数。
  以下两个参数项用于非Linux操作系统:
  loader=chain-loader
  如果要引导第二块硬盘上的非Linux操作系统或将LILO安装到软盘,这个参数是必需的。不指定时,缺省值是/boot/chain.b。如启动第二块硬盘上的MS-DOS或Windows 95,可定义loader=/boot/any_d.b;对于OS/2,则为loader=/boot/os2_d.b。
  作为一个特殊的功能模块,any_d.b已不合时宜,在0.20版以后的lilo程序包中已不再包含它并将其功能整合进chain.b,os2_d.b亦有所变动。它们的功能可用如下语句代替。
  例:
   other = /dev/hdb1
     loader = /boot/any_d.b
  替换为:
   other = /dev/hdb1
     map-drive = 0x80
     to = 0x81
     map-drive = 0x81
     to = 0x80
  对于os2_d.b:
   other = /dev/hdb1
     loader = /boot/os2_d.b
  替换为:
   other = /dev/hdb1
   loader = /boot/os2_d.b
   map-drive = 0x80
       to = 0x81
   map-drive = 0x81
     to = 0x80
  map-drive=〈bios_device_code〉
  通知chain.b装入重映射软驱或硬驱的内存驻留驱动程序,使用它可以引导不同硬盘上的不同操作系统,条件只有一个, BIOS必须能访问硬盘。"map-drive"后跟有变量"TO=〈盘设备号〉"。实际上,"map-drive"起到了"软"交换两个软驱或硬驱主、从顺序的作用,避免了手工接线的麻烦。
  例:交换软驱
     map-drive = 0
     to = 1
     map-drive = 1
     to = 0
  交换硬驱(参看loader参数例)
  table=device
  指定包含非Linux系统分区的主设备。举例来说,如果Windows 95在第一个IDE硬盘的第一个基本分区上,即/dev/hda1上,那么必须定义table=/dev/hda 。

6 核心参数

  如果LILO引导的是Linux系统,我们可用下面命令传递一些参数给Linux核心。除"literal"之外,它们也可用于全局参数区。
  append=string
  append传递一个特殊硬件的参数串string给Linux系统的核心。它常用来配置一些Linux不能正确测试到的硬件设备。例如:
  append = "hd=64,32,202"
  通知Linux核心,硬盘参数为64柱面、32磁头、202扇区。具体的参数串设置可参看/usr/doc/HOWTO/BootPrompt-HOWTO文件。
  literal=string
  类似于"append",但它将撤消所有的其它核心参数(比如设置了root设备)。因为"literal"会不分青红皂白地撤消一些必需的、重要的参数,所以不能将它设置在全局参数区。
  ramdisk=size
  指定RAM盘的大小。size为零时不建立RAM盘。忽略此参数时,RAM盘大小由Linux核心引导映像决定。
  read-only
  通知LILO以只读方式载入根文件系统。通常我们在检查根文件系统时需要将根文件系统以只读方式载入。Linux系统在每次启动时也会将根文件系统以只读方式载入,待例行的文件系统检查后再将其重新载入为读写方式。
  read-write
  通知LILO以读写方式载入根文件系统。
  root=root-device
  指定被安装根文件系统硬盘分区设备。
  vga=mode
  指定引导Linux系统时的VGA模式。有以下取值:
  normal:常规80×25文本模式
  extended (or ext): 80×50文本模式
  ask: 引导时询问用户使用哪一种VGA模式,这时敲回车键将显示一个可分配的VGA模式表。
  如果不指定VGA模式,系统将缺省地使用包含在系统核心里的VGA模式值。


7 lilo.conf配置实例

  有了这些基础知识,我们可以很容易地按照自己的意图配置LILO。请看一个lilo.conf文件的例子:
  boot=/dev/hda         #将LILO安装在MBR。LILO作为主引导管理器
  message=/boot/message     #注释为/boot/message
  compact             #产生一个更小的"map"文件
  map=/boot/map         #指定"map"文件为/boot/map
  install=/boot/boot.b
  password=zhoudi         #设置口令
  vga=normal           #80x25文本模式
  linear             #使用"linear"地址
  prompt             #提示用户键盘输入
  timeout=50           #超时时长为5秒
  default=dos           #缺省引导label为dos的操作系统
  #设定Linux
  image=/boot/vmlinuz-2.0.34-1  
  #设置Linux核心引导映像
   label=linux         #标识为linux
   root=/dev/hda1       #设置根文件系统
   read-only          #LILO以只读方式载入根文件系统
  #设定MS-DOS或Windows 95
  other=/dev/hda2         #DOS分区为第一个IDE硬盘的第二分区
   label=dos          #标识为dos
   table=/dev/hda       #主设备为第一个IDE硬盘
  #设定SCO UNIX
  注意:SCO分区必须设为活动(active)分区并将LILO安装在MBR上。
  other=/dev/hda3
   label=sco
   table=/dev/hda
  这个例子中,LILO是作为主引导管理器来管理机器上所有操作系统的。LILO也可作为二级引导管理器,这只要将"boot"参数改为根分区就可做到。例如:
  boot=/dev/hda1
  以这种方式使用LILO时,Linux根分区必须用DOS或Linux的fdisk程序将其设置为活动分区,并且这种方式只对硬盘主分区(不是扩展或逻辑分区)有效。
  LILO还可以启动第二个以上的操作系统。在我的机器上有两块希捷硬盘,一块硬盘为8.4GB,另一块为1.2GB,都以LBA模式接在主IDE口上。8.4GB跳线为主盘,1.2GB跳线为从盘,Linux核心很容易地就将它们辨认出来并能正常使用,1.2GB的硬盘上安装了MS-DOS 6.22。笔者是这样设置lilo.conf的:
  disk=/dev/hda
   bios=0x80      
  #由于IDE硬盘存在双硬盘问题,所以当启动DOS系统时,会提示"无系统盘或系统盘错!",需修改程序如下。
  disk=/dev/hdb
   bios=0x81
  boot=/dev/hda
  map=/boot/map
  install=/boot/boot.b
  linear
  prompt
  timeout=50
  default=dos
  image=/boot/vmlinuz-2.2.11-1
   label=linux
   root=/dev/hda1
   read-only
  other=/dev/hdb1
   label=dos
   map-drive = 0x80
      to = 0x81
      map-drive = 0x81
      to = 0x80
  #交换两硬盘主、从顺序
   table=/dev/hdb
  配置好lilo.conf文件后,在root账户下执行lilo命令,新的LILO就被载入系统。上面第一个例子执行结果如下:
  #lilo
  Added linux
  Added dos*      
  Added sco
  (注:带*号的表示其为缺省操作系统)


8 Linux启动问题解决方法


8.1 Lilo失效有五种参考方法:
1、如果有启动软盘,用它启动后,运行lilo,重启。
2、红旗下通过:用安装光盘引导系统。在安装向导开始后,我们即可溜到另一个控制台下(按Ctrl+Alt+F2),将看到bash#字样。如果你Linux的/分区是对应/dev/hda3,所用的文件系统是ext2的。
注意:#开始的行是注释行
mount -t ext2 /dev/hda3 /tmp
#(使用的reiser文件系统的用户用reiserfs代替ext2)
chroot /tmp
/sbin/lilo
如果同时忘记了root口令,可在此用passwd修改
取出光盘,用硬盘启动。
3、红旗下通过:用Windows的启动软盘启动进入DOS,假定光驱为g:,Linux安装在/dev/hda3,将Linux安装光盘放入光驱,在DOS提示符下运行以下三条命令:
g:
cddosutilsautoboot
..loadlin vmlinuz root=/dev/hda3 1 或者
..loadlin vmlinuz root=/dev/hda3 single 或者
..loadlin vmlinuz root=/dev/hda3 init=/bin/sh rw
启动Linux后,在#提示符下,运行 /sbin/lilo
如果同时忘记了root口令,可在#提示符下,用passwd修改
然后重启。
4、红旗下通过:用升级方式重装,注意什么包也不选,运行一遍安装程序后,就可以修复Lilo
5、Red hat 7.1下通过:重装(不过什么包也不选,也不能选格式化Linux分区,进行到最后重新配置Lilo),如果同时忘了root口令,请牢记在重装时输入的口令。


8.2 忘记root口令解决方法:
如果忘了root口令,请重新启动,在Lilo处,即显示boot:时:
运行 linux 1 (或 linux = single 或 linux init=/bin/sh rw)
进入单用户模式,显示 bash#,这时运行passwd可以修改口令,然后exit, 进入到login:处,输入root,口令输新口令,一切就OK了!

8.3 安装Linux后,如果不能启动DOS、Windows(假定安装在/dev/hda1), 请进入Linux后,修改/etc/lilo.conf文件,加上:
other=/dev/hda1
label=dos
保存退出,执行lilo命令,他会把lilo中加上dos的选项。


9 LILO典型配置方法

  通常情况下,Linux的安装程序自身就可以完成LILO的安装配置,从而较好地解决多重系统的引导问题,如果系统不能自动完成这种配置,则可以通过手工修改配置文件/etc/lilo.conf来实现不同条件下的引导。


9.1 当系统能自动完成配置时
  对于这种情况只有一个建议:将LILO安装到Linux分区的根上,而不是MBR这个多事地带。假设当前hda1中装有DOS/Windows,hda2中安装了Linux,则/etc/lilo.conf的内容大致如下:
boot=/dev/hda2 #指定引导位置
compact
delay=50 #延时5秒
root=current #根在当前分区
image=/boot/vmlinuz #指定linux的内核文件  
label=linux #用linux为代表名称 
other=/dev/hda1 #其他操作系统所在的分区
table=/dev/hda #指定包含分区表的硬盘
label=dos #用dos为代表名称

9.2 当系统无法自动完成配置时
  系统无法自动完成配置的情况不外乎两种:
  (1)BIOS不能直接看到Linux的根分区;
  (2)BIOS只能读写标准IDE硬盘的前504MB。
  这时,必须遵循一个最基本的原则:建立一个BIOS能存取的较小的Linux分区,其中包含内核文件、映射文件及链加载程序等必要内容,而根则可以是另外一个独立的分区。至于配置上的其他细节,我们通过以下实例来进行说明。
  例1:主硬盘为IDE接口,第二硬盘为SCSI接口,根文件在SCSI上。
  对策:在IDE硬盘上划分一个较小的Linux分区(/dev/hda2),其中包含基本文件,挂接到/u2下,其配置文件/etc/lilo.conf的主要内容为:
boot=/dev/hda #lilo装在主ide的mbr
install=/u2/etc/lilo/boot.b #从boot.b安装lilo引导记录
map=/u2/etc/lilo/map #安装程序建立此映射文件,告诉引导载入程序内核块的位置
compact
timeout=50
image=/u2/vmlinuz #内核文件应事先拷贝到/u2下
label=linux
root=/dev/sda1 #告诉内核根系统在scsi硬盘上
read-only
other=/dev/hda1
loader=/u2/etc/lilo/chain.b #指明加载程序
label=dos
  例2:一个标准的IDE大硬盘需安装Linux和DOS/Windows。
  对于大硬盘问题,很多人只知道低于1024个柱面的限制,而不知为什么标准的IDE硬盘只能认前504MB。
  其实,BIOS的int13调用是采用三个位元组的CHS编码,10位为柱面号,8位为磁头号,6位为扇区号。可能的柱面号码是0~1023,可能的磁头号码是0~255,而磁道上可能的扇区号码是1~63,以这24位最多可以定址8455716864个位元组(7.875GB)。
  但不幸的是,标准的IDE介面容许256个扇区/磁道、 65536个柱面及16个磁头。它自己本身可以存取237= 137438953472(128 GB),但是加上BIOS方面 63个扇区与1024 个柱面的限制后只剩528482304(504 MB)可以定址得到。
  对策:在硬盘的前500MB中划分350MB(/dev/hda1)给DOS,150MB(/dev/hda2)给Linux,在相应的配置文件中应说明硬盘的参数。
  boot=/dev/hda
  ... ...
  disk=/dev/hda
  bios=0x80
  sectors=63
  heads=16
  cylinders=2100
  image=/vmlunuz
  append="hd=2100,16,23"
  root=/dev/hda2
  label=linux

10 备份和修复Linux LILO指南

10.1 测试环境
Redhat Linux ,IDE和SCSI启动硬盘。

10.2 备份措施
当我们设置完新的服务器后,除了常规的服务器重要配置文件和系统备份之外,最好
也要做LILO和内核的软盘备份,万一由于某种原因导致LILO不能引导系统。
1. 第一种方法
适用范围: 自己编译的内核,所有的支持模块已经编译进内核,如果有SCSI硬盘,必
须编译进SCSI支持进内 核,也就是说内核已经包含了所有引导需要的东西。
步骤:
格式化一张空白软盘,不要生成文件系统,直接写内核到软盘,然后改变内核文件中
的根文件系统分区定义
fdformat /dev/fd0h1440
  dd if=/boot/vmlinuz of=/dev/fd0 (用你自己的内核文件名替代vmlinuz)
rdev /dev/fd0 /dev/sda3 (用你的根分区设备名称替代/dev/sda3)
  rdev -R /dev/fd0 1 (安装根文件系统成只读模式)
作用: 这样当系统LILO失败时,可用该软盘引导系统且安装硬盘根文件系统。
2. 第二种方法
适用范围: 内核需要一系列模块帮助引导,如SCSI硬盘驱动程序,则需要用下面的方
法生成带LILO的引导软盘
步骤: 放一张新的软盘,不要格式化和分区,直接用mkbootdisk创建引导盘
mkbootdisk --device /dev/fd0 2.2.12-20 (用你的内核版本代替2.2.12-20,可用
uname -a查看)
3. 第三种方法
适用范围: mkbootdisk命令不可用,或者无论什么理由你想手动创建一张带LILO的
引导软盘。
步骤:
fdformat /dev/fd0h1440 (低级格式化软盘)
  /sbin/mkfs.minix /dev/fd0 1440 (在软盘上创建minix文件系统)
  /bin/mount /dev/fd0 /mnt/floppy (安装软盘到/mnt/floppy目录)
  cd /mnt/floppy
  mkdir boot etc dev
  cp -a /boot/vmlinuz /boot/initrd.img /boot/boot.b boot/
  注:用你的内核文件名代替vmlinuz 用你的initrd映像文件名代替initrd.img
  cp -a /dev/fd0 /dev/null /dev/zero /dev/hd[abcd]* /dev/sd[abcd]* dev/
  注: 如果你没有SCSI设备,可不用拷贝/dev/sd[abcd]*
  创建/mnt/floppy/etc/lilo.conf如下
  boot=/dev/fd0
  read-only
  prompt
  image = /boot/vmlinuz
  initrd=/boot/initrd.img
  root = /dev/sda1 # 把/dev/sda1换成你的根文件系统设备名称
  label = linux
最后运行 lilo -r /mnt/floppy 在软盘上安装LILO (将自动生成/boot/map文件包括内
核的物理映像位置) 。
4. 剖析initrd.img
如果你是用SCSI硬盘启动,内核必须能装入SCSI驱动程序才能转入你的硬盘根文件系统
引导系统。
如果你的内核没有编译进SCSI驱动程序,则需要用mkinitrd创建RAM驱动映像想知道你的
initrd.img中包含了哪些驱动程序吗?
cat initrd.img | gunzip > /tmp/myinitrdfs
  mkdir /mnt/tmp
  mount -o loop -t ext2 /tmp/myinitrdfs /mnt/tmp
然后查看/mnt/tmp中的文件linuxrc中的内容即可知道启动时会装入哪些驱动程序。你
也可以更改其中的内容,假设我们想加另一种SCSI驱动aic7xxx.o进入你的initrd.img
cd /mnt/tmp
  vi linuxrc 加上一行 insmod /lib/aic7xxx.o
  cp /lib/modules/`uname -r`/scsi/aic7xxx.o lib/
  cd /
  umount /mnt/tmp
  dd if=/tmp/myinitrdfs | gzip > /boot/initrd2.img
至此,新的initrd文件initrd2.img就包含了aic7xxx的驱动程序了。
四. 紧急修复
许多情况能导致LILO引导失败,象升级内核,忘记运行lilo更新MBR,克隆硬盘,缺少
SCSI驱动程序引导根文件系统等等,当我们遇到这些情况而手边又没有备份的引导软盘
时,你仍然有许多其它途径去修复。
1. 查看周围有没有类似的其它机器和系统在运行,如另一台服务器上有相同版本或同系
列的内核在运行。则在另一台系统上生成引导软盘(带LILO或者不带LILO),如果需要添
加initrd.img中的SCSI驱动文件。
2. 用CDROM安装盘启动,CDROM会载入SCSI驱动,到分区界面时用ALT+F2转入字符界面,
可mount硬盘根分区,运行lilo 和做相关的修复。
3. 下载包含boot/root文件系统在一张软盘上的文件,如www.toms.net/rb/ 可完全从一
张软盘启动系统,完全不需要硬盘,然后再安装硬盘,修复系统(例如万一你的/etc/fstab
中的根文件分区指定错误 ,可用此方法修复)。
4. 最后如果都不可行,你可以下载与你的服务器相同版本或者同系列中最新版本的内核,
在另一台机器上编 译需要的SCSI和网卡等相关驱动程序直接进入内核,不需要任何模块,
然后用本文的方法拷贝至软盘,去引导系统。


11 实例讲解 LILO 的配置和使用

Linux 加载程序或者说 LILO 是引导Linux 操作系统最常用的程序,本文将以实例详细叙述Lilo 的配置。如果你第一次安装Linux ,那么可能就需要用到双重启动。LILO(LInux LOader)就是实现这种功能的最简单但是最具有伸缩性的程序。
计算机启动时,BIOS 会执行位于硬盘主引导记录(MBR)或者软盘上的一段引导程序,这段程序的作用就是定位并加载操作系统。如果是引导Linux 的话,引导程序会把Linux 内核调入内存。LILO 就是干这种活儿的程序。
首先遇到LILO,估计应该在你安装Linux 的时候,你会被要求选择LILO 的安装处,是MBR 还是Linux 的根分区。如果你有其他的启动管理程序例如Boot Magic 或者 System Commander 等,并且想使用他们,那么你应该把LILO 安装到Linux 的根分区。如果你选择使用LILO 作为启动管理程序,就可以选择MBR。如果你想在启动时传递参数给内核,也应该使用MBR。
使用LILO 作为启动程序后,机器启动后就会有LILO:的提示符,按下 TAB 键,可以看到可以选择的操作系统列表。输入其中的操作系统标签名就可以启动到对应的操作系统,或者直接输入回车启动到缺省的操作系统。
我们来看一个LILO 启动的配置文件(/etc/lilo.conf)实例:
boot = /dev/hda
vga = normal
read-only
prompt
default = dos
timeout = 30
append="hdc=ide-scsi"
image = /boot/vmlinuz
label = linux
root = /dev/hda2
initrd = /boot/initrd
第一个选项是 boot ,定义了LILO 的安装位置,
'/dev/hda' 就是把LILO 安装到 MBR,所以你如果要把
LILO 作为启动管理程序,就必须这样写哦!反之,你要把他定位到具体的Linux 根分区例如 /dev/hda3。
vga 是一个显示启动菜单的配置选项,可以有:
'normal' (80x25 文本模式),
'extended' (80x50 文本模式)
以及 'ask' (提示你选择文本模式)。
采用read-only 选项时,系统会把根分区挂接为只读方式,推荐采用这个选项,因为 fsck 程序要求文件系统只读。但不用担心你的根分区会不能写入了,相反,系统一旦 启动就会把根分区挂接为读写方式。
prompt 是一个必须放入的选项,否则就没有LILO 的提示符了。但是按住 shift 键可以看到提示。
default 指定缺省的引导映像,如果没有指定,那么第一个定义的映像就成为缺省值。
timeout 是提示显示的时间,单位是 0.1 秒。
append 是一个十分有用的选项,他允许你把额外的参数传递给内核,例子中的 /dev/hdc 是一个可擦写CD驱动器,传递的参数就是用来让内核认识这个驱动器,另外这个选项在个别不认识内存的机器上十分有用。需要注意的是,你需要使用双引号来引入想要传递的参数,不要使用单引号。
LILO 也可以让你手工在LILO 提示符下传递这些参数。例如:
LILO: linux single
就是告诉Linux 启动Linux 进入单用户模式。在引导区损坏时,可以从软盘启动,然后指定硬盘的根来修复硬盘引导扇区。
LILO: linux root=/dev/hda3
image 指定需要启动的内核映像。每个映像还包括一个 label 选项定义启动时你需要输入的标签。
还可以为某一个 image 指定口令:
password='password'
添加 restricted 选项后,系统就会在你传递额外的参数时提示口令。这就防止有人采用"linux single" 来直接引导到提示符,而不需要验证系统口令。这在采用主机托管的服务器上十分有用,如果碰到别有用心的主机托管机房的管理人员时,这一招还是管用的。
LILO 引导其他类型的操作系统和引导Linux 一样配置,但是更加简单:
other = /dev/hda3
label = dos
table = /dev/hda

other 指明操作系统所在的分区,同样的和Linux 下的image 一样也需要给定一个标签(label),table 选项指向包含分区表的设备,这个选项必不可少,因为LILO 会从这个这个分区表寻找对应的分区信息,然后把他传递给 要启动的操作系统。
对lilo.conf 的任何改变都要求重新运行 /sbin/lilo ,保证最新的改变能写入分区。
另外,如果你升级内核或者重构了 initrd 映像,也需要重新运行 /sbin/lilo。
运行/sbin/lilo 后,可以看到如下信息:
Added linux *
Added suse
Added windows
表示各种映像已经写入分区,带有 * 的分区是目前的缺省引导分区。
可以用 -D 参数改变缺省引导分区:
/sbin/lilo -D windows
Added linux
Added suse
Added windows *
可以看到缺省分区已经成为 windows了。


完 附录
我的硬盘分区:
/dev/hda1 vfat, win2k
/dev/hda5 ext2 /boot
/dev/hda9 ext2 /
lilo装在/dev/hda5的第一个扇区,用os loader引导

# BEGIN_BITMAP
# lilo-22.2-10 added "bitmap" entry
bitmap=/boot/lilo.bmp
bmp-table=40p,300p,,24,
bmp-colors=3,0,;0,1,,
bmp-timer=74,29,3,0,
# END_BITMAP
boot=/dev/hda5
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
lba32
default=linux

image=/boot/vmlinuz
label=linux
initrd=/boot/initrd
read-only
root=/dev/hda9
vga=788
other=/dev/hda1
label=dos

附录二
谢谢斑竹,这是我机器的lilo.conf

# BEGIN_BITMAP
# lilo-22.2-14 added "bitmap" entry
bitmap=/boot/lilo.bmp
bmp-table=40p,300p,,24,
bmp-colors=13,15,;15,8,,
bmp-timer=74,29,13,15,
# END_BITMAP
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=150
lba32
# giloassword=enabled
default=linux

image=/boot/vmlinuz
label=linux
initrd=/boot/initrd
read-only
root=/dev/hda4