用SYSLINUX或ISOLINUX製作启动随身碟或光碟 SYSLINUX/ISOLINUX 是专门用来引导可移动介质的轻量级引导程式,因为这样的介质通常不会固定只针对一种硬体。我们主要介绍以下ISOLINUX 引导安装程式。ISOLINUX其实是一个简单的Linux系统。
关于isolinux
以前我们很多启动盘採用的是loadlin引导linux核心的模式进行的(比如早期的slackware)。也就是採用win98的dos启动,然后通过loadlin工具引导我们的自己的linux核心,解开我们的安装档案系统。
但是,随着我们接触的硬体机型多样化,目前部分新设备不能採用dos(或win98)引导。
这个时候很多人会採用syslinux来製作启动盘,但是syslinux一般都需要能够将核心和档案系统放到一张软碟上的,如果我们的档案系统很大,又不能裁减,那可就惨了。或者说想在光碟启动的时候选择多个核心/档案系统,syslinux就比较麻烦了。
引导程式
概述
任何一个作业系统在任何一个硬体平台上的运行都需要一个引导的过程,即,初始化软体环境、把核心从存储介质放到记忆体当中去,并开始运行。当然对于某些简单软硬体系统,这个过程可能及其简单,而对于 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 放入记忆体。
用 SYSLINUX/ISOLINUX 引导软碟和光碟
上文已经说过了,SYSLINUX/ISOLINUX 是专门用来引导可移动介质的轻量级引导程式,因为这样的介质通常不会固定只针对一种硬体,initrd 当然是 SYSLINUX/ISOLINUX 必须支持的功能了。这两种引导程式其实是一样的,没有多大区别,只是放在不同的设备的引导区罢了。
3.1 配置 SYSLINUX/ISOLINUX
对于这两种引导程式,都会有一段引导代码,写入引导代码的时候,还同时需要一个配置档案: syslinux.cfg/isolinux.cfg,同样,这两个档案也是一样的,唯一的区别在于档案名称,其各个栏位的写法如下:
DISPLAY xxx.txt
这指定了一个档案名称,会在启动的时候显示的内容,该档案甚至可以包含一个 RLE 编码的图形档案,也就是大家在安装光碟启动时看到的那个;不过这个栏位不甚重要,我们就略过了。
DEFAULT linux
指定 label 是 linux 的启动选项为预设,当然也可以是别的。
LABEL linux
kernel vmlinuz
append initrd=initrd26.gz ramdisk_size=1000000 vga=791
这就是一个启动描述,前面的 label 大家都认识了,之后分别是指定 kernel 和核心参数,其中重要的参数就是 initrd= 指定 initrd 的档案和 ramdisk_size= 指定 initrd 的尺寸上限。其余的核心参数还可能有很多,不过这里的参数我们一般都可以抄过来。这样的启动选项描述是可以有若干个的。
PROMPT=1
这是说,向用户提示输入选择,直接回车就是预设选项了
TIMEOUT=0
没有时间限制,当然也可以指定一定时间之后自动进入预设选项。
好了,就这幺多,如果你会用 LILO 的话,用这个一定得心应手,说实话 grub 也差不了太多。
3.2 安装 SYSLINUX/ISOLINUX
配置档案写完了,已经进入实质阶段,这里,两种引导程式还是略有差别的,首先介绍SYSLINUX:
首先格式化引导介质为 FAT16 格式 (软碟似乎应该是 FAT12),我们的例子里面是 U 盘,
mkdosfs -F16 -I /dev/sdX #原百科命令最后面的sda,你不怕硬碟没法启动就用sda!
我们是操作整个 U 盘,而不是里面的唯一分区,这种情况不是很多见,只是手上的 U 盘比较特殊,大部分情况下,我们也可以
mkdosfs -F16 /dev/sdX1
然后挂在该 U 盘,放入我们的 syslinux.cfg 以及 kernel 和 initrd.gz,还有其他启动所需要的东东,之后 umount 该 U 盘。
* 执行下面操作之前,必须 umount U 盘!*
然后写引导区:
syslinux /dev/sdX (或 syslinux /dev/sdX1,如果是格式化的 /dev/sdX1 的话)
至此就完成了。
对于光碟,同样不複杂,我们用 ISOLINUX:
在準备製作 ISO 的目录里添加一个子目录,比如 boot/isolinux/ ,然后放入 isolinux.cfg 和一个对所有光碟都一样的 isolinux 提供的引导介质 isolinux.bin,当然还要放入相应的 kernel, initrd 等等,然后,製作 iso 的时候要使用 -b 参数:
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/ ,这都是约定俗成的,你完全可以用自己的。这里的路径都是相对于光碟的根的,而和製作光碟时的工作目录没有关係。
至此,你也会用 SYSLINUX/ISOLINUX 了。 :)
实战
-四、实战 -- damn small linux + debian installer, 2 in 1 usb disk
1 下载 di 的 hd-image 里的 kernel image 和 initrd,放入 U 盘,同时把 businesscard iso 也放进去,从 iso 里找到 isolinux.cfg,记下里面的启设定
2 下载 dsl,把 KNOPPIX 目录搬到我们的 U 盘里,把 boot/isolinux/ 里面的 kernel image 和 initrd 也放入 U 盘的根目录,这时,U 盘根目录里同时有二者的启动档案了,也记住 dsl 里面的 isolinux.cfg 的启动选项。
3 以其中一个的 isolinux.cfg 为基础,加入另一个的启动参数,注意 label 命名不要冲突了就可以了。
4 umount 随身碟,然后对 U 盘运行 syslinux,写引导区,大功告成。
如前面帖子说过,dsl 的 initrd 之中,只搜寻 /dev/sda[1-9] 而不搜寻
/dev/sda,所以,如果如果像我们一样被迫用 /dev/sda 的话,就不得不修改一下 dsl 的 initrd 里面的 linuxrc 了,除此之外,没有什幺其它值得大书特书的了。
Enjoy it!