使用 MoviX 自托管电影

作者:Roberto De Leo

在过去几年中,Linux 在 x86 平台上的潜力得到了极大的开发,但在我看来,整个应用领域似乎仍然非常不发达。我指的是专用的 CD 迷你发行版,即存在于 CD 上的 Linux 发行版,其中包含运行某些特定应用程序所需的软件,并在启动时自动启动该应用程序。也就是说,它们仅使用 Linux 为我们提供一个背景,从中直接从 CD 运行某些应用程序。

让我提供一个具体的例子。假设您将您最喜欢的音频/视频文件以多种格式(例如 DivX、XviD、MP3、OggVorbis 等)保存在 CD 上。通常,当您尝试在与您自己的 PC 不同的 PC 上播放文件时,会发生以下情况之一:机器没有硬盘;该机器上没有播放器能够播放您的音频/视频格式;您需要的编解码器未安装;或者一切都存在,但播放质量很差,即使您知道硬件播放应该相当不错。

现在,假设您在 CD 上与您的文件一起刻录了一个最小的 Linux 系统,该系统能够直接从 CD 启动。它将自动启动并播放 CD 上的所有文件。这样,CD 将是“自给自足”的,您不必担心任何编解码器麻烦,并且您可以非常确定所有 PC 资源都只用于播放。实际上,您甚至可以在无盘 PC 上播放文件。当然,当您想这样做时,您仍然可以从您最喜欢的操作系统播放所有 CD 文件。

正如您可能想象的那样,这种理念并不局限于音频/视频播放。您可以为基本上任何应用程序创建专用的 Linux 迷你发行版,包括游戏、文本处理、多媒体编辑、网络广播等等。

让我指出这种迷你发行版的主要优点

  • 不浪费硬盘空间。

  • 每次需要时都准备好运行。

  • 即使在无盘 PC 上也能运行。

  • 即使在没有 Linux 的地方也能运行,有助于 Linux 的普及。

“Live” CD 发行版的想法并不新鲜。许多大型(DemoLinux、Knoppix)和小型(LNX-BBC、Devil-Linux)发行版都有很好的例子,尤其是那些面向路由和防火墙的发行版。但是,我发现这种专用发行版的例子很少(请参阅“资源”)。

特别是,几个月前,我在网上寻找一个 Linux CD 迷你发行版,该发行版能够启动并自动播放 CD 上的所有音频/视频文件。我很惊讶地发现没有。因此,我获得一个的唯一机会是自己开发它,所以我开始研究 MoviX。现在,我不是 Linux 大师,我对多媒体播放几乎一窍不通,但开源的美妙之处在于,您可以将比您更了解的人开发的工具组合在一起,仍然可以创造出新的和有用的东西。我将我对 Slackware 管理的知识(自 1994 年以来我就喜欢 Slackware)和 MPlayer(“the”多媒体播放器)以及我最近在网上发现的 IsoLinux(一个易于使用的 Linux CD 引导加载程序)软件包结合在一起,开始构建我的发行版。

最初,MoviX 包含单个 Linux CD 微型发行版,但在收到来自 MoviX 用户的许多反馈和请求后,该项目分为三个不同的软件包,如下所示

  • eMoviX:一个 CD Linux 微型发行版(约 7MB),旨在与音频/视频文件一起嵌入 CD 中,能够启动并自动播放所有 CD 文件。

  • MoviX:一个 CD Linux 迷你发行版(约 15MB),能够启动并启动 MPlayer 的控制台界面。

  • MoviX2:一个 Linux 迷你发行版(约 30MB),包含 XFree86 4.2.0 的完整安装,能够启动并启动 gmplayer,MPlayer GUI。

如果您使用 MoviX 或 MoviX2,启动后您可以取出启动 CD,并使用界面播放大多数音频/视频 CD/DVD。简而言之,虽然 eMoviX 使您的 CD 自给自足,但 MoviX 和 MoviX2 是一些“多媒体瑞士军刀”,能够使任何 PC 成为强大的多媒体工作站。并且由于 MPlayer 是如此出色的软件,即使在 P200MMX 上您也可以获得良好的播放效果。

我想在本文中提出的观点是,一旦您掌握了一些指导原则,开发这种专用迷你发行版并不难。我希望通过在下面描述我构建 MoviX 软件包所遵循的主要步骤来鼓励开发更多此类发行版。我唯一假设的是您习惯于内核/模块配置和编译。

编译内核

首先,确保您的内核已编译并支持 RAM 磁盘和环回设备,因为您将要使用这些功能。将您的 PC 内核树与用于发行版的内核树分开更干净。因此,获取最新的稳定内核(在撰写本文时为 2.4.20),并将其解压缩到与您的主内核目录不同的目录中。

