本节的名称有点误导性 - 因为我们是远程启动系统,所以所有软件并非都位于客户端,而是位于服务器端。该软件包括 Linux 内核和一个小型 Linux 发行版,大小不到 2MB。它可能可以压缩到 1.44MB(以便可以放入软盘),但是远程启动 MP3 播放器盒而不使用软盘更有趣。使用的 Linux 内核版本是 2.2.16。可以使用任何版本。使用的小型发行版是 LRP - 它通常压缩后可以放入 1.44 软盘。原始小型发行版中唯一保留下来的东西是二进制文件 - 其余部分都被我更改了。
为 MP3 播放器盒制作新的内核是必要的。您的声卡不可避免地与我的不同,并且您可能拥有不同的网卡。
我使用的 Linux 内核树已提供。请查看
第二步 - 配置客户端/01 - linux 内核/linux-2.2.16
并输入
cd "2nd Step - configuring client/01 - linux kernel/linux-2.2.16" make menuconfig并选择正确的驱动程序。如果您想为小型 Linux 发行版使用我的启动脚本,请将所有驱动程序模块化(网络、文件系统、声卡)。
成功选择驱动程序后,制作内核。将您的新内核 2nd Step - configuring client/01 - linux kernel/linux-2.2.16/arch/i386/boot/bzImage 复制到您的 tftpboot 目录中,命名为 linux.1(不是 linux.0!)
cd "2nd Step - configuring client/01 - linux kernel/linux-2.2.16" make bzImage cp arch/i386/boot/bzImage /tftpboot/X86PC/UNDI/linux-install
据推测,您已将网络和声音驱动程序配置为模块。有必要编译它们并将它们放入临时目录中(直到您完成小型发行版设置)。要编译并安装到临时目录,请执行
export INSTALL_MOD_PATH=/tmp make modules;make modules_install内核的模块将位于 /tmp/lib/modules/2.2.16 中。记住这个路径。
我们需要制作一个文件系统,网络启动程序可以从服务器下载并传递给内核。这种文件系统的最大大小受机器内存大小的限制,但通常不应大于 4MB。
由于我们希望从网络启动 MP3 播放器盒,并且 MP3 播放器盒上没有媒体存储设备,因此文件系统不能位于硬盘驱动器、软盘驱动器或 ZIP 驱动器上。Linux 提供了一种称为初始 RAM 磁盘 (initrd) 的工具 - 它是一个文件,实际上是一个嵌入在文件中的 ext2 文件系统。
要理解为什么我们需要创建初始 Ram 磁盘文件系统,有必要了解 Linux 的启动方式。
更多信息,请参考 man initrd。
initrd - 是嵌入在文件中的初始 ram 磁盘。创建这样的文件非常简单(您必须是 root 用户才能使用 losetup)。
dd if=/dev/zero of=/root/initrd count=4096 bs=1024
losetup /dev/loop0 /root/initrd
mke2fs /dev/loop0
losetup -d /dev/loop0
file /root/initrd
这将创建一个 4MB 大小的 initrd 文件。最后一个命令应该显示:Linux/i386 ext2 filesystem。这是我们最终用来在 MP3 播放器盒上启动 Linux OS 的文件。
要使用 initrd,需要创建一个挂载点并挂载 initrd 文件
mkdir /data
mount /root/initrd /data -o loop
现在您可以自由地将文件来回复制到 4MB 的 initrd 文件中,该文件挂载在 /data 下。
现在是将一些有意义的内容放入 4MB initrd 的时候了。我们需要将一个小型 linux 发行版复制到 initrd,否则我们将无法使用它来启动 MP3 播放器盒。
cd "2nd Step - configuring client/02 - the filesystem"
tar -cf - * | (cd /data; tar -xvf - )
您还记得我们在上一节中编译的模块吗?
cp -Rf /tmp/lib/modules/2.2.16/* ./data/lib/modules/2.2.16
sync
df -h
df -h 仅用于向您显示文件系统上还剩多少空间。
使用 initrd 文件通常意味着我们必须卸载该文件,对其进行 gzip 压缩并将其复制到 tftpboot 目录中。
umount /data
sync
gzip -c9 /root/initrd > /tftpboot/X86PC/UNDI/linux-install/linux.2
这将卸载 initrd,并将其压缩为 linux.2 文件(NBP 将查找并下载该文件)。
这基本上是设计和使用 initrd 文件系统的方法。需要记住一件事 - initrd 在部署时应始终进行压缩。
在您复制了 initrd 文件并尝试启动工作站后,您发现内核抱怨无法挂载根分区。问题在于 PXE 提供的 NBP - 它是为 RedHat 类型的 initrd 镜像编译的,因此对内核进行了一些更改。
第一步 - 配置服务器/02 - pxe/pxe/pxe-linux/nbp.linux/prepare.c。第 212 行列出了十六进制地址。将其更改为 0x0100 - 这样内核将挂载 /dev/ram0 并实际找到 initrd 文件系统。
当内核完成将 initrd 加载到内存并将其作为文件系统挂载时,/sbin/init 将被执行,它处理操作系统启动的其余部分。
这些脚本尽可能简单。您应该查看和修改的文件是
我获得的 Logitech 遥控器很容易在 Linux 下工作。Linux 中使用的软件是 ARCaMP (AST Remote control MP3 Player)。该软件基本上监听串口上的一些预定义字符,并根据这些字符启动 mpg123。
源代码包含在 第二步 - 配置客户端/99 - 源代码/ARCaMP 中。它与原始代码不同 - 按键映射不同,默认播放列表已更改。如果您发现该程序适用于您的遥控器,但按钮 -> 动作映射搞砸了,请编辑 defs.h 以使您的扫描码与您的遥控器匹配。获取扫描码非常容易
cat /dev/ttyS1 | od -t x2
0000000 2000 7f10 7f10 7f10 7f10 7f10 7f10 7f10
0000020 7f10 7f10 202a 7f10 7f10 7f10 7f10 7f10
0000040 7f10 7f10 7f10 7f10 7f10 7f10 202a 7f10
0000060 7f10 7f10 7f10 7f10 7f10 7f10 7f10 202a
0000100 0f0f 0f0f 0f0f 0f0f 0f0f 2a0f 0f20 0f0f
0000120 0f0f 0f0f 0f0f 2a0f 0f20 0f0f 0f0f 0f0f
0000140 0f0f 0f0f 202a 1212 1212 1212 1212 2a12
0000160 1220 1212 1212 1212 1212 2a12 1220 1212
0000200 1212 1212 1212 1212 1212 202a 1212 1212
/dev/ttyS1 是我的红外接收器的串口,您的可能不同。od -t x2 将输出转换为十六进制。
前八个字节只是偏移位置 - 忽略它们。如果您仔细查看这些字符串,就会清楚地看到,每当您按下遥控器上的同一个按钮时,您都会得到看起来相似的数字字符串。前三行实际上是快速前进按钮被按了三次。ox20, ox2A, 0x7F, 和 0x10 的重复表明 0x20 和/或 9x2A 是遥控器 ID 号,而 0x7F 或 0x10 是快进的代码。
接下来的三行是播放按钮(扫描码是 0x0F)。正如您所见,0x20, 0x2A 的重复再次表明是遥控器 ID。
最后三行是停止按钮 - 0x12。
只需运行 make 并将 arcamp 文件复制到 /data/bin 目录 - 假设您仍然将 initrd 文件系统挂载在 /data 下。
如果您有不同的遥控器,并且扫描码匹配过程不起作用,那么您将无法使用 ARCaMP。相反,您必须在 Linux 下搜索一些可以支持您的遥控器的软件。请查看文档末尾的 遥控程序 部分,了解一些 URL。
请记住,您必须修改 /etc/rc.d/rc.audio(在 initrd fs 上),以便它生成与 ARCaMP 不同的程序。
该程序是静态编译的,并放在 /bin(在 initrd 上)目录中。如果您发现有必要获得更新的版本,请使用 -static 标志重新编译它并将其放入 /bin 中。