NetDVD:使用 Linux 构建网络附加外围设备

作者:Bradford C. Smith

我在西门子医疗解决方案公司的分子影像小组工作,我的同事和我开发并维护用于运行正电子发射断层扫描 (PET) 医疗扫描仪的软件。这些机器生成大量的患者数据,我们的客户必须存档这些数据以便日后检索和审查,因此我们的软件允许客户将数据存档到磁带或磁光 (MO) 磁盘。使用磁带非常慢,因此通常首选存档到 MO 磁盘。不幸的是,在过去的几年里,我们遇到了很多 MO 硬件偶尔损坏 MO 磁盘的问题,导致了昂贵而乏味的数据恢复工作以及更换了几个 MO 驱动器。

多年来,我们的客户一直要求能够将他们的数据存档到 DVD。DVD 介质比磁带或 MO 都便宜得多,并且任何装有 DVD 驱动器的 PC 都可以读取它。这对我们的许多客户都很有用,因为他们可以使用免费的软件工具在 PC 上读取我们的数据文件。由于 MO 驱动器供应商似乎无法解决我们的硬件问题,我们认为现在是实施 DVD 存档的合适时机。

不幸的是,我们立即遇到了障碍。我们扫描仪的控制台是运行 Solaris 2.6、Solaris 7 或 Solaris 8 的 Sun UltraSPARC 工作站。客户硬件的范围从 Ultra 2 到 Sun Blade 2500。由于需要支持如此多的不同机器,我们显然需要一个外部 SCSI DVD 刻录机。但是,我们找不到稳定的此类设备来源,并且 Solaris 2.6 和 Solaris 7 对 DVD 刻录机硬件几乎没有或根本没有支持。

由于 DVD 刻录机很容易为 x86 硬件获得,并且多年来一直得到 Linux 的良好支持,因此我们认为最好的解决方案是使用一台小型 Linux 机器,配备高质量的 DVD 刻录机来完成 DVD 的读取和写入工作。这将解决我们的硬件和操作系统兼容性问题,并使将来更容易添加对新媒体类型的支持。Solaris 工作站将通过网络与 DVD 读取器/写入器机器通信,因此我们将我们的创造命名为 NetDVD。

寻找供应商和原型硬件

因为我们的业务是构建大型医疗扫描仪——而不是计算机——我们需要做的第一件事是找一家公司为我们组装设备并帮助选择硬件。我在网上搜索以找到合适的公司,并发送了几封查询信。我联系的公司中很少有对我们的项目感兴趣的,而且大多数公司都要求保证最低数量的单位才能与我们合作。我们在现场大约有 700 台扫描仪,很可能我们会向其中几百台销售 NetDVD 设备,但我没有权力做出任何承诺。

值得庆幸的是,MBX Systems 非常有帮助。他们的代表 Ed Jamison 很快提出了一些可能的硬件解决方案,其中包括一个在 Casetronic 的 C134 机箱中使用 mini-ITX 主板的解决方案,如图 1 所示。这款机箱实际上比我们一直在使用的外部 MO 驱动器还要小一点,所以它看起来是完美的选择。我们急切地订购了一台配备 1GHz 处理器、256MB 内存、40GB 硬盘和笔记本电脑尺寸 DVD 刻录机的设备。

NetDVD: Building a Network-Attached Peripheral with Linux

图 1. Casetronic C134 机箱中的原型 NetDVD

选择 Linux 发行版

有了原型之后,我们必须决定在其上安装哪个 Linux 发行版。我的同事兼 Linux 爱好者 Dan Duckworth 刚刚读到关于这个新的 Ubuntu 发行版有多么出色的文章,所以我们决定试一试。我们下载了 Ubuntu 4.10 Warty Warthog CD 镜像,它安装得非常漂亮。Ubuntu 基于 Debian,我已经使用了好几年了,所以我发现配置它非常容易。它对我们来说效果非常好,以至于我们甚至没有尝试过其他发行版。

NetDVD TCP/IP 协议

当我们在挑选供应商、硬件和 Linux 发行版时,我一直在思考客户端机器将如何与 NetDVD 通信。客户端计算机必须能够读取 DVD、写入 DVD 并创建 DVD 副本,以提供冗余存档备份。为了管理这一点,我决定将自定义 TCP/IP 协议与网络文件系统 (NFS) 结合起来。

要使用 NetDVD,客户端机器使用我们的自定义 NetDVD TCP/IP 协议连接到它。如果设备已经忙于为另一个客户端服务,它将回复 BUSY 错误消息并断开连接。这确保了只有一个客户端可以一次控制该设备。如果设备不忙,它将发送一条简短消息,说明它理解的 NetDVD 协议的最高版本。在撰写本文时,NetDVD 协议的唯一版本是 0,但我们可能会在以后创建新版本的协议以添加新功能。

如果客户端连接成功,它会立即向 NetDVD 发送初始化命令。此命令告诉设备客户端将用于与其通信的 NetDVD 协议版本,以及客户端认为的当前世界协调时间。NetDVD 将其时钟设置为与客户端匹配,因此机器将在文件系统时间戳上达成一致。