内核配置默认值与我们需要的非常接近。进入发行版内核目录后,运行 make menuconfig 并添加对以下项目的支持

  • 代码成熟度级别选项 ---> 提示开发和/或不完整的代码/驱动程序

  • 处理器类型和功能 ---> 处理器系列:[选择 Pentium-MMX]

  • 块设备 ---> 环回设备支持

  • 块设备 ---> RAM 磁盘支持

  • 块设备 ---> 初始 RAM 磁盘 (initrd) 支持

  • 文件系统 ---> /dev 文件系统支持 [选择“启动时自动挂载”选项]

然后运行 make bzImage 以生成内核二进制文件。

创建文件系统

initrd 文件(init Ram Disc)包含发行版的根文件系统。我们的第一个 initrd 应该只包含系统文件;因此,5MB 就足够了。要创建它,我们使用 RAM 磁盘

dd if=/dev/zero of=/dev/ram0 bs=1k count=5000
mke2fs -m0 /dev/ram0 5000
mount /dev/ram0 /distro

小型发行版的 事实 标准是 Busybox 二进制文件(“嵌入式 Linux 的瑞士军刀”)来代替我们需要的许多小型二进制文件。

编译说明非常简单且文档齐全,但您也可以查看 Bruce Perens 在Embedded Linux Journal 中的 Busybox 文章(请参阅“资源”)。我建议您编译它以支持所有可能的命令,因为最终您将需要其中的大多数命令。请记住使用 ./install.sh /distro 安装 Busybox,这样您的 Busybox 副本支持的所有命令的所有链接都会自动在 /distro 中创建。

