由于软盘启动和光盘启动,都要求内核和启动映象的总空间不能超过一张 1.44M 软盘 的容量。因此在此空间中包含完整的安装程序运行映象是不可能的。所以 1.44M 空间内的 启动映象必须完成的任务就是寻找完整的安装程序运行映象,为了缩小体积,此映象也 做这一件事。
安装程序的主运行环境,由于包含了 python、Xwindow、gtk2、pygtk2、kudzu、 GNU Parted、rpm 等软件,虽然经过裁剪,体积仍然达到 42M。为了支持多光盘安装,在 安装过程中必须能够将第一张光盘弹出,这就必须把安装程序主运行环境装入 ramdisk。 如果不进行压缩,此 ramdisk 就要占用 42M 内存。因此,安装程序主体和安装程序主 运行环境映象使用 cramfs,而不是 ext2。该 cramfs 文件系统的体积约为 16.4M。
但将 cramfs 文件系统映象直接存入 ramdisk 则 linux 内核根本无法加载,所以还 必须将主映象 cramfs 放入一个 ext2 文件系统,把这个含有主映象的 ext2 文件系统 存入 ramdisk,然后以 loop 设备加载 cramfs。为了容纳含有安装程序主体和安装程序 主运行环境的 cramfs 文件系统,此 ext2 文件系统的体积为 18M。
在本文以后的部分,把含有 MagicBooter 的启动映象称为 initrd.gz;把含有安装 程序主体和安装程序主运行环境的 cramfs 文件系统称为 miinitrd.cramfs;把含有 miinitrd.cramfs 的 ext2 文件系统成为 miinitrd。
MagicBooter 在安装程序的运行过程中,还充当 init 进程的角色。事实上它就是以 busybox-0.60.5 中的 init.c 为基础,在解析 /etc/inittab 之前,调用 MagicBooter_main 来搜索完整运行映象、加载然后 pivot_root 进入完整运行映象的。 MagicInstaller/MagicBooter/init.c.patch 的作用就是修改 busybox-0.60.5 的 init.c 使之在解析 /etc/inittab 之前调用 MagicBooter_main。MagicBooter 的运行步骤如下:
启动映象目前只含有一个同 uClibc 静态连接的可执行文件 MagicBooter、一些用于 加载的空目录、以及必要的设备文件。
使用 uClibc,并进行静态连接,是为了缩小体积。由于启动映象中只含有一个可执行 文件,所以没必要使用动态连接库。uClibc 是专为嵌入式系统准备的 libc 库,能够有效 地缩小目标代码的体积。
为了顺利完成搜索任务,MagicBooter 根据配置文件 mb-config.xml 的内容确定搜索 顺序,此文件是 xml 格式的。mb-config.xml的说明在本页面稍后的部分给出。 MagicBooter 还要能够自动猜测硬盘分区中所含文件系统的类型,这一任务通过从 util-linux-2.11z/mount 导入 mount_guess_fstype.[hc]、sundries.[hc]、linux_fs.h 并加以适当修改(为了使其通过编译,必须删掉其中某些于猜测文件系统类型无关, 又会带来不必要的倚赖关系的代码)来完成。
因此 MagicBooter 除了 uClibc 之外,还要和 busybox-0.60.5 的 libbb.a、init.o (由加了 MagicInstaller/MagicBooter/init.c.patch 之后的 init.c 编译而成的)、 mxml-1.0 的 libmxml.a 相连接。MagicInstaller/MagicBooter/SConscript 能够自动 完成有关编译 MagicBooter 的所有操作。有关 MagicBooter 的创建目标的倚赖关系为 (此处的路径均相对于 MagicInstaller/MagicBooter):
除了可执行文件,启动映象中的文件系统结构是由 MagicInstaller/mkmbsys.py 建立 的,它的结构如下:
使用配置文件 mb-config.xml 的目的是为了方便用户控制 MagicBooter 搜索硬盘、 光盘的顺序。这给用户以更大的灵活性。但是由于时间的关系,对定制的支持尚不充分。 目前 MagicBooter 仅在 initrd.gz 的根目录下探测是否有 mb-config.xml 存在,若有 则使用此文件。若 initrd.gz 的根目录下没有 mb-config.xml,则使用内置的 mb-config.xml。
内置 mb-config.xml 的内容如下:
<?xml version="1.0"?> <MagicBooter> <probes> <probe pathspec="/">usb-storage</probe> <probe pathspec="/miimages">ide-cdrom</probe> <probe>ide-harddisk</probe> <probe pathspec="/miimages">scsi-cdrom</probe> <probe>scsi-harddisk</probe> </probes> <pathspec> <path>/boot</path> <path>/usr/share/MagicInstaller</path> <path>/</path> <path>/tmp</path> </pathspec> </MagicBooter>
mb-config.xml 必须为合法的 xml 文档,其根节点应为 MagicBooter。MagicBooter 可能的子节点有:
若存储设备搜索条目不是以上任何一个字符串,则将此条目直接看做设备文件名。 例如 hdc、hda5 等等。