同样在初始化命令期间,NetDVD 使用 NFS 以只读/写权限严格导出其硬盘驱动器上的一个空目录到客户端的 IP 地址。这是客户端用来填充要写入 DVD 的文件的工作目录。它位于与操作系统分开的大磁盘分区上,因此将其填满不会导致设备行为异常。

要读取 NetDVD 驱动器中的 DVD,客户端发送 mount 命令。这会导致设备挂载其驱动器中的介质,并通过 NFS 严格将其导出到客户端的 IP 地址。当客户端完成读取后,它可以简单地卸载它,或者使用适当的命令卸载并弹出它。

要将文件写入 DVD,客户端首先通过 NFS 挂载 NetDVD 的工作目录,并用它想要写入 DVD 的文件和目录填充它。完成后,它发送一个刻录工作目录命令到设备,并指定这应该是新 DVD 还是附加到之前写入的 DVD 的数据。追加数据的能力对于我们使用该设备来增量存档数据至关重要。

要复制 NetDVD 设备驱动器中的 DVD,客户端发送一个特殊的 copy 命令。然后,设备将介质上的目录结构复制到与工作目录位于同一分区上的一个特殊目录中。复制完成后,客户端可以发送刻录副本命令到设备一次或多次,以将复制的目录树写入任意数量的 DVD。此方法不会制作视频 DVD 的可观看副本,因为这些光盘上的数据必须以我们不保留的非常特定的顺序写入。

无需键盘或显示器的用户控制

虽然我们在开发期间通常将显示器和键盘连接到 NetDVD 设备,但它的目的是向客户显示它是一个基于网络的外部设备,就像网络打印机一样。因为用户无法键入shutdown -h now来告诉 NetDVD 关闭,所以当用户按下电源按钮时,它必须执行干净的关机。

方便的是,现代主板提供了高级配置和电源接口 (ACPI)。当用户按下电源按钮时,主板会向处理器发送信号。然后处理器负责实际关闭计算机。Linux 对此接口有良好的支持,因此我们所要做的就是安装 acpid Ubuntu 软件包。此软件包已配置为在按下电源按钮时执行干净的关机。

但是,干净的关机需要几秒钟才能完成。如果设备似乎没有立即响应电源按钮按下,用户很可能会反复按下它,甚至可能按住几秒钟。这既让用户感到沮丧,又可能对设备有害,因为按住电源按钮会强制机器在关机完成之前立即断电。

因此,我们需要一种方法来告诉用户,“我收到了您的消息。我正在关机。请稍等片刻。” 由于 NetDVD 没有显示器,因此自然的选择是使用其 PC 扬声器发出哔哔声。为此,我们使用了 Johnathan Nightingale 编写的 beep 程序。beep 软件包不是基本 Ubuntu 安装的一部分,但它仍然可以从 Ubuntu 的 Universe 存档中获得。使用此程序,我编写了一些 init 脚本,这些脚本会在启动或关机期间使机器每秒发出一次哔哔声,并在完成时分别发出向上或向下的琶音哔哔声。这还额外的好处是告知用户设备何时准备好进行客户端连接。不幸的是,这还不够。

在用户按下电源按钮和第一次哔哔声之间仍然会过去几秒钟。为了使 NetDVD 立即开始发出哔哔声,我编辑了负责响应电源按钮按下的 shell 脚本 /etc/acpi/powerbtn.sh,使其在运行 shutdown 命令之前立即调用我的 beep-start init 脚本。通过此更改,NetDVD 会立即响应电源按钮按下而开始发出哔哔声。

处理网络配置

由于 NetDVD 设备必须通过 TCP/IP 网络进行通信,因此用户必须有一种方法告诉它要使用的 IP 地址、网络掩码和默认路由器。这是一个棘手的问题,因为您无法轻易与网络参数设置不正确的机器进行通信。值得庆幸的是,即使同一子网上的所有机器配置不正确,也可以接收 UDP 广播数据包。因此,我设计了一个简单的协议,允许客户端机器使用 UDP 广播在其子网上定位和配置 NetDVD 设备。

为了在其子网上定位 NetDVD 设备,客户端程序广播一个数据包,要求所有 NetDVD 设备响应。当 NetDVD 设备看到此数据包时,它会广播其以太网 MAC 地址和其他网络参数到请求中指定的 UDP 端口。客户端程序接收此信息并将其显示给用户。用户将知道他们想要配置哪个 NetDVD 设备,因为每个 NetDVD 设备都有一个标签显示其以太网 MAC 地址。

为了重新配置其子网上的 NetDVD 设备,客户端程序广播一个数据包,其中包含目标设备的以太网 MAC 地址和它应该使用的网络参数。目标 NetDVD 将重新配置其网络参数,并将响应广播回客户端的 UDP 端口。所有其他 NetDVD 设备都忽略该请求。

