Maragda:从 CD 运行 Linux

作者:Jordi Bataller

这里描述的项目进一步证明了 Linux 是一个强大且通用的系统。

我的学院有几辆手推车,上面装有一台电脑 (PC) 和一台录像机,两者都连接到一台视频投影仪。它们有很多用户,因此很难保持它们正常工作。对于电脑来说尤其如此;你永远无法确定在硬盘上会找到什么软件。

我决定在入门编程课程中使用投影仪,向我的学生展示 C 程序的源代码以及如何逐步运行它们。我当然想使用 Linux 及其编程工具,以便我的学生了解 Windows 不是唯一的选择。

在这种情况下,我得出的结论是,我需要某种便携式 Linux 系统,而且我不想在教室里使用我的笔记本电脑。

我的第一个想法是尝试在用于并行端口的 Iomega Zip 250MB 驱动器上安装 Linux。经过几天的工作,我成功了。它需要一张软盘来启动系统,运行速度还不错。然后我重复了这项任务,这次是将 Linux 安装在包含在用于并行端口的 IDE 盒适配器中的 IDE 硬盘上。这种配置消除了 250MB 磁盘空间的限制,并加快了 Linux 的运行速度。

从这些任务中获得的经验,我问自己,为什么不从 CD-ROM 运行 Linux 呢?这将是方便且更易于使用的。此外,学生可以使用它开始学习 Linux,而无需将其安装在自己的计算机上。于是 Maragda 诞生了。

如何使用 Maragda

最终产品是可引导的 CD-ROM,因此您必须配置 BIOS 以从 CD 驱动器启动。如果您的 BIOS 不支持此功能,则有一个解决方案:一张可引导的软盘,它也可以从 CD 引导 Linux。事实上,软盘的原始映像是 CD 包含的用于自引导的内容。

CD 上的 Linux 软件是从 Red Hat 6.2 发行版安装的,我准备了两种配置。第一种是完整安装。它包含基本系统、打印机支持、X Window 系统、VGA16 和帧缓冲 X 服务器、GNOME(或者您可以编辑 .xinitrc 并取消注释您最喜欢的窗口管理器的行)、网络服务器工作站、创作和发布工具(LaTeX 等)、Emacs、开发工具(makeegcs 等)、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 教学版的配置受到限制。它不要求提供软盘,并提示您选择系统上已有的四种配置之一

  1. PS2 鼠标和帧缓冲

  2. 串口鼠标和帧缓冲

  3. PS2 鼠标和 vga

  4. 串口鼠标和 vga

在 Maragda 的未来版本中,我计划检测 Maragda 启动的环境并自动配置它。

如何构建 Maragda

有三件事要做

  1. 准备一个软件安装,其中包含您想要在 Maragda 上的所有软件包;我们称之为源安装。

  2. 将源安装分布在两个大文件 ROOT.FS 和 WHOLE.FS 之间;它们都应该适合 ext2 文件系统。

  3. 开发一种启动机制,负责检测 CD-ROM 驱动器并在其上定位 ROOT.FS。然后,它应该将 ROOT.FS 加载为 RAM 磁盘,准备将其作为根文件系统,最后它应该让启动过程在根文件系统上继续进行。

完成工作的全部必要部分(主要是 shell 脚本)都安排在两个工作目录中

  1. boot:负责开发启动机制

  2. system:包含从源安装创建 ROOT.FS 和 WHOLE.FS 的工具

您可以在 CD 上找到这些目录(以及 doc 目录)。它们是我自己的工作目录的副本,在其中您可以找到构建 Maragda 所需的一切。您必须将它们复制到至少有 1GB 可用空间的磁盘上。

我应该提到,可能某些设备文件(/dev 下的文件)可能不正确,这是因为从 ext2 文件系统复制到 CD 文件系统 (iso9660) 的缘故。在这种情况下,您应该将这些文件替换为您系统中的相应 /dev 文件。

现在,让我们概述构建过程中的相关步骤,并描述每个 shell 脚本以及主要配置文件的目的。次要细节在此解释中省略;如果您决定构建自己的类似 Maragda 的系统,您应该查阅 CD 上的 doc/developer.html 并仔细阅读工作目录中的每个 shell 脚本。

启动

图 1 显示了启动过程中要采取的主要步骤。

Maragda: Running Linux from CD

图 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 下。

ROOT.FS 和 WHOLE.FS

这些文件由 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 映像(以及刻录它们的说明)。

尽情享用吧。

Maragda: Running Linux from CD
Jordi Bataller 出生于 Ador(一个以种植橘子树而闻名的小镇),今年三十岁。他从 1992 年开始学习 Linux,并希望终身学习。他在 Gandia 理工学院担任教授,并在瓦伦西亚理工大学(西班牙)的信息技术研究所担任研究员,并在那里获得了博士学位。在业余时间,他喜欢游泳和演奏单簧管。
加载 Disqus 评论