syslinux简介 - syslinux制作启动U盘 Unknown 2008/10/18

| |

一、引导程序概述

任何一个操作系统在任何一个硬件平台上的运行都需要一个引导的过程,即,初始化软件环境、把内核从存储介质放到内存当中去,并开始运行。当然对于某些简单软硬件系统,这个过程可能及其简单,而对于 PC 就要略微复杂一些了。

PC 的引导程序上承 BIOS,下接内核的初始化代码,虽然开一次机只运行一次后就不留痕迹了,不过还是相当重要的。所有的引导程序都在做类似的事情:

        
  • 驻留在存贮介质的特殊位置可以被 BIOS 启动,或是自己是某一系统的可执行文件,可以被用户显式或隐式在该系统(宿主系统)内启动;
  •     
  • 了解要被启动的必要启动文件的位置,包括系统内核、ramdisk 等,并把它们读取出来、装载到内存之中;
  •     
  • 构造环境、运行操作系统的内核,自己则就此退出历史舞台。

历史上,用于 Linux 的最著名的引导程序莫过于 LILO 和 Grub 了,作为通用的引导程序,二者用途广泛。但对于一些特殊的场合,譬如引导程序可利用的空间比较有限的可移动存储介质 (通俗地说,包括光盘、软盘、U盘等),它们有些过于厚重了。这就引出了我们今天的主角 --- SysLinux/ISOLinux。现在,你只要知道他们是引导程序就足够了,接下来,我们还要插入一些废话。

二、initrd

initrd = init ramdisk, 顾名思义,就是在启动时使用的一个内存虚拟磁盘,它是系统广泛的硬件支持性的必需品。

我 们知道,Linux 的驱动程序是内核的一部分,它们提供了硬件向上层的抽象接口,Linux 内核的核心子系统 --- 虚拟文件系统部分的工作强烈依赖于底层硬件驱动程序的支持。在启动过程当中,当某些必备的驱动程序无法使用的时候,比如 EXT2 文件系统、IDE 硬盘适配器等无法工作的时候,系统启动将就此中止,发生所谓的"Kernel Panic'',这也是初学者编译内核最常遇到的困难。

然而,我们当然不能将所有的驱动都编译到内核当中去,因为:

        
  • 我们不能无限制地加大内核的尺寸,这对于系统资源,尤其是引导过程中非常有限的可用存储资源是难以承受的
  •     
  • 我们可以把很多驱动程序编译成模块,随用随加载
  •     
  • 极少数情况,某些模块是相互冲突的,比如 2.4 内核的某些版本之中,reiserfs 和 ext3 两种驱动不能同时被编译到内核当中。

所以,我们只能在内核中放入必要的驱动程序,其余的不那么需要的部分编译成模块放到 /lib/modules/`uname -r`/ 之中,在需要的时候会被加载。

但是,对于具有通用性的内核,是很难论断出哪几种驱动程序才是真正必须的,究竟是 Intel 的 IDE 磁盘控制器还是 AMD/nVidia 的,或是 VIA 的,乃至光纤通道SCSI 磁盘……这真是个很困扰人的问题,没有一个驱动可以在占用绝对少的空间的前提下应付所有的设备。于是,我们退而求其次,寻求一个中间介质 --- ramdisk。

在内核启动前,引导程序首先在内存之中构建一个 ramdisk,成为一个基本文件系统,然后 Linux 内核以此为自己的根文件系统启动,这样的好处是可以不必理会磁盘驱动的问题,只要能驱动 ramdisk 就可以了。

用 ramdisk 启动之后,在 ramdisk 的启动脚本 (一般叫 /linuxrc) 之中,针对硬件尝试 ramdisk 里面的 /lib/modules/`uname -r`/,加载恰当的驱动,这时系统已经具备了切换到硬盘或其他介质上的文件系统的条件了。

机不可失,这时,我们首先加载硬盘或光盘、U盘等启动介质,然后设该介质为根分区,并运行其 init 进程为 1 进程,之后,在 init 脚本中,释放掉 initrd 的空间,这就是借助 initrd 的引导过程。在这个过程之中 引导程序帮我们多做了一件事 --- 构建 ramdisk, 把 initrd 放入内存。

内文分页: [1] [2]
请给这篇日志评个分吧~!

本文评分: 5.9/10 (33 votes)    提示:您还未对本文评分,您可以进行评分并发表您的意见!

加入收藏!

Tags: , , ,
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [注册]