内核_Lilo详解大杂烩

Lilo 功能非常强大,它不仅仅可以作为Linux操作系统的引导器,还可引导多个操作系统(eg: Win2000, Win9x, dos, Minix…),以及启动多个Linux内核映像
    在后面的内容中,我们将通过运行在自己计算机上的真实例子,讨论lilo最主要的用法。在开始学习lilo之前,我们还需要一些预备知识--什么是硬盘分区,Linux对硬盘分区的命名方法。
什么是硬盘分区?
    硬盘分区是指对硬盘物理介质的逻辑划分。将硬盘分成多个分区,不仅仅利于对文件的管理,而且不同的分区可以建立不同的文件系统。这样才能在不同的分区上安装不同的操作系统。对于一个硬盘来说,最多只能创建三个主分区,一个扩展分区在扩展分区上又可以划分若干逻辑分区。对于一个常规的操作系统来说,一般只能安装在主分区中,并且安装在主分区中的操作系统远比安装在逻辑分区中的方便管理且安全得多。(注:Linux就可安装在逻辑分区中)
    硬盘的物理第一扇(0柱面,0面,1扇区)是硬盘主引导记录扇MBR,计算机启动时,首先就读取该扇,读出硬盘分区表,从中选择三个主分区中唯一一个具有活动标记的分区,引导该分区上的操作系统。也就是说,无论有几个主分区(≤3),其中必须有一个分区是活动的。对硬盘进行分区,可以使用任何硬盘分区软件,如:Dos 下的fdisk、 PQMagic, Linux 下的cfdisk等等。Linux的引导记录可以安装在MBR中,或者Linux所在主分区中。如果Linux安装在逻辑分区中则Linux的引导记录必须安装在MBR中。
  
Linux对硬盘分区命名方法?
    Linux对硬盘设备的命名方式与Windows系列大不一样。每一个硬盘拥有自己的设备名。IDE硬盘为hd? , SCSI硬盘为sd? 。?表示a到z的小写字母,不同的字母代表不同的硬盘设备,这个字母为主设备号。而硬盘上的分区用hd??或sd??中的第二个?表示,它由数字组成,1-4表示主分区,从5开始表示逻辑分区。
    既是说,hda1表示第一个IDE硬盘的第一个主分区,sdb7表示第二个SCSI硬盘的第三个逻辑分区。
