现在的位置: 首页 > 综合 > 正文

Linux启动分析专题(2)

2013年03月31日 ⁄ 综合 ⁄ 共 5470字 ⁄ 字号 评论关闭
LILO 详解  

  一台电脑从加电到进入操作界面是经过了一系列复杂的操作的。基本的工作是由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文件中发现。最重要的是在良好的备份意识指导下,多多实践,这样才能得到最佳的效果。 

抱歉!评论已关闭.