一台电脑从加电到进入操作界面是经过了一系列复杂的操作的。基本的工作是由BIOS完成的。当POST(自检)结束后,BIOS尝试读入BIOS设定的第一个启动设备的第一个扇区,把它看作引导扇区(原先的BIOS总是先尝试软盘的),然后读入里面的信息来引导系统。
我们先来看看DOS的系统引导区:
OFFSET
0x000 JMP xx ; 近距离跳转到xx代码段
0x003 ; 磁盘参数
0x03E ; 载入DOS系统核心的代码段
0x1FE 0xAA55 ; 这是BIOS的幻数
DOS的引导区总是从0开始,以BIOS的magic number 结束,总共512字节。从软盘启动比较简单,因为只有一个引导扇区:第一个扇区。而硬盘虽然有很多分区,但是,BIOS根本不去查看分区信息,它象对待软盘一样对待硬盘,仍读入第一个分区:master boot record (MBR).
所以MBR也应该从0开始,以BIOS的magic number 结束。在MBR的最后部分保存了分区表。 每个分区信息占16字节,定义了硬盘可以有4个Primary Partition。如果这些不够用,可以设置所谓的扩展分区。扩展分区包含至少一个逻辑分区。扩展分区的第一个扇区结构类似MBR,它的分区表的第一表项对应第一个逻辑分区。如果存在第二个逻辑分区,那么分区表的第二个表项就包含了一个指针。这个指针指向第一个逻辑分区后面的一个地址。这个地址包含一个分区表。该分区表的第一表项对应第二个逻辑分区。这样就组成一个链表,从而扩展分区可以有任意多的逻辑分区。
每一个主分区和扩展区都包含一个引导扇区。系统只能从这几个地方之一启动。BOOT标志决定哪个分区的引导扇区被引导。 MS-DOS的fdisk和大多数同类工具只能激活主分区。
MBR的代码要作以下的操作:
1:确定活动分区(Active Partition)
2:使用BIOS,将活跃分区的启动扇区读入
3:跳到启动扇区的0位置。
MBR的空间足够容纳一个引导程序来动态的决定活动分区。LILO就是这样一个引导程序。
LILO(LInux LOader)
LILO引导扇区包括一个分区表的空间,所以,LILO即可以安装在MBR中,也可以安装在某个分区的引导扇区。
1.LILO可以占据MBR,但是会将老的MBR冲去,出于安全起见,最好在在安装LILO前,将老的MBR(包括分区表)做一个备份。可以通过键入
# dd if=/dev/hda of=/backup/MBR bs=512 count=1
来备份原来的MBR信息,
如果要将MBR写回,可以键入:
# dd if=/backup/MBR of=/dev/hda bs=446 count=1
这样,原来的MBR就被写回但不包括分区表。如果分区表也要恢复,那么设置bs=512。
2.通过MS-DOS MBR被引导
LILO就可以安装在这些分区中的一个。当 LILO对应分区被激活后,引导过程如下:
BIOS 读入 MBR
MBR 读入 活跃主分区:LILO所在的分区;
LILO 引导Linux或另外的操作系统。
要引导其它OS且不用LILO很简单,激活那个分区。Linux分区不会有任何变化。
3.LILO也可以被其他的系统引导程序(Boot Manager)引导
1. 假如boot manager可以引导扩展区,Linux可以装在扩展区上;
2. 假如 boot manager 可以引导第二硬盘分区,linux可以装在第二硬盘上;
3. 有些 boot manager 甚至可以引导逻辑分区,那LILO就可以装在逻辑分区上。
但是对于系统引导程序要特别注意的是:某些操作系统直接改写MBR,这会将原来的boot manager破坏。
配置LILO
与LILO有关,即有关系统引导的文件通常放在/boot/下,配置文件是/etc/lilo.conf下。合理的配置lilo. conf对于系统的正常高效运行有着非常重大的意义,可以通过man lilo.conf来查看配置的注意事项
下面是一些重要常用的选项:
"boot="
指明包含引导扇区的设备名(如:/dev/had),若此项忽略,则从当前的根分区中读取引导扇区。
"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:由网络取得根文件系统的标志
"nfsroot="
若需通过NFS提供根文件系统来引导无盘工作站,此参数为内核指定了网络根文件系统所在的机程序、目录及NFS,其格式为:nfsroot=(〈server_ip〉:)〈root_dir〉(,nfs_options))
"nfsaddrs="
设定网络通讯所需的各种网络界面地址,如无此参数,则内核会试图用反向地址解析协定(RARP)或启动协定(BOOTP)找出这些参数,其格式为:
nfsaddrs=〈客户端IP〉:〈服务端IP〉:〈网关IP〉:〈子网屏蔽〉:
〈客户端名称〉:〈网络设备名 〉:〈auto〉
"image="
指定Linux的内核文件。
"delay="
以10毫秒为单位,设定引导第一个映像前的等待时间。
"disk="
某一特殊的硬盘定义非标准参数。
"append="
为内核传递一个可选的参数行,其典型的应用是为不能完全由系统自动识别的硬盘指定参数,如:append = "hd=64,32,202",还有为一些无法自动识别大内存的低版本内核传递参数,方法是append="mem=128M".mem后边是数字+单位,这个单位可以是byte/M等等
"label="
为每个映像指定一个名字,以供引导时选择。
"read-only"
设定以只读方式挂入根文件系统,用于文件系统一致性检查(fsck)
"install="
安装一个指定文件作为新的引导扇区,缺省为/boot/boot.b。
"loader="
说明所使用的链加载程序(chain loader),缺省为/boot/chain.b,如果不是从首硬盘或软盘启动,那么,此选项必须说明。
"table="
说明包含分区表的设备名,如果此参数忽略,引导加载程序将不能传递分区信息到已引导的操作系统。当此参数指向的分区表被修改时,必须重新运行/sbin/lilo。
"init="
内核初始化时执行的程序,通常过程为init、getty、rc和sh,版本1.3.43以来的Linux内核能够执行/sbin/init说明的命令行,若在引导过程中出现问题,则可设置init=/bin/sh直接跳到Shell。
"ramdisk_start="
由于内核不能放在压缩的内存文件系统映像内,为使内核映像能够和压缩的内存映像放在一张软盘内,加入"ramdisk_start=〈offset〉",这样内核才开始执行。
"vga="
设置显示模式,如80×50、132×44等。
"compact"
激活一种模式,在此模式下,LILO一次向BIOS请求读入相邻的几个分区。这极大的缩短了装载时间,特别是从软盘启动。
"Linear"
使LILO生成线性地址,而不使用通常的Sector/Head/Cylinder机制。Linux地址机制可以不依赖磁盘的物理结构。
"install = boot sector"
使用指定的boot sector写入引导扇区,缺省用/boot/boot.b
"map="
说明映射文件的路径。
"message=[File]"
指定一个文件,该文件的内容将会在LILO引导是被显示。假如没有说明该文件,那么就只会出现"LILO"。
"verbose=[level]"
说明LILO的调试级别。从0(不显示任何信息)到5(所有的状态信息)。
"backup = [backup file]"
以前引导扇区内容的备份文件。缺省使用/boot/boot.device number
"force-backup=[backup file]"
和backup 相同,当时假如备份文件存在,被覆盖。
"prompt"
指定要用户通过键盘选择要引导的内核。不会缺省选择。
"timeout="
设置一个超时值,在此时间内必须有键盘输入,否则用第一个配置。类似,假如超时,就不能再输入密码。一般情况下,该取缺省值,无穷大。
"serial=port, bps parity bits"
设置串口参数。如果LILO会从该文件获取串口参数的话。如果其中之一无效,那所有三个参数都无效。Port从四个标准串口选择一个:0对应COM1 或者/dev/ttyS0.。支持的波特率范围为:100-9600。所有校验设置都支持(n:none,e:even,o: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引导过程
每个从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
LILO 启动信息
缺省设置的LILO启动过程中在启动过程中,LILO会显示'LILO',如果LILO出错退出, 可以根据显示来判断系统的出错原因。
没有信息:LILO根本就没有被读入,没安装LILO,或LILO驻留的分区没被激活。
Lnumber : LILO的第一部分被读入并开始执行。但第二部分不能被读入。后面的数字表明出错原因。这可能是由于硬盘的物理错误或不正确的物理结构信息
LI: LILO的第一部分可以读入第二部分,第二部分执行时出错。这可能是不正确的物理结构信息或重装了boot.b而没有运行LILO重新安装。
LIL:LILO的第二部分启动起来了,但是不能从map文件读入descriptor tables.这说明不正确的物理结构信息或物理错误。
LIL?: LILO的第二部分被读到不正确的地址。原因同LI
LIL-: descriptor tables有错。这可能是不正确的物理结构信息或重装了map file而没有运行LILO重新安装。
LILO的卸载
LILO装在MBR以后,它会保留一个MBR的备份在系统的/boot/boot.xxyy中,其中xyy是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
LILO是现在Redhat Linux、TurboLinux等许多Linux distribution缺省的引导程序,正如上面所介绍的,拥有很强大的功能,更详细的内容可以在lilo安装的README文件中发现。最重要的是在良好的备份意识指导下,多多实践,这样才能得到最佳的效果。