【技术手册】lilo的解析
slackware吧
全部回复
仅看楼主
level 1
静蓝繁星 楼主
2011年03月29日 11点03分 1
level 1
静蓝繁星 楼主
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使用的配置参数
很多,配置起来也相当复杂。

2011年03月29日 12点03分 5
level 1
静蓝繁星 楼主
lilo.conf文件中的配置参数分为两部分,一部分是全局参数,另一部分是引导映像参数。与linux系统其他的配置文件一样,“#”号后的一行文字表示注释。
一、LILO的引导机制
  众所周知,计算机的最初启动是由BIOS控制的,在对一些硬件(如:内存、键盘等)初始化之后,它会试图加载硬盘的主引导记录(MBR)或软盘的引导扇区。
  MBR可通过两种方式运行,其一是定位到活动分区并加载相应的引导扇区,然后由引导扇区完成该分区内操作系统的基本组件的加载;其二是直接从一指定分区中加载信息,并通过它装入任一分区的操作系统,诸如LILO、OS/2bootloader及PartitionMagic等引导加载程序都可以配置成这种方式。
  软盘的引导扇区相当于硬盘活动分区的引导扇区,它通常用于装入软盘上的操作系统。
  由此可见,只要把LILO安装在MBR、活动分区或者引导软盘上,就能接管计算机的控制权,然后由LILO完成后继的引导过程。LILO中建有一个引导表地址编码,借此它的引导程序就能定位到Linux的内核文件,这种地址编码既可以按照柱面/磁头/扇区(CHS)模式,又可以采用LBA的线性块号模式,因此,即使对某些SCSI控制程序LILO也能运转良好。
  当LILO定位到配置文件后,经过预引导过程,就显示提示符:
   LILOboot:
  此时,系统允许选择引导不同的操作系统或者不同的内核配置,按Tab键显示可选项列表,然后输入可选项或者直接回车选择缺省配置,如果选择了引导Linux,还可以直接传递参数到系统内核。
  和其他系统的引导加载程序相比,LILO具有更大的灵活性,其引导方式也更丰富多彩。
  ●当LILO被安装在硬盘的MBR、活动分区或引导软盘上时,作为原引导程序的替身,它能引导任一硬盘任一分区上的Linux和其他操作系统;
  ●除了引导扇区,它没有任何隐含文件,也不需要使用特定的分区,它的配置文件可以在任何分区、甚至是存放在与Linux毫不相干的DOS分区的某个子目录下;
  ●它能引导几个不同的内核配置,甚至是几个不同的内核;
  ●它能引导同一机程序上的多个Linux版本;
  ●它能从网络上引导Linux。
  LILO的灵活性使得其配置变得相当复杂,当有多个系统共存时,建议先安装其他操作系统,最后再装Linux,这样,设置LILO对其他系统的引导会相对简单一些。
2011年03月29日 12点03分 6
level 1
静蓝繁星 楼主
二、几个重要的LILO引导参数
  LILO的引导参数有很多,在此只对一些比较重要的参数作一介绍

  1.“boot=”
  此参数指明包含引导扇区的设备名(如:/dev/had),若此项忽略,则从当前的根分区中读取引导扇区。
      指定一个用于安装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缺省安装在根分区超级块上。
  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=”
  设定引导第一个映像前的等待时间。在没有指定“prompt” 参数时,LILO将立即引导缺省的操作系统,“delay”参数在这之间插入一段延时,单位是1/10秒。
  7.“disk=”
  此参数为某一特殊的硬盘定义非标准参数。
      为某些非标准硬盘定义参数。其内部还包括有几个可选的子参数。
  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可以正确识别和使用大多数硬盘,除非最坏的情况,否则不用设置它。
  8.“append=”
  为内核传递一个可选的参数行,其典型的应用是为不能完全由系统自动识别的硬盘指定参数,如:append="hd=64,32,202"
  9.“label=”
  此参数为每个映像指定一个名字,以供引导时选择。
  10.“read-only”
  设定以只读方式挂入根文件系统,用于文件系统一致性检查(fsck)。
  11.“install=”
  安装一个指定文件作为新的引导扇区,缺省为/boot/boot.b。
  12.“loader=”
  说明所使用的链加载程序(chainloader),缺省为/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等。
    18.compact
  该参数用于优化LILO,产生一个更小的“map”文件。如果在软盘上安装LILO,强烈推荐使用此参数。
    19.default=name
  指定缺省引导的操作系统。如default=dos 表示将label为DOS的系统作为缺省引导的操作系统。如不指定该参数,排在lilo.conf中的第一个操作系统将作为缺省操作系统。 
2011年03月29日 12点03分 7
level 1
静蓝繁星 楼主
三、引导映像参数
  引导映像参数作用于每一个引导映像区。如果某一引导映像参数(例如: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 。
2011年03月29日 12点03分 8
level 1
静蓝繁星 楼主
五、LILO的卸载
  当LILO覆盖了引导扇区时,它会保留一个引导扇区的备份在/boot/boot.xxyy中,其中xyy是16进制的设备主/次号码
(major/minornumbers),利用命令“ls-l/dev/device”就可获得硬盘或分区的主/次号码。如果这些备份文件已经存在,那么,当你重新安装LILO或?构内核时,它将不再生成此文件,这就保证了此备份文件是最原始的引导扇区。
  若要卸载LILO,你只需恢复初始的引导扇区就可以了。例如:LILO安装在/dev/had,对应的备份文件为/boot/boot.0300,简单地使用下面的命令即可:
  ddif=/boot/boot.0300of=/dev/hadbs=446count=1
  当然,若想完全卸掉Linux,必须用Linux的fdisk对Linux分区进行破坏,因为DOS的fdisk无法移去非DOS分区。
六、磁盘错误码
  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)。
  LILO的配置相当复杂,读者只有在实践中不断学习、摸索,勤于思考,才能用好LILO。
关于LILO值得探讨的问题还有很多,但只要懂得了其内部机制,对更复杂的实际情况也能较圆满地解决。
2011年03月29日 12点03分 10
1