而直接使用硬盘设备的主设备名,则表示该硬盘的MBR。如hda表示第一个IDE硬盘的MBR
  
  lilo的使用主要在于lilo.conf的配置。Lilo.conf是lilo的配置文件,它位于/etc之下。在图1中给出了我的lilo.conf文件,后面的学习将主要围绕图1进行。
  配置Lilo.conf
  
  boot=/dev/hda3
  prompt
  timeout=30
  default=w
  message=/etc/message-file
  
  image=/boot/vmlinuz-2.2.12-20
  label=l
  read-only
  root=/dev/hda3
  
  other=/dev/hda1
  label=w
  other=/dev/hda4
  label=m
  other=/dev/fd0
  label=f
  在对图1进行细致分析之前,先来看一看我的硬盘分区情况--图2
  
  cfdisk 2.9 Disk Drive: /dev/hda
  Size: 4310433792 bytes Heads: 255 Sectors per Track: 63 Cylinders: 524
  Name Flags PartType FS Type Size (MB)
  ------------------------------------------------------------------------------
  hda1 Primary Win95 FAT32 1135.09
  hda4 Primary Minix / old Linux 32.91
  hda5 Logical FAT16 106.93
  hda6 Logical Linux swap 32.91
  hda7 Logical NTFS 1348.95
  hda8 Logical NTFS 575.77
  hda3 Boot Primary Linux ext2 1069.29
  Unusable 8.23
  [Bootable][ Delete ][Help] [Maximize][ Print][Quit][Type][ Units][ Write][Toggle bootable flag of the current partition]
    读者可知该硬盘一共分为7个分区,3个主分区,4个逻辑分区,有8MB空间未使用。Win98操作系统位于主分区hda1,Linux 位于hda3, Minix 位于hda4,逻辑分区hda5-hda8位于扩展分区hda2中。即需要用lilo引导三个操作系统Linix, Minix, Win98。
    下面我们开始逐行分析lilo.conf,见图1。第一行,boot=/dev/hda3,告诉lilo将引导记录写到哪里。该行表明将Linux引导程序写到Linux所在分区/dev/hda3处。如果boot=/dev/hda,则意味着将Linux引导程序写到MBR处。出于兼容性与安全的考虑,我建议大家将其写入Linux所在分区处,并将该分区标记为活动的。毕竟多次向MBR写入,容易造成MBR损坏,那麻烦可就大了。
    在不少的Linux安装过程中,常常直接将Linux引导程序写入MBR,如果您希望改为我所推荐的方式的话,首先按以上方法修改lilo.conf,运行lilo,再将Linux所在分区标为活动的。重启后,进入dos,运行fdisk /mbr,将MBR中的Linux引导程序清除。这样,就可以从Linux活动分区启动多个操作系统了。
    接下来是prompt命令,其作用是使lilo在引导时显示LILO:提示符,在该提示符下,用户需要输入准备启动的引导映像的名字,按TAB键列出所有供选择的引导映像的名字。
  Timeout=30通知lilo选择缺省引导映像之前等待30毫秒(3秒)。
  default=w 定义将要引导的缺省操作系统。如果没有该语句,则缺省引导第一个数据块。
  image=/boot/vmlinuz-2.2.12-20定义引导Linux的内核映像文件,即位于/boot下的vmlinuz-2.2.12-20。
  label=l定义所在数据块的名称,在启动选择多操作系统时,用户应输入的内容。
  read-only定义根文件系统挂装为只读属性。
  root=/dev/hda3告诉lilo Linux的内核映像文件在哪个硬盘分区中。
  以上为Linux数据块。
  other=/dev/hda1定义引导Win98操作系统所在主分区。
  label=w同label=l。
  以上为Win98数据块。
  其他数据块与之类似。
  
  启动多操作系统
  细心的读者会发现我遗漏了一行message=/etc/message-file,这是我故意将其放在后面讲的。这里有一个小小的技巧问题。
  一般的,我们写lable=linux, 在启动时输入linux即可启动Linux操作系统,清楚明了但却有点麻烦。写成lable=l,输入倒是简单,却又让人摸不着头脑,不知l是什么。Message命令是在lilo启动时显示一段提示信息。这样就解决了显示与输入的矛盾。我的/etc/message-file的是这样的:l: Red Hat Linux, w: Windows98, m: Minix 2.0, f: Floppy。这样在启动时,屏幕会得到如下显示:
  LILO:
  l: Red Hat Linux, w: Windows98, m: Minix 2.0, f: Floppy
  boot:
  
  输入l或w或m即可启动Linux或 Win98或 Minix操作系统,提示清晰,输入简单。
  在看见lilo.conf文件中最末的数据块中的/dev/fd0,以及message-file中的 f: Floppy时,不知道聪明的你悟到了什么。是的,lilo还支持用启动软盘启机。除了修改lilo.conf文件以外,你在运行lilo前,必须在软驱中插入一张系统盘(启动盘或可引导盘)。这样,重启后就可以通过lilo用软盘启机了。再也不用在BIOS中改来改去了,是不是很方便呢?
  遗憾的是,仅仅只能对软盘这样做,光盘则不行。即还不能用lilo通过光盘启机。
  
  启动新的Linux内核
  作为一个Hacker, 经常要修改内核模块或尝试最新的内核。比较安全的做法是将新内核数据项加入lilo.conf,并保持原有内核不变,这样一旦新内核不能启动,你可通过原内核启动Linux。对lilo.conf的修改也很简单,依葫芦画瓢即可。编译好的新内核vmlinuz-2.2.14-20保存在/boot目录下,依着原内核vmlinuz-2.2.12-20的用法在lilo.conf中添加一个新数据块就可以了。
  如下图所示新内核与原内核的数据块:
  
  image=/boot/vmlinuz-2.2.12-20
  label=l
  read-only 原内核
  root=/dev/hda3
  image=/boot/vmlinuz-2.2.14-20
  label=newl
  read-only 新内核
  root=/dev/hda3
  在lilo启机时,选择newl就可以启动新的内核了。如果新内核不正常,选择l则仍可以使用原内核。
  
  Lilo的使用
  在编辑好lilo.conf后,所要做的就是用lilo将Linux引导程序写入硬盘了。其用法非常简单,运行lilo即可
  重启计算机,终于大功告成。通过lilo,你可以选择硬盘上各个操作系统以及多个不同Linux的内核,当然还可启动软盘上的系统。
  对Linux的lilo的讨论,我想,到此就告一段落了。Lilo的配置选项还很多,但其最重要的内容都浓缩在本文中了。有兴趣的朋友可以自己试着对lilo.conf进行修改,多实践就会有收获。

