Maragda:从 CD 运行 Linux
这里描述的项目进一步证明了 Linux 是一个强大且通用的系统。
我的学院有几辆手推车,上面装有一台电脑 (PC) 和一台录像机,两者都连接到一台视频投影仪。它们有很多用户,因此很难保持它们正常工作。对于电脑来说尤其如此;你永远无法确定在硬盘上会找到什么软件。
我决定在入门编程课程中使用投影仪,向我的学生展示 C 程序的源代码以及如何逐步运行它们。我当然想使用 Linux 及其编程工具,以便我的学生了解 Windows 不是唯一的选择。
在这种情况下,我得出的结论是,我需要某种便携式 Linux 系统,而且我不想在教室里使用我的笔记本电脑。
我的第一个想法是尝试在用于并行端口的 Iomega Zip 250MB 驱动器上安装 Linux。经过几天的工作,我成功了。它需要一张软盘来启动系统,运行速度还不错。然后我重复了这项任务,这次是将 Linux 安装在包含在用于并行端口的 IDE 盒适配器中的 IDE 硬盘上。这种配置消除了 250MB 磁盘空间的限制,并加快了 Linux 的运行速度。
从这些任务中获得的经验,我问自己,为什么不从 CD-ROM 运行 Linux 呢?这将是方便且更易于使用的。此外,学生可以使用它开始学习 Linux,而无需将其安装在自己的计算机上。于是 Maragda 诞生了。
最终产品是可引导的 CD-ROM,因此您必须配置 BIOS 以从 CD 驱动器启动。如果您的 BIOS 不支持此功能,则有一个解决方案:一张可引导的软盘,它也可以从 CD 引导 Linux。事实上,软盘的原始映像是 CD 包含的用于自引导的内容。
CD 上的 Linux 软件是从 Red Hat 6.2 发行版安装的,我准备了两种配置。第一种是完整安装。它包含基本系统、打印机支持、X Window 系统、VGA16 和帧缓冲 X 服务器、GNOME(或者您可以编辑 .xinitrc 并取消注释您最喜欢的窗口管理器的行)、网络服务器工作站、创作和发布工具(LaTeX 等)、Emacs、开发工具(make、egcs 等)、DOS/Windows 连接、邮件、WWW 和新闻工具以及其他软件包,例如 rhide、ssh 支持和 JDK 1.2。
第二种配置,我称之为 Maragda 教学版,仅配备了基本系统和 X(用于 fvwm2)的部分软件包,以及完整的开发工具和其他工具,例如 gv 和 rhide。
完整版 Maragda 至少需要 64MB 的 RAM,而 Maragda 教学版(及其工具)仅需 32MB 即可运行。完整版 Maragda 还有第二种配置,它在 32MB 内存下运行,但不包括 Emacs 或 Netscape 等需要更多内存的工具的空间。
在这两种情况下,都使用了相同的内核。它是 2.2.14 版本,它支持(除其他外)网络、帧缓冲设备、环回设备、RAM 磁盘和初始 RAM 磁盘。
任何旨在实现便携性的系统的一个问题是如何适应不同的硬件。至少必须配置鼠标和视频 (X),然后是密码、网络身份等。在 Maragda 的情况下,应该记住,没有更改可以在一个会话中幸存下来,因为 CD 上的文件是只读的。
完整版 Maragda 默认配置为支持 PS2 鼠标和用于视频的帧缓冲设备,深度为 32。网络使用驱动程序 3c59x(3Com 网卡),身份为 maragda.gnd.upv.es (192.168.0.1)。
但是,完整版 Maragda 有一个开放的入口,允许您自行决定配置。在主文件系统挂载后,启动过程会停止并要求提供 ext2 格式化的软盘。软盘上的每个文件都将在程序和守护进程启动之前合并到系统中。
软盘上应该有哪些文件?请参考以下列表作为指南
/etc/passwd/etc/shadow/etc/hosts/etc/hosts.allow/etc/hosts.deny/etc/resolv.conf/etc/HOSTNAME/etc/sysconfig/network-scripts/ifcfg-eth0/etc/sysconfig/network/etc/X11/XF86Config/etc/X11/X/etc/conf.modules
如果您对这些文件或其他配置文件一无所知,那么您仍然有希望。您必须继续启动并以 root 身份登录(我希望这始终是可能的)。CD 将挂载在 /mnt/cdrom 中。在 /mnt/cdrom/system/config-touch 中,您会找到两个脚本。运行 Touch_all 将触摸系统中的所有文件。然后运行您需要的配置工具(setup、xconfigurator 或 X 中的 control-panel)。最后,运行 Find_newer。它将找到由配置更新的文件,并将其复制到当前目录中名为 config 的目录中。将文件放在软盘上,您就完成了。
Maragda 教学版的配置受到限制。它不要求提供软盘,并提示您选择系统上已有的四种配置之一
PS2 鼠标和帧缓冲
串口鼠标和帧缓冲
PS2 鼠标和 vga
串口鼠标和 vga
在 Maragda 的未来版本中,我计划检测 Maragda 启动的环境并自动配置它。
有三件事要做
准备一个软件安装,其中包含您想要在 Maragda 上的所有软件包;我们称之为源安装。
将源安装分布在两个大文件 ROOT.FS 和 WHOLE.FS 之间;它们都应该适合 ext2 文件系统。
开发一种启动机制,负责检测 CD-ROM 驱动器并在其上定位 ROOT.FS。然后,它应该将 ROOT.FS 加载为 RAM 磁盘,准备将其作为根文件系统,最后它应该让启动过程在根文件系统上继续进行。
完成工作的全部必要部分(主要是 shell 脚本)都安排在两个工作目录中
boot:负责开发启动机制
system:包含从源安装创建 ROOT.FS 和 WHOLE.FS 的工具
我应该提到,可能某些设备文件(/dev 下的文件)可能不正确,这是因为从 ext2 文件系统复制到 CD 文件系统 (iso9660) 的缘故。在这种情况下,您应该将这些文件替换为您系统中的相应 /dev 文件。
现在,让我们概述构建过程中的相关步骤,并描述每个 shell 脚本以及主要配置文件的目的。次要细节在此解释中省略;如果您决定构建自己的类似 Maragda 的系统,您应该查阅 CD 上的 doc/developer.html 并仔细阅读工作目录中的每个 shell 脚本。
图 1 显示了启动过程中要采取的主要步骤。
这里的目标是创建一个可引导软盘,该软盘将合并到 CD 中以使其可引导。
用于设置软盘的引导加载程序是 syslinux。它可以从 DOS 格式化的软盘启动 Linux 系统,该软盘包含内核和初始 RAM 磁盘文件(压缩),其中包含根文件系统。
因此,我们将需要内核及其可加载模块。(现在只需要内核。)我不会在这里解释如何编译内核,但只会强调它应该支持
帧缓冲设备
CD-ROM(iso9660 文件系统)
初始 RAM 磁盘
环回设备
(您可以在 doc/developer.html 上找到我的内核配置。)
现在我们必须构建初始 RAM 磁盘 (initrd),其中包含第一阶段启动的根文件系统。获得一个的最简单方法是从软盘救援磁盘借用它。但是,我遵循“自己动手”的理念。目录 boot/initrd 是我的 RAM 磁盘内容的骨架。名为 Init_initrd 的脚本从头开始填充该目录,从源安装复制文件。它创建目录,将 dev 文件的子集复制到 initrd/dev,并填充 initrd/bin。initrd 的大小必须保持较小,因此您应该只在 initrd/bin 上保留必要的二进制文件。然后您必须运行 Cp_lib;它会将您之前保留的二进制文件的库复制到 initrd/lib。
完成后,运行 Make_initrd_fs_gz。它将创建一个文件(Minix 格式),将 boot/initrd 上的文件复制到其中,然后对其进行压缩。
现在您有了一个内核和一个初始 RAM 磁盘。接下来,您应该使用 syslinux 生成可引导软盘。syslinux 配置文件 SYSLINUX.CFG 包含在 boot/syslinux_boot_floppy-20MB 中。行
append initrd=initrd.gz ramdisk_size=20480 vga=0x315
指示引导加载程序加载软盘上的初始 RAM 磁盘文件,并将两个参数传递给内核,以告知内核 RAM 磁盘的大小和帧缓冲视频模式。RAM 磁盘大小应根据所使用的 ROOT.FS 的大小进行自定义。
最后,可引导软盘由 Write_syslinux_boot_floppy 脚本创建。它还将提取软盘的原始映像以合并到 CD 上。
这里最相关的文件是 boot/initrd/linuxrc(初始 RAM 磁盘上的 /linuxrc),因为此脚本在启动时执行。它执行此阶段旨在完成的主要任务
它搜索保存文件的设备
/MARAGDA /system/ROOT.FS /system/WHOLE.FS
如果找到,它将声明哪个设备将成为新的根文件系统
mount -n /proc /proc -t proc echo 0x101 > /proc/sys/kernel/real-root-dev (0x101 represents /dev/ram1)
它将 WHOLE.FS 转储到 /dev/ram1 上。
最后,它在 cdrom_dev 上写入找到 .FS 文件的设备。此文件将在第二阶段启动期间查阅。
如果一切顺利,启动过程将继续执行 init,已经在新的根文件系统中。旧文件系统 (initrd) 将在新文件系统上保持挂载在 /initrd 下。
这些文件由 system 工作目录中的脚本和在那里找到的文件创建,从源安装开始。
Cp_root 负责创建 ROOT.FS,而 Cp_whole 将构建 WHOLE.FS。这两个脚本都使用 Make_fs 在文件中创建文件系统。
ROOT.FS 应该包含需要写入且不能存在于只读文件系统上的文件和目录。写入将是可能的,因为 ROOT.FS 将驻留在 RAM 磁盘上。很难确切找出 ROOT.FS 中需要什么。经过几次尝试,我决定至少复制以下目录:bin、sbin、lib(包括 lib/modules)、home、var、etc。
对于未复制的目录,将创建符号链接,指向 WHOLE.FS 一旦 Maragda 运行时将被挂载的位置 (/mnt/whole_fs)。
此外,二进制文件和库被取消剥离(删除符号)以减少空间。
ROOT.FS 的配置文件保存在 system/config 下。一旦从源安装填充 ROOT.FS,system/config 文件将被写入 ROOT.FS 覆盖现有文件。典型的 system/config 文件是
/home/jordi 目录
/etc/X11/X 和 /etc/X11/XF86Config 用于配置 X
/etc/hosts* 和 /etc/sysconfig/network-scripts,用于设置网络
/etc/passwd,用于用户帐户
/etc/rc.d/init.d/* 文件,用于驱动启动过程
特别重要的是脚本 system/config/etc/rc.d/rc.sysinit。它由 init(在第二阶段启动中)运行。我对其进行了修补以完成 Maragda 系统。它向 Maragda 的 /etc/fstab 添加了一些行,以反映 CD 的位置,从而反映 WHOLE.FS 的位置。请记住,这是 linuxrc(第一阶段启动)在文件 /initrd/cdrom_dev 上宣布的。一旦 fstab 完成,rc.sysinit 继续进行,“副作用”是 WHOLE.FS 将被正确挂载。
当然,要测试您正在出现的系统,您不需要刻录 CD。可以通过 LILO 轻松启动它,按以下方式安排文件
/system/MARAGDA /system/ROOT.FS /system/WHOLE.FS /boot/bzImage-rd (the kernel) /boot/1INITRD.GZ (the initial RAM disk for the first stage boot)
(System 可能是工作目录的符号链接。)您应该将以下条目添加到 /etc/lilo.conf
image=/boot/bzImage-rd label=maragda initrd=/boot/1INITRD.GZ literal="ramdisk_size=20480" # size of ROOT.FS read-only vga=0x315并在每次进行任何更改时运行 LILO。
正如您已经了解的那样,源安装是一个目录,其中包含一个完整的、已安装的 Linux 系统。它可以是复制 ROOT.FS 和 WHOLE.FS 文件的源,甚至可以用于将 Linux 安装到硬盘分区或 250MB zip 软盘上。脚本 Prepare_install(在 system 工作目录下)设置一个目录以接收 RPM 软件包。然后,您可以使用 Install_rpm 将这些软件包安装到源安装目录中。
Install_rpm 从 Red Hat 的 6.2 发行版 CD(或从另一个位置,如果您更改它)安装软件包。要安装的软件包的名称分组在 system/RPM_lists 下的文件中。例如,base_inst 列出了基本系统安装的软件包。我创建了列表文件,从 Red Hat CD 上的文件 RedHat/base/comps 开始。
如果您以正确的顺序安装软件包(如 Install_rpm 上所示),它们应该可以毫无问题地安装。Install_rpm 还会报告哪些软件包未安装。在 base_inst 的情况下,它会创建 base_inst_not_installed。这是唯一一组构成问题的 rpm。但是,如果您告诉 Install_rpm 安装 base_inst_not_installed 上的软件包,最终所有软件包都将被安装。
您可以在 http://navel.eugan.upv.es/maragda/doc 上找到所有使用的脚本,包括 Maragda 的原始 CD 映像(以及刻录它们的说明)。
尽情享用吧。
