进行到这里,你已经有一个 kernel 与一个压缩的 root filesystem 。如果你正在制作一张 boot/root 磁片,请检查它们的 size ,以确定它们都能放在同一张磁片上。如果你正在制作一套两张磁片的 boot + root 磁片组。请检查 root filesystem 以确定它能放在一张磁片上。
你应该决定是否使用 LILO 以启动 bootdisk的 kernel 。替代的方法是直接把 kernel copy 到磁片上,然後不使用 LILO 开机。使用 LILO 的好处在於让你能够提供一些参数给 kernel ,这些参数对初始化硬体来说可能是必要的(请检查你系统上的 /etc/lilo.conf 档。如果这个档存在,而且有一行像``append=...'',你可能需要这个特点 (feature))。使用 LILO 的缺点在於建造 bootdisk 变得更为复杂,并且占用稍嫌较多的空间。你将必须设定一个小型而独立的 filesystem ,我们称之为 kernel filesystem,在其中你传送 kernel 以及一些 LILO 所需的其它档案。
如果你将要使用 LILO ,请继续读下去;如果你要直接传送 kernel ,先跳过此,直接到 Without using LILO 这一节。
你所必须做的第一件事是为 LILO 编写一个小型的组态档。这个档看起来像这样:
boot =/dev/fd0
install =/boot/boot.b
map =/boot/map
read-write
backup =/dev/null
compact
image =KERNEL
label =Bootdisk
root =/dev/fd0
append=... 到这个组态档中。
把这个组态档存成 bdlilo.conf 。
现在你必须制作一个小型的档案系统,我们称之为 kernel filesystem ,有别於 root filesystem 。
首先,指出这个 filesystem 应该会有多大。用 blocks 计算你 kernel 的 size (这个 size 用 ``ls -l KERNEL'' 显示出来,是被 1024 所除并强迫进位),然後加 50 。这个 50 blocks 是估计的空间,为 inodes 与其它档案所需。如果你想要,你可以精确地计算这个数字,或是就用 50 就好了。如果你正在制作两张磁片的磁片组,你会高估这个空间,因为无论如何第一张磁片只给 kernel 使用。我们称这个数字会 KERNEL_BLOCKS 。
请把软碟片放入软碟机 (为求简便,我们假设是 /dev/fd0),然後在其上制作 ext2 kernel filesystem 。
mke2fs -i 8192 -m 0 /dev/fd0 KERNEL_BLOCKS
``-i 8192'' 指定我们想要每 8192 bytes 一个 node 。接下来, mount 这个 filesystem ,移除 lost+found 目录,然後为 LILO 造出 dev 与 boot 这两个目录:
mount /dev/fd0 /mnt
rm -rf /mnt/lost+found
mkdir /mnt/{boot,dev}
再来,造出设备档 /dev/null 与 /dev/fd0 。不用寻找设备号码,你只要从你的硬碟上用 -R copy它们:
cp -R /dev/{null,fd0} /mnt/dev
LILO 需要一份它的 boot loader 的 copy , boot.b ,你可以从你的硬碟得到它。它通常是放在 /boot 目录内。
cp /boot/boot.b /mnt/boot
最後,随附你的 kernel , copy 你在上一节所编写的 LILO 组态档。它们两者可以被放在根目录下。
cp bdlilo.conf KERNEL /mnt
LILO 所需的每一项现在都在 kernel filesystem上,所以你已准备好去执行它。 LILO 的 -r 旗号(flag)被用作安装 boot loader 在某个其它的 root 上:
lilo -v -C bdlilo.conf -r /mnt
LILO 应该可以在无错的情况下执行,在此之後,你可以看看你的 kernel filesystem ,应该长得像这样:
total 361 1 -rw-r--r-- 1 root root 176 Jan 10 07:22 bdlilo.conf 1 drwxr-xr-x 2 root root 1024 Jan 10 07:23 boot/ 1 drwxr-xr-x 2 root root 1024 Jan 10 07:22 dev/ 358 -rw-r--r-- 1 root root 362707 Jan 10 07:23 vmlinuz boot: total 8 4 -rw-r--r-- 1 root root 3708 Jan 10 07:22 boot.b 4 -rw------- 1 root root 3584 Jan 10 07:23 map dev: total 0 0 brw-r----- 1 root root 2, 0 Jan 10 07:22 fd0 0 crw-r--r-- 1 root root 1, 3 Jan 10 07:22 null
如果档案 size 和你自己的 filesystem 有稍微不同,请不用担心。
现在请把磁片留在软碟机内,然後前进到 Setting the ramdisk word 这一节。
如果你 不 使用LILO,那麽就用 dd 指令来传送 kernel 给 bootdisk :
% dd if=KERNEL of=/dev/fd0 bs=1k
353+1 records in
353+1 records out
在这个例子中, dd 写入了 353 个完整记录(records) + 1个partial record ,所以 kernel 占用了 354 个软碟片的 blocks 。这个数字称为 KERNEL_BLOCKS ,请记得它,这个数字要给下一节使用。
最後,请设定 root device 为软碟片自己,然後再设定 root 要被载入成 read/write :
rdev /dev/fd0 /dev/fd0
rdev -R /dev/fd0 0
在第二个 rdev 指令中,请小心地使用 -R 。
在 kernel image内的是 ramdisk word ,它伴随其它选项,指定了 root filesystem 应该在哪里被找到。这个 word 会被以 rdev 指令,来进行存取与设定,而它的内容被解释如下:
bits 0-10: Offset to start of ramdisk, in 1024 byte blocks
bits 11-13: unused
bit 14: Flag indicating that ramdisk is to be loaded
bit 15: Flag indicating to prompt before loading rootfs
如果 bit 15 被设定,在开机时 (boot-up) ,会提示你把一张新的软碟片放入软碟机中。这对一套双磁片的开机磁片组来说是必要的。
依据你是建造一张单一的 boot/root 磁片,还是两张 "boot + root" 的磁片组,这里会产生两种情况。
KERNEL_BLOCKS 相等) 。 Bit 14 会被设定为 1 ,而 bit 15 会被设定为 0 。
举例来说,假设你正建造一张单一磁片,而 root filesystem 将自 block 253 (10进位)开始。那麽, ramdisk word 值应该是 253 (10进位) , bit 14 设为 1 而 bit 15 设为 0 。要计算这个值,你可以简单地加一加这个 10 进位数字。 253 + (2^14) = 253 + 16384 = 16637 。如果你并不十分了解这个数字从何而来,把这数字放到工程计算机上,然後把它转换为 2 进位,
在仔细地为 ramdisk word 计算後,请用 rdev -r 设定它。请注意要使用 10 进位 值。如果你使用 LILO ,传给 rdev 的引数在此应该是 mounted kernel path ,比如说 /mnt/vmlinuz;如果你用 dd 来 copy kernel ,替换成使用软碟机名称( 比如说 /dev/fd0)。
rdev -r KERNEL_OR_FLOPPY_DRIVE VALUE
如果你使用 LILO ,现在请把磁片 unmount 。
最後一步是要传送 root filesystem 。
dd 指令及其 seek 选项传送它,这会指定要跳过多少个 blocks :
dd if=rootfs.gz of=/dev/fd0 bs=1k seek=KERNEL_BLOCKS
dd if=rootfs.gz of=/dev/fd0 bs=1k
恭喜你,已经完成了!
在把 bootdisk 挪为紧急使用之前,请记得先测试它 !如果你的成品不能执行,请继续读下去。