热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

完全解析lilo启动引导器的工作原理

文章标题:完全解析lilo启动引导器的工作原理。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类


  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
    为引导配置设置

    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重新安装。

 


推荐阅读
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了新款奇骏的两个让人上瘾的功能,分别是智能互联系统和BOSE音响。通过对新款奇骏的配置和功能进行评测,探讨了这两个新增功能的使用体验和优势。此外,还介绍了新款奇骏的其他配置和改进,如增加的座椅和驾驶辅助系统,以及内饰的舒适性提升。对于喜欢音响的消费者来说,BOSE音响的升级也是一个亮点。最后,文章提到了BOSE音响的数字还原能力,以及7座版无法配备BOSE音响的原因。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
author-avatar
刘丹小宝0
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有