关于LiLo--原理篇

发表于:2007-07-04来源:作者:点击数: 标签:
1一般的开机引导过程 在PC机上,最初的启动由BIOS完成。当开机自检结束时(Power-On Self Test,POST),BIOS尝试读入软盘的第一个扇区,把它看作引导扇区。若没有软盘,则尝试读入硬盘的第一个扇区。新的BIOS可以改变这种次序,先从硬盘启动。甚至从光盘启动。由

  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个分区。这四个分区叫做主分区:primary prititions.假如它们不够用,可以设置所谓的扩展分区。  扩展分区包含至少一个逻辑分区。扩展分区的第一个扇区结构类似MBR,它的分区表的第一表项对应第一个逻辑分区。如果存在第二个逻辑分区,那么分区表的第二个表项就包含了一个指针。这个指针指向第一个逻辑分区后面的一个地址。这个地址包含一个分区表。该分区表的第一表项对应第二个逻辑分区。这样就组成一个链表,从而扩展分区可以有任意多的逻辑分区。
  
  每一个主分区和扩展区都包含一个引导扇区。系统只能从这几个地方之一启动。
  BOOT标志决定哪个区被引导。
  
  原来,只有主分区,因此,MS-DOS的fdisk和大多数同类工具只能激活主分区..
  MBR的代码要作以下的操作:
    1:确定活动分区。
    2:使用BIOS,将活跃分区的启动扇区读入。
    3:跳到启动扇区的0位置。
    MBR的空间足够完成这些工作。如上所述,每个分区理论上包含一个引导扇区,而且,存在的第二个硬盘也包含和第一个类似的结构。MBR完全可以容纳一个复杂的引导程序。即所谓的boot manager,动态的决定活动分区。Linux 为我们提供了lilo
  
  2 LILO:the linux loader
   LILO引导扇区包括一个分区表的空间,所以,LILO即可以安装在MBR中,也可以安装在某个分区的引导扇区。LILO拥有DOS引导扇区的所有功能,而且,它还可以引导逻辑扇区和第二硬盘分区。LILO还可以和另外的引导者合作(例如:NT loader),这样,用户就可以有很多选择。
  (注:以下几个标题,为防止引起歧义,用原文)
  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/hda of=/backup/MBR bs=512 count=1
  
  写会使用命令:
    # dd if=/backup/MBR of=/dev/hda 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,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引导的配置从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根本就没有被读入,没安装LILO,或LILO驻留的分区没被激活。
    Lnumber : LILO的第一部分被读入并开始执行。但第二部分不能被读入。后面的数字表明出错原因。这可能是由于硬盘的物理错误或不正确的物理结构信息。
    LI: LILO的第一部分可以读入第二部分,第二部分执行时出错。这可能是不正确的物理结构信息或重装了boot.b而没有运行LILO重新安装。
    LIL:LILO的第二部分启动起来了,但是不能从map文件读入descriptor tables.这说明不正确的物理结构信息或物理错误。
    LIL?: LILO的第二部分被读到不正确的地址。原因同LI
    LIL-: descriptor tables有错。这可能是不正确的物理结构信息或重装了map file而没有运行LILO重新安装。

原文转自:http://www.ltesting.net