6. 放在一起:制作软盘

此时,您已经有了一个内核和一个压缩的根文件系统。如果您要制作启动/根磁盘,请检查它们的大小,确保它们都能放在一张磁盘上。如果您要制作两张磁盘的启动+根磁盘集,请检查根文件系统,确保它能放在一张磁盘上。

您应该决定是否使用 LILO 来引导启动盘内核。另一种方法是将内核直接复制到软盘,并在不使用 LILO 的情况下启动。使用 LILO 的优点是它使您能够向内核提供一些参数,这些参数可能是初始化您的硬件所必需的(检查文件/etc/lilo.conf在您的系统上。如果它存在并且有一行类似 ``append=...'',您可能需要此功能)。使用 LILO 的缺点是构建启动盘更加复杂,并且占用稍微更多的空间。您将必须设置一个小型的独立文件系统,我们称之为内核文件系统,您将在其中传输内核和 LILO 需要的其他一些文件。

如果您要使用 LILO,请继续阅读;如果您要直接传输内核,请跳到第 6.2 节

6.1. 使用 LILO 传输内核

首先,确保您拥有最新版本的 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 的用户文档。您可能还需要从硬盘的append=...行添加到此文件中。/etc/lilo.conf文件。

将此文件另存为bdlilo.conf.

现在您必须创建一个小型文件系统,我们称之为内核文件系统,以区别于根文件系统。

首先,计算出文件系统应该有多大。取您的内核的大小(以块为单位)(由 ``ls -s KERNEL'' 显示的大小)并加上 50。50 块大约是 inodes 和其他文件所需的空间。如果您愿意,可以精确计算此数字,或者直接使用 50。如果您正在创建双磁盘集,您不妨高估空间,因为第一张磁盘仅用于内核。KERNEL_BLOCKS.

将软盘放入驱动器(为简单起见,我们假设/dev/fd0),并在其上创建一个 ext2 内核文件系统
        mke2fs -N 24 -m 0 /dev/fd0 KERNEL_BLOCKS
``-N 24'' 指定 24 个 inodes,这应该是此文件系统所需的所有 inodes。接下来,挂载文件系统,删除lost+found目录,并创建devboot目录供 LILO 使用
        mount -o dev /dev/fd0 /mnt
        rm -rf /mnt/lost+found
        mkdir /mnt/{boot,dev}

接下来,创建设备/dev/null/dev/fd0。与其查找设备号,不如使用以下命令从您的硬盘复制它们-R:
        cp -R /dev/{null,fd0} /mnt/dev
LILO 需要其引导加载程序boot.b的副本,您可以从您的硬盘获取。它通常保存在/boot目录中。
        cp /boot/boot.b /mnt/boot
最后,复制您在上一节中创建的 LILO 配置文件,以及您的内核。两者都可以放在根目录中
        cp bdlilo.conf KERNEL /mnt
LILO 需要的一切现在都在内核文件系统上,因此您已准备好运行它。LILO 的-r标志用于将引导加载程序安装到其他根目录
        lilo -v -C bdlilo.conf -r /mnt
LILO 应该无错误运行,之后内核文件系统应该看起来像这样
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           

如果文件大小与您的略有不同,请不要担心。

现在将软盘留在驱动器中,然后转到第 6.3 节

6.2. 不使用 LILO 传输内核

如果您使用 LILO,请使用 dd 将内核传输到启动盘
        % dd if=KERNEL of=/dev/fd0 bs=1k
        353+1 records in
        353+1 records out
在此示例中,dd 写入了 353 个完整记录 + 1 个部分记录,因此内核占用了软盘的前 354 个块。将此数字称为KERNEL_BLOCKS并记住它,以便在下一节中使用。

最后,将根设备设置为软盘本身,然后将根设置为以读/写方式加载
        rdev /dev/fd0 /dev/fd0
        rdev -R /dev/fd0 0
请注意在第二个 rdev 命令中使用大写-R。在第二个 rdev 命令中使用大写

6.3. 设置 ramdisk 字

在内核映像内部是ramdisk 字,它指定了根文件系统的位置以及其他选项。可以使用 rdev 命令访问和设置该字,其内容解释如下

位字段描述
0-10ramdisk 起始偏移量,以 1024 字节块为单位
11-13未使用
14标志,指示要加载 ramdisk
15标志,指示在加载 rootfs 之前提示

如果设置了位 15,则在启动时,系统将提示您在驱动器中放入新的软盘。这对于双磁盘启动集是必要的。

有两种情况,具体取决于您是构建单张启动/根磁盘还是双张“启动+根”磁盘集。

  1. 如果您正在构建单张磁盘,压缩的根文件系统将放置在内核之后,因此偏移量将是第一个可用块(应该与KERNEL_BLOCKS相同)。位 14 将设置为 1,位 15 将为零。例如,假设您正在构建单张磁盘,并且根文件系统将从块 253(十进制)开始。ramdisk 字值应为 253(十进制),位 14 设置为 1,位 15 设置为 0。要计算该值,您可以简单地将十进制值相加。253 + (2^14) = 253 + 16384 = 16637。如果您不太明白这个数字的来源,请将其插入科学计算器并将其转换为二进制,

  2. 如果您正在构建双磁盘集,则根文件系统将从第二张磁盘的块零开始,因此偏移量将为零。位 14 将设置为 1,位 15 将为 1。在这种情况下,十进制值将为 2^14 + 2^15 = 49152。

在仔细计算出 ramdisk 字的值之后,使用 rdev -r 设置它。务必使用十进制值。如果您使用了 LILO,则此处 rdev 的参数应该是已挂载的内核路径,例如/mnt/vmlinuz;如果您使用 dd 复制了内核,请改用软盘设备名称(例如,/dev/fd0).
        rdev -r KERNEL_OR_FLOPPY_DRIVE  VALUE

如果您使用了 LILO,请立即卸载软盘。

Important

不要相信 rdev/ramsize 手册页中关于 ramdisk 大小的说法。该手册页已过时。从内核 2.0 左右开始,ramdisk 字不再决定 ramdisk 大小;而是根据第 6.3 节开头的表格解释该字。有关详细说明,请参阅文档文件ramdisk.txthttp://www.linuxhq.com/kernel/v2.4/doc/ramdisk.txt.html

6.4. 传输根文件系统

最后一步是传输根文件系统。

恭喜,您完成了!

Important

您应该始终在将启动盘放在一边以备紧急情况之前对其进行测试。如果启动失败,请继续阅读。