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

PC的引导程序上承BIOS,下接内核的初始化代码,虽然开一次机只运行一次后就不留痕迹了,不过还是相当重要的。所有的引导程序都在做类似的事情:驻留在存贮介质的特殊位置可以被BIOS启动,或是自己是某一系统的可执行文件,可以被用户显式或隐式在该系统(宿主系统)内启动

构造环境、运行操作系统的内核,自己则就此退出历史舞台。

历史上,用于Linux的最著名的引导程序莫过于LILO和Grub了,作为通用的引导程序,二者用途广泛,但对于一些特殊的场合,譬如引导程序可利用的空间比较有限的可移动存储介质 (通俗地说,包括光盘、软盘、u 盘等),它们有些过于厚重了,这就引出了我们今天的主角SYSLINUX/ISOLINUX

SYSLINUX/ISOLINUX是专门用来引导可移动介质的轻量级引导程序,因为这样的介质通常不会固定只针对一种硬件。我们主要介绍以下ISOLINUX 引导安装程序。ISOLINUX其实是一个简单的Linux系统。其构造很简单。主要包括以下几个方面的内容:

引导程序isolinux.bin

这个文件是ISOLINUX的引导文件,相当于Linux系统中的grub程序一样,在系统启动时,先加载isolinux.bin来启动系统,当isolinux.bin启动以后,会根据下面的配置文件isolinux.cfg来选择不同的启动选项来启动系统。这个文件是一个二进制文件,在编译isolinux时可以得到,在这里不做过多讲述。

配置引导项文件isolinux.cfg

这个文件是ISOLINUX启动的配置文件,有了这个文件,引导程序isolinux.bin在引导时才会根据该配置文件的配置内容的不同,而选择不同的引导项来启动系统。

isolinux.cfg中的配置项有很多,用户可以根据自己的需求来选择性的加入跟自己相关的配置项即可。但是下面的这些配置项是必须要有的:

default linux指定 label 是 linux 的启动选项为缺省,当然也可以是别的。

label linux
kernel vmlinuz
append initrd=initrd26.gz ramdisk_size=1000000 vga=791

这就是一个启动描述项,前面的label是指Linux系统启动时的引导选项。相当于grub中的title。kernel指定了启动时的内核。initrd指定initrd的文件和ramdisk_size指定initrd的尺寸上限。其余的内核参数还可能有很多。其实Linux内核中启动的所有参数,在这里都是可以加入的。

prompt=1这是说,向用户提示输入选择,直接回车就是缺省选项了。当然,如果使其等于0则,不向用户提示输入选择。

timeout=0没有时间限制,当然也可以指定一定时间之后自动进入缺省选项。这个时间是秒数的10倍。例如,如果要等待30秒进入,则应该在这里输入timeout=300。

这些是系统引导时的必有选项,当然,有些选项是可以没有的。下面的这些选项可以没有:

display xxx.txt这指定了一个文件名,会在启动的时候显示的内容,该文件甚至可以包含一个 RLE 编码的图形文件,也就是大家在安装光盘启动时看到的那个;不过这个字段不甚重要,我们就略过了。

gfxboot bootlogo 这指定了启动时的图形界面。一般的Linux系统安装盘中都会加入此项,但是在一些特殊需求下,是不需要用图形界面的,而需要字符模式。具体如何制作图形启动模式,如何制作字符启动模式,需要根据选择的内核选项以及设置选项有关系。这将在下面进行详细介绍。

include ×××这是引入一个已经写好的配置选项文件到配置文件中。这在执行时,会将引入的文件中的全部内容给添加到此文件中,形成一个零时的配置文件来启动系统。

基本的配置项就这么多,当然还有很多的配置项,还是需要用户去参考相关的权威手册来一一了解。

系统启动内核程序

ISOLINUX系统在使用isolinux.bin文件引导完成以后,就会调用一个启动内核来启动一个简单的Linux系统。实际上无论是安装,还是修复Linux系统都需要一个简单的Linux系统来调用相应的程序来完成。在启动盘中使用的Linux内核程序跟普通的Linux系统内核是完全一致的,这里比较特殊的是其initrd镜像文件。该文件实际就是一个最小化的Linux系统。里面包含了shell,mount,fdisk之外,主要要包含Linux系统下各种常用的基本驱动。尤其是硬盘驱动,键盘鼠标驱动。如果没有这些驱动,那么系统将无法找到硬盘,导致系统无法正常启动。

initrd文件特殊,就特殊在该文件中不仅要包含上述的这些文件,还需要包含一些跟该光盘功能相关的文件。例如,如果要进行安装,那么简单的格式化命令也必须要有的。除了这些,为了让制作的iso文件被大部分PC 所使用,所以必须要包含各种驱动在里面。