为了使此方案工作,我必须通过更改禁用 spoofprotect Linux 内核功能spoofprotect=yesspoofprotect=no在 NetDVD 设备上的 /etc/network/options 中。spoofprotect 功能导致内核忽略来自本地子网但看起来来自该子网的无效 IP 地址的数据包。如果我们启用此功能,则网络参数不正确的 NetDVD 将忽略旨在纠正它们的 UDP 数据包。

硬件和操作系统问题

一旦我们让一切正常工作并开始真正地运行我们的原型,我们就开始遇到刻录失败的问题。在与 MBX 的 Ed Jamison 讨论这个问题后,我们认为问题出在笔记本电脑尺寸的 DVD 刻录机上。由于其尺寸小,这些刻录机比全尺寸驱动器具有更多的可靠性问题。他建议切换到 Plextor PX-716A 16x 双层 DVD+RW/-RW 驱动器。Plextor 以制造极其可靠的 DVD 刻录机而闻名,并且此驱动器的刻录速度也比我们正在使用的笔记本电脑驱动器更快,我们的客户会对此表示赞赏。

遗憾的是,这意味着我们无法使用我们非常喜欢的 Casetronic C134 小机箱。但是,转向更大的机箱意味着我们可以转向总体上更便宜、更稳定的硬件。结果,我们获得了更快的处理器、更快且更大的硬盘驱动器以及千兆以太网接口。同样重要的是,我们减少了将来由于过时硬件而导致的问题,因为台式机硬件通常在市场上停留的时间比笔记本电脑硬件长得多。因为我们仍然试图最大限度地缩小设备的尺寸,所以 Ed 推荐了 Antec 的 Aria 机箱,如图 2 所示。

NetDVD: Building a Network-Attached Peripheral with Linux

图 2. Antec Aria 机箱中的第二个原型 NetDVD

NetDVD: Building a Network-Attached Peripheral with Linux

图 3. 机箱内部

到这时,我们正在使用 Ubuntu 5.04 Hoary Hedgehog,但是当我尝试在新机器上安装它时,它在检测网络设备时挂起。经过一番研究,我们发现我们正在使用的 Intel D915GUXLK 主板上的 SysKonnect SK-98xx 千兆以太网接口未得到 Ubuntu 5.04 提供的 Linux 2.6.10 内核的正确支持。幸运的是,制造商提供了内核补丁,所以我下载了内核源代码,应用了补丁并重建了内核。

这解决了以太网控制器的问题,但是内核在主板的 ACPI 上也遇到了问题。这导致了很多启动错误消息,并阻止机器正确处理电源按钮按下。为了解决这个问题,我必须升级到 Linux 2.6.12.2 并将千兆以太网驱动程序补丁应用于该版本。这很难做到正确,因为 Ubuntu 没有该版本内核的软件包。我不得不对内核参数进行大量实验,然后才能确定我拥有 Ubuntu 依赖的所有内核功能。

一旦内核问题得到解决,并且我们使机器作为 NetDVD 运行,我们就发现了另一个问题。DVD 刻录实际上比使用原始硬件时花费的时间更长,并且 DVD 活动指示灯显示驱动器在刻录期间经常空闲。Ubuntu 安装未启用驱动器的直接内存访问 (DMA),因此驱动器没有足够快地获取数据。一旦我们纠正了这一点,刻录速度就达到了我们预期的速度。即使在数据不足的情况下,Plextor DVD 驱动器的质量也确实值得称赞,因为它成功刻录了多个 DVD。

当 Ubuntu 5.10 Breezy Badger 发布时,我很高兴地发现它纠正了所有需要自定义内核构建的问题,但它引入了另一个我不知道如何纠正的问题。在 Ubuntu 5.10 中,exportfs 偶尔会失败,尽管它总是以 0 状态退出。对于静态导出来说,这不是什么大问题,但是由于我们所有的导出都是动态的,这对我们来说是一个严重的问题。因此,我们不得不回到 Ubuntu 5.04。

结论

在我们的测试中,自从更换到新硬件以来,我们在数百次刻录中只看到一次失败,因此我们相信 NetDVD 将成为我们需要的稳定存档解决方案。在我撰写本文时,我们正处于在两个非常热情的 Beta 站点安装 NetDVD 设备的边缘。他们已经看到了它的工作原理,并且根据他们的反应,我认为一旦正式发布,我们将收到大量 NetDVD 订单。

我们花了大约 15 个月才达到这一点,但大部分时间都花在了 Solaris 工作站上的软件以及其他与 NetDVD 无关的事情上。我非常感谢 Ariel King 和 Dan Duckworth 在为我们的工作站开发新的 DVD 存档软件方面做出的出色工作。该软件实际上更难做好。我认为我们花费在 NetDVD 设备本身上的开发人员时间不超过三个月。使用 Linux 和其他开源软件使这部分变得容易。

本文资源: /article/9071

Bradford C. Smith 是西门子医疗解决方案美国公司分子影像部门的软件开发人员。自 1996 年以来,他一直与 Linux 合作并热爱它,众所周知,他使用 ed 编辑器只是为了体验一下艰苦的生活。欢迎您通过 bradford.smith@usermail.com 向他发表评论。

加载 Disqus 评论