二进制文件通常动态链接到系统库。可以静态编译 Busybox 以节省空间。但是,我们将向发行版添加更复杂的二进制文件,因此最终无论如何我们都必须添加动态库。要为二进制文件(例如 Busybox)添加库,规则始终相同

  • 获取链接到它的库列表

    root# ldd busybox
            libc.so.6 => /lib/libc.so.6 (0x40028000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    
  • 将它们全部复制到 /distro/lib/。

最小化库大小的一个技巧是删除它们包含的所有调试内容

objcopy --strip-debug /lib/libc.so.6 /distro/lib/libc.so.6

为了完成这项工作,我们需要添加一些配置文件:/distro/etc/inittab/distro/etc/rc.d/rc.S/distro/etc/fstab/distro/etc/shells/distro/etc/profile。我们还需要创建一些目录:/distro/dev、/distro/mnt、distro/proc、/distro/root 和 /distro/tmp。我们不需要在 /distro/dev 中创建任何设备节点,因为 devfs 守护程序会在启动时自动创建所有设备。

最后,我们可以创建 initrd 文件

umount /dev/ram0
dd if=/dev/ram0 of=initrd bs=1k count=5000

要检查一切是否正常,您可以挂载 initrd 文件并查看内部

mount initrd /distro -o loop
ls -lR /distro

然后记得卸载并压缩它。

在刻录 CD 之前,最好通过从 LILO 启动 initrd 映像来对其进行测试。在您的系统中创建一个 /initrd 目录,将 bzImage 和 initrd.gz 放在那里,将 bzImage 重命名为 vmlinuz,并将清单 1 中的行添加到 lilo.conf。

清单 1. 添加 LILO 条目

此时运行 LILO,重新启动并在 LILO 提示符下选择“Distro”标签以使用您的新发行版启动。

制作 CD

要创建包含上述内核和文件系统的可引导 CD,您需要一个引导映像。您可以做出的最方便的选择是 IsoLinux 引导映像,称为 isolinux.bin 并且是 SysLinux 软件包的一部分,因此无论 initrd.gz 的大小如何,您的系统都能够加载它。

首先创建一个新目录,例如 /cdrom。然后,创建一个 /cdrom/isolinux/kernel 目录;将 initrd.gz 和 isolinux.bin 文件放在 /isolinux 中,并将内核放在 isolinux/kernel 中。最后,在 /isolinux 中编辑 isolinux.cfg 文件,以告知引导加载程序您要使用的引导选项(请参阅清单 2)。

清单 2. 简单的 isolinux.cfg 文件

此文件的格式类似于 lilo.conf 格式;有关详细信息,请查阅 SysLinux 网站。一个不错的改进是可以使用 F1-F10 键从启动提示符中调用最多 10 个文本文件。也就是说,有一种方法可以让用户在启动时直接从 CD 访问有关启动参数的文档。对于我们正在讨论的发行版类型,这是一个有用的功能。另一个不错的功能是能够可视化图片而不是文本,例如,可以向发行版添加“启动”启动徽标(最多 16 种颜色;否则,请尝试 BootScriptor 软件包)。

要生成可引导 CD 映像,请使用以下选项运行 mkisofs

mkisofs -o /tmp/distro.iso -r -V "My distro" -v -no-emul-boot \
  -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin \
  -c isolinux/isolinux.boot /cdrom

然后,刻录映像

cdrecord dev=0,0 -v -eject /tmp/distro.iso

现在您可以重新启动系统,以确保刻录成功并且 CD 确实是可引导的。

检测硬件

就目前而言,此 CD 已经是一个非常好的硬件检查工具,并且可以很容易地变成一个好的恢复工具。实际上,只需从中启动,您就可以通过查看 /proc/pci 和 /proc/cpuinfo 来找出大多数 PC 硬件(ISA 卡除外)的品牌和型号。通过查看内核启动日志 dmesg,您还可以找到有关 P&P ISA 卡的信息。向其中添加诸如 e2fsck 之类的二进制文件,您就拥有了恢复遇到问题的 Linux 系统所需的所有工具。

另一方面,此时系统不支持任何卡——没有 NIC、没有声卡、没有 SCSI 卡,什么都没有。虽然这对于救援 CD 来说可能还可以,但对于我们的迷你发行版来说可能不太好。

激活内核硬件支持的标准方法是使用内核模块,但简单地加载所有可能的模块并不是一个好主意。您需要一些自动检测工具。大型 Linux 发行版开发了几种自动检测工具:kudzu (Red Hat)、libdetect (Mandrake,但现在他们也使用 kudzu)、discover (Progeny)。但对于我们正在构建的小型发行版来说,这些似乎太复杂了。

幸运的是,您可以将简单的自动检测过程建立在 devfs 之上。实际上,它自动创建设备节点可以用作检查内核是否已识别某些设备的有效方法。例如,设备节点 /dev/sound/dsp 仅在您加载正确的声卡模块时才会自动创建。因此,您可以轻松编写一个脚本,该脚本逐个加载每个声卡模块,并每次验证音频设备是否出现。如果出现,则说明您已成功加载驱动程序并可以停止循环;否则,您可以卸载模块并继续。请参阅清单 3 中的简单 Perl 示例。

清单 3. 使用 Perl 加载声卡模块

因此,我们自动检测某种卡(例如声卡)的方法遵循以下路径

  • 返回发行版内核目录并激活对所有可能的声卡作为模块的支持;

  • 使用 make modules 编译所有模块

  • 使用 make modules_install 将模块安装到您的系统上(为避免覆盖“真正的”模块目录,请确保在安装发行版的模块之前重命名它);

  • 将 initrd.gz 文件重新挂载到 /distro 上(请记住在挂载之前解压缩它,否则它将无法工作);

  • 将新创建的目录 /lib/modules/2.4.20 复制到 /distro/lib/modules/;如果剩余空间小于 ~0.5MB,请如上所述构建新的 initrd,并为其分配更多空间;

  • 添加一些脚本以加载所有可能的模块,并在 rc.S 中添加一行以调用它

我没有足够的数据来告诉您此方法是否始终可靠,但我在所有 MoviX 软件包中使用了它四个月。到目前为止,我没有收到负面反馈,所以至少我可以告诉您它并非完全不可靠。

为所需的每种驱动程序重复此过程,您可以轻松构建一个脚本,该脚本能够自动检测任何 PC 上 Linux 支持的所有硬件。您可以在每个 MoviX 软件包中找到此类脚本的工作示例。

添加您的应用程序

一旦加载了所有必要的硬件驱动程序,任何仅使用控制台的应用程序都可以轻松安装在发行版中。eMoviX 和 MoviX 都完全基于此原则,因为 MPlayer 软件包能够在没有 X 的情况下播放音频和视频文件。

如果我们假设,正如大多数情况下发生的那样,我们想要包含在发行版中的软件包使用了 autoconf/automake 机制,那么添加软件包的最简单方法是执行以下操作

./configure --prefix=/usr/local/mplayer [further options]
make
make install

在这种情况下,要将安装转移到发行版,只需执行以下操作

  • 将 inird 重新挂载到 /distro 中

  • 将软件包复制到 /distro:cp -a /usr/local/mplayer/ /distro/usr/local/

  • 将所有链接到 /usr/local/mplayer/bin/ 中所有二进制文件的缺失库添加到 /distro/lib/;

  • 将 /usr/local/mplayer/bin/ 路径添加到 profile 中的 PATH 变量:PATH=$PATH:/usr/local/mplayer/bin/

  • 在 rc.S 中添加一行,以使用 ln -s /usr/local/mplayer/lib/* /distro/lib/ 在发行版 /lib 中创建指向 /usr/local/mplayer/lib/ 中所有库的软件链接

  • 卸载并压缩回 initrd。

按照这些针对 mp3blaster 应用程序的说明,您可以轻松生成一个迷你发行版,该发行版能够启动并自动播放每个 MP3 或 Ogg Vorbis 音频文件——一个配备了不错的控制台界面(原生 mp3blaster 界面)的发行版。这将确保用户能够在任何 PC 上播放他们喜欢的 Vorbis 文件(至少只要其声卡受 Linux 支持),而无需安装任何插件,也无需考虑安装了哪个操作系统。

处理 X

许多应用程序需要 X 才能工作。不幸的是,XFree 软件包往往非常大(约 80MB),当您需要将所有内容加载到 RAM 中以使 CD/DVD 驱动器重新可用时,这很糟糕。

有几个项目的目标或副产品是小尺寸版本的 X,包括 DirectFB 或 smallX,但它们都没有接近最新 XFree86 完整版本提供的硬件支持级别。如果您计划尽可能多地使用此类功能来支持最多的卡,则最佳解决方案是在删除尽可能多的不必要组件后使用完整的 XFree86 软件包。

幸运的是,几乎一半的 XFree86 软件包都被字体占用。由于您正在构建的发行版仅运行少量应用程序,因此一旦您确定了实际使用的少量字体,就可以轻松地将软件包大小减小到 40MB 左右。删除不必要的二进制文件和库可以将软件包大小降至 30MB 左右。

当然,您还需要“动态”生成一个可工作的 XF86Config 文件,要么从 X 本身生成它——使用 X -configure 命令并对其进行少量调整(您至少需要设置颜色数和您喜欢的屏幕分辨率)——要么创建某种模板。在模板方法中,您将编写一个脚本,该脚本能够检测显卡,然后设置与其对应的正确参数。

在这两种情况下,最好都有一种工具能够检测显示器的最重要数据,即水平同步和垂直刷新频率范围。如果它警告我们显示器无法提供此数据,以便我们可以提供标准频率,则尤其有帮助。一个很好的工具是程序 ddcxinfo,它是 kudzu 软件包的一部分,它分别使用 ddcxinfo -hsyncddcxinfo -vsync 返回我们需要的范围。当信息不可用时,它只会返回 0-0。

最后,让我指出您很可能不需要窗口管理器,因为您将只运行一个应用程序。MoviX2 就是这种情况。如果您需要一个,您应该尝试使用一个微型管理器,例如 Matchbox。

结论

我希望本文有助于增加此类专用发行版的数量。它们的开发不需要高超的技术技能,只需要对 Linux 系统的管理有很好的了解即可。此外,由于用户的反馈,这是显着提高您对 Linux 和您包含的应用程序的知识的有效方法。

最后,让我感谢所有开发者,我使用了他们的开源项目,因为否则 MoviX 项目是不可能实现的。还要感谢所有反馈显着增加了我对 Linux 和 MPlayer 的知识的人们。

资源

MoviX: movix.sf.net

Slackware: www.slackware.com

Busybox: www.busybox.net

uClibc: www.uclibc.org

MPlayer: www.mplayerhq.hu

SysLinux: syslinux.zytor.com

BootScriptor: www.bootscriptor.org

MP3Blaster: www.stack.nl/~brama/mp3blaster.html

DirectFB: www.directfb.org

SmallX: www.superant.com/smalllinux/tinyX01.html

MatchBox: handhelds.org/~mallum/matchbox

自动检测工具

Kudzu: rhlinux.redhat.com/kudzu/

Discover: hackers.progeny.com/discover

Detect: www.linux-mandrake.com/harddrake

手册

内核文档: www.tldp.org/HOWTO/Kernel-HOWTO.html

启动文档: www.tldp.org/HOWTO/Bootdisk-HOWTO/index.htmlwww.woalf.uklinux.net/WebWolf-HOWTO.txt

Bruce Perens 的第一篇 ELJ BusyBox 文章: linuxjournal.com/article/4335

DevFS HOWTO: www.atnf.csiro.au/people/rgooch/linux/docs/devfs.html

Live CD 发行版

DemoLinux: www.demolinux.org

Knoppix: www.knoppix.org

Linux-BBC: www.lnx-bbc.org/index.html

Devil-Linux: www.devil-linux.org/

专用 CD 发行版

LinuxConsole: linuxconsole.free.fr

DirectPresenter: team.gcu-squad.org/~fab/DP

DyneBolic: lab.dyne.org/DyneBolic

Byzantine OS: byzgl.sf.net

Roberto De Leo 获得了 卡利亚里大学 的物理学博士学位和 UMD 的数学博士学位。他在 Alberti 高中 任教,1994 年,他在那里使用 Slackware 盒子建立了意大利第一个学校网站。当他不进行研究、教学或照顾 Alberti 的 Linux 盒子时,他喜欢用自己的 Linux 盒子进行黑客攻击。

电子邮件: deleo@unica.it

加载 Disqus 评论