Next Previous Contents

6. 把它们放在一起:制作磁片(组) -- Putting them together: Making the diskette(s)

进行到这里,你已经有一个 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 这一节。

6.1 用 LILO 传送 kernel -- Transferring the kernel with 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

关于这些参数的说明请看 LILO's user documentation 。你或许也会想从你硬盘上的 /etc/lilo.conf 档,加入一行 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 这一节。

6.2 不使用 LILO 来传送 kernel -- Transferring the kernel without LILO

如果你 使用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

6.3 设定ramdisk -- Setting the ramdisk word

在 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" 的磁片组,这里会产生两种情况。

  1. 如果你是建造一张单一磁片,压缩的 root filesystem 会被放置在 kernel 之后,所以 offset 会是第一块 free block (这个值应该会与 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 进位,
  2. 如果你建造的是一套双磁片组,那么 root filesystem 将自第二张磁片的 block 0 开始,所以 offset 为 0 。 Bit 14 设为 1 而 bit 15 设为 1 。在这个情况下, 10 进位值是 2^14 + 2^15 = 49152 。

在仔细地为 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 。

6.4 传送root filesystem -- Transferring the root filesystem

最后一步是要传送 root filesystem 。

恭喜你,已经完成了!

在把 bootdisk 挪为紧急使用之前,请记得先测试它 !如果你的成品不能执行,请继续读下去。


Next Previous Contents