initrd文件很好制作,可以将Linux系统启动时的initrd文件作为一个基本文件,在里面修改即可。如果有需要添加的内容,直接将linux系统中的相应文件拷贝进去就可以了。另外,initrd下面的启动脚本是init文件,建议根据自己的需求修改该文件,该文件是一个用shell写的脚本。在Linux系统启动时,加载完成内核以后,就开始调用该脚本了,所以有什么需要启动的,都可以在该脚本中添加。甚至可以将该脚本作为一个自己安装,修复等的基本脚本来做。但是建议不要如此,因为这样做会不易调试。建议将系统启动相关的内容放置在这里执行,而将自己的脚本放置在可执行目录下[bin/sbin等],在init脚本中调用该脚本再执行。

举例说明

有了上面的这几步,基本上就对ISOLinux了解了。接下来的工作就是要靠自己的本事和自己的需求来调整initrd,以及iso目录下的内容了。

我在这里主要介绍一下,几种启动界面的制作:

字符模式启动界面

字符模式的启动界面,使用的是menu.c32内核做为启动内核。menu.c32文件由ISOLINUX包提供。可以直接从ISOLINUX包中编译产生。

有了该文件,我们只需要对isolinux.cfg文件进行修改一下即可。具体的修改可以参照下面的配置项:

default menu.c32
prompt 0
menu title My Distro Installer
timeout 600
f1 help.txt
f2 version.txt
label bls
menu label Normal install
menu default
kernel vmlinuz
append initrd=cpio.gz rdinit=/init
label bad
menu label Bad hardware install
kernel vmlinuz
append initrd=cpio2.gz badhardware rdinit=/init

可以看的出来,这里的主要调整是,调整default选项,修改其为menu.c32文件。因为如此是指定,默认使用menu.c32引导。接下来就是几个menu选项的加入。这几个选项的主要目的是设置启动的选择项。在命名时建议能够设置成容易识别的名称。

另外,注意menu default选项是指定,默认从那项启动。

当然,使用menu时,还可以加入下面的一些参数来设置选项窗口的宽高比:

MENU WIDTH 80/*设置宽度*/
MENU MARGIN 10
MENU ROWS 12/*设置行数*/
MENU TABMSGROW 18
MENU CMDLINEROW 12
MENU ENDROW 24
MENU TIMEOUTROW 20

这几个选项可以添加,也可以不添加,可以均添加,也可以一个都不添加。设置很方便。

此种启动,都是字符模式,而且是用ascii码绘制出来的。其优点是占用内存小,启动快。缺点是界面单调。

使用vesamenu制作启动界面

使用vesamenu启动的方法与使用menu的使用方法基本是一致的。所不同的是default的引导项不一样,此种模式下,default的启动项要设置成vesamenu。

另外,vesamenu的默认背景色是灰色,如果想更换背景图片,可以加入MENU BACKGROUND os102.png来更换背景图片。但是值得注意的是背景图片不能够制作的过于绚丽,因为该图片如果比较绚丽,则无法被正常加载。

这种方法的有点在于启动快,而且可以制作一个图形启动界面。缺点是无法制作一个比较绚丽的启动界面。

使用bootlogo文件制作启动界面

使用bootlogo制作启动界面的方法是,先制作一个比较绚丽的bootlogo文件。这个文件是一个加入图片的二进制文件,具体如何制作,还需要高手能够帮忙指点一下,小弟还不是很清楚。另外,只需要在isolinux.cfg文件中加入gfxboot bootlogo选项即可。

制作ISO镜像文件

配置文件写完了,现在进入实质阶段。

在准备制作ISO的目录里添加一个子目录,比如boot/isolinux/,然后放入isolinux.cfg和一个对所有光盘都一样的isolinux提供的引导介质isolinux.bin,当然还要放入相应的kernel,initrd等我们需要在引导时调用到的文件,然后制作iso的时候要使用-b参数,来指明要使用isolinux.bin文件启动:

mkisofs -o output.iso /
-b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat /
-no-emul-boot -boot-load-size 4 -boot-info-table /
for-iso-dir/

最后的参数就是指定的光盘的目录了,-c参数的那个文件是自动生成的,不用太担心,其余参数都是固定的。事实上,也常常有人用isolinux/而不是 boot/isolinux/,这都是约定俗成的,你完全可以用自己的。这里的路径都是相对于光盘的根的,而和制作光盘时的工作目录没有关系。

至此,整个系统的启动和制作过程就已经完成了。可以说有了这些知识,就可以设计一个简单的启动光盘,至于光盘的功能,需要用户根据自己的需求来修改和调整!