--------------------------------------------------------------------
 一、LILO的引导机制
  众所周知,计算机的最初启动是由BIOS控制的,在对一些硬件(如:内存、键盘等)初始化之后,它会试图加载硬盘的主引导记录(MBR)或软盘的引导扇区。
  MBR可通过两种方式运行,其一是定位到活动分区并加载相应的引导扇区,然后由引导扇区完成该分区内操作系统的基本组件的加载;其二是直接从一指定分区中加载信息,并通过它装入任一分区的操作系统,诸如LILO、OS/2 boot loader及Partition Magic等引导加载程序都可以配置成这种方式。
  软盘的引导扇区相当于硬盘活动分区的引导扇区,它通常用于装入软盘上的操作系统。
  由此可见,只要把LILO安装在MBR、活动分区或者引导软盘上,就能接管计算机的控制权,然后由LILO完成后继的引导过程。LILO中建有一个引导表地址编码,借此它的引导程序就能定位到Linux的内核文件,这种地址编码既可以按照柱面/磁头/扇区(CHS)模式,又可以采用LBA的线性块号模式,因此,即使对某些SCSI控制程序LILO也能运转良好。
  当LILO定位到配置文件后,经过预引导过程,就显示提示符:
  LILO boot:
  此时,系统允许选择引导不同的操作系统或者不同的内核配置,按Tab键显示可选项列表,然后输入可选项或者直接回车选择缺省配置,如果选择了引导Linux,还可以直接传递参数到系统内核。
  和其他系统的引导加载程序相比,LILO具有更大的灵活性,其引导方式也更丰富多彩。
  ●当LILO被安装在硬盘的MBR、活动分区或引导软盘上时,作为原引导程序的替身,它能引导任一硬盘任一分区上的Linux和其他操作系统;
  ●除了引导扇区,它没有任何隐含文件,也不需要使用特定的分区,它的配置文件可以在任何分区、甚至是存放在与Linux毫不相干的DOS分区的某个子目录下;
  ●它能引导几个不同的内核配置,甚至是几个不同的内核;
  ●它能引导同一机程序上的多个Linux版本;
  ●它能从网络上引导Linux。
  LILO的灵活性使得其配置变得相当复杂,当有多个系统共存时,建议先安装其他操作系统,最后再装Linux,这样,设置LILO对其他系统的引导会相对简单一些。
  
  二、几个重要的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等。
  
  三、LILO典型配置方法
  通常情况下,Linux的安装程序自身就可以完成LILO的安装配置,从而较好地解决多重系统的引导问题,如果系统不能自动完成这种配置,则可以通过手工修改配置文件/etc/lilo.conf来实现不同条件下的引导。
  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为代表名称
  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(504MB)可以定址得到。
  对策:在硬盘的前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
  四、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分区。
  关于LILO值得探讨的问题还有很多,但只要懂得了其内部机制,对更复杂的实际情况也能较圆满地解决。

-------------------------------------------------------------------

当LILO启动完成时,会在屏幕上显示字符串”LILO”,其实这其中的每个字母背后都对应着特定的操作。如果LILO在某个部分出了错,我们就可以根据屏幕上当前出现的字母推断出故障原因。
LILO启动分为两个步骤,由第一个步骤将第二个步骤的代码调入内存。
如果启动LILO时,磁盘出现瞬间的错误,则在“L”字母后会输出一串二进制数字。此时如不中止LILO运行,屏幕上会出现无穷的错误代码输出,这种情况可以重新启动LILO试试。
屏幕上什么都没出现:LILO并未被装载。原因可能是LILO还未被安装或者LILO所在的 分区未被设为active状态。
L : LILO启动了到第一步,但在将第二部分调入内存时出现了错误。两位错误代码指出了错误类型面,具体内容见后面所附的磁盘错误代码。
LI:LILO引导程序的第一部分能够将LILO引导装入程序的第二部分装入,但却不能执行。这可能是因为硬盘参数设置不当或者是因为在移动/boot/boot.b时没有运行map 安装程序。
LIL:引导程序的第二部分已经工作,但它无法从map文件中装载描述符表,原因可能是介质故障或硬盘参数设置不当。
LIL?:第二部分引导程序装入地址不正确,原因:硬盘参数设置不当或移到boot.b文件后未运行map installer。
LIL-:描述符表损坏。原因同上。
LILO:LILO的各个部分均已成功装入。
1010101010 : 分区情况已经改变却没有重新安装LILO。
附:磁盘错误代码。
0x00 "内部错误"。 LILO由扇区读子程序产生,可能是因为被破坏的文件,重建map文件试试看.另一个原因也许是,当使用linear参数时去访问超出1024的柱面。
0x01 "非法命令"。一般不会发生这种问题,如果确实出现了,那就表示LILO访问BIOS不支持的硬盘。在机器间换硬盘的时候最有可能出现这种情况,所以一定要先在BIOS里把硬盘参数设好。
0x02 "没找到地址标记"。通常由硬盘介质故障问题引起,多试几遍看看。
0x03 "写保护错"。 仅在写操作时出现。
0x04 "扇区未找到"。 最典型的原因是硬盘参数设置不正确。
0x06 "激活顺序改变"。 这应该是瞬间的错误,再试一次,问题有可能就解决了。
0x07 "无效的初始化"。 BIOS没有适当地初始化硬盘,如果在BIOS里设置的硬盘参数为auto时可能会产生这种故障,建议在BIOS里将硬盘参数设置为固定的,或热启动一次试试。
0x08 "DMA超出限度"。可以重新启动试试。
0x09 "DMA试图越过64k边界"。 建议忽略COMPACT参数。
0x0C "无效的介质"。小概率事件,重新启动看看。
0x10 "CRC错误"。 检测到硬盘介质故障,建议多启动几次或运行map安装程序把map文件从坏块写到正常的介质上。
0x11 "ECC校正成功"。 读错误发生然后被校正了,但是LILO并不知道这个情况,终止了启动过程。
0x20 "控制器错误"。可能由IDE控制器故障引起。
ox40 "定位失败"。 这可能是介质问题,重新启动试试。
0x80 "磁盘超时"。 磁盘或驱动器没有准备好。
0xBB "BIOS错误"。 由BIOS参数引起,发生概率极小,如果反复发生,则考虑移去COMPACT参数或加上/取消LINEAR参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值