进行到这里,你已经有一个 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/devLILO 需要一份它的 boot loader 的 copy , boot.b ,你可以从你的硬盘得到它。它通常是放在 /boot 目录内。
cp /boot/boot.b /mnt/boot最后,随附你的 kernel , copy 你在上一节所编写的 LILO 组态档。它们两者可以被放在根目录下。
cp bdlilo.conf KERNEL /mntLILO 所需的每一项现在都在 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 挪为紧急使用之前,请记得先测试它 !如果你的成品不能执行,请继续读下去。