构建虚拟 CD-ROM 点唱机
本文介绍了如何使用 Samba 和 Linux 设置虚拟 CD-ROM 点唱机 (VCDJ)。VCDJ 是一种网络服务器,它允许访问大量 CD-ROM 光盘的内容,而无需多个 CD-ROM 驱动器。此外,它还同时以适合使用 CD-RW 驱动器刻录 CD-ROM 副本的格式提供对 ISO 9660 CD-ROM 映像的访问。
CD-ROM 点唱机通常是连接到 CD-ROM 驱动器塔的文件服务器(或文件服务器设备)。它能够(通常通过 SMB/Windows 网络)将多个 CD-ROM 的内容共享给网络上的客户端。这很有价值,因为当网络用户希望安装软件或访问数据时,他们不必物理地找到特定的 CD-ROM。
然而,这种方法存在一些缺点。它可以服务的 CD-ROM 数量受其塔中的 CD-ROM 驱动器数量的限制。要添加更多 CD-ROM,必须获取并安装更多驱动器。CD-ROM 必须始终在驱动器中,使其无法用于其他目的。此外,如果没有将 CD-ROM 从服务器中取出(这会使网络用户无法使用它们),就无法轻松制作 CD-ROM 的副本(尤其是可启动副本)。
VCDJ 克服了所有这些限制。它与常规文件服务器不同,因为虽然常规文件服务器可能包含多个 CD-ROM 的内容,但 VCDJ 包含 CD-ROM 的 ISO 9660 映像。完成后,它将同时有效地(以逐个文件的方式)提供映像和映像的内容。此外,原始 CD-ROM 光盘可以存放起来,不会丢失。
传统的 CD-ROM 服务器受其包含的 CD-ROM 驱动器数量的限制,而 VCDJ 受其包含的磁盘空间量的限制。硬盘驱动器的价格比 CD-ROM 塔便宜一个数量级,并且它们的可扩展性更好。一个 40GB 的硬盘驱动器占用 IDE 或 SCSI 控制器上的一个位置。它可以包含相当于 57 张全尺寸 CD-ROM(每张 700MB)。我们需要连接到服务器 57 个 CD-ROM 驱动器才能获得等效的功能,这在实践中是不可能的。
在我的工作场所,我们发现 VCDJ 对于发布定期更新的软件订阅内容非常宝贵。我们过去常常在将 CD-ROM 光盘借给他人时丢失它们;现在我们只是通过他们的 Windows 域凭据授予他们访问权限。而且,我们可以轻松地刻录任何我们需要的可启动 CD-ROM 的新副本。原始光盘仍然被锁起来。
要创建我们的 VCDJ,我们需要以下组件
一台运行最新版本 Linux 的计算机中的一个 CD-ROM 驱动器。该驱动器将用于创建 ISO 9660 CD-ROM 映像。(ISO 9660 是通常在 CD-ROM 光盘上使用的文件系统格式。因此,我们将 CD-ROM 光盘的软拷贝称为 ISO 9660 映像。)
足够的硬盘驱动器空间来容纳我们要提供的所有 CD-ROM 映像。
一个环回设备,用于允许访问 ISO 9660 映像中包含的文件。
自动挂载器,用于自动挂载 ISO 9660 CD-ROM 映像。
Samba 设置为提供网络共享。
首要任务是获取 CD-ROM 光盘的 ISO 9660 映像。您可以使用任何工具来生成正确的映像,例如,制作 CD-ROM 的副本。您也可以下载您最喜欢的 Linux 发行版的 ISO 映像。
在 Linux 上,制作映像的最简单方法是使用 cat。将所需的 CD-ROM 光盘放入 CD-ROM 驱动器。确保目录 /mnt/images/ 存在。如果您的 CD-ROM 磁盘块设备是 hdc,则映像创建如下
cat /dev/hdc > /mnt/images/image1.iso
您需要为映像文件指定一个更具描述性的名称。读取映像可能需要一段时间。对您要制作映像的每个 CD-ROM 光盘重复此过程。
现在我们有了 CD-ROM 映像,我们希望访问映像的内容。访问映像内容的正常方法是使用环回设备,如下所示
mount -t iso9660 -o loop,ro /mnt/images/image1.iso /mnt/isosrv/image1/
此挂载命令表示我们将要挂载一些使用 ISO 9660 文件系统格式的数据。它还表示要使用环回设备。环回设备是一个巧妙的内核功能,允许您指定一个文件,在本例中为 /mnt/images/image1.iso,将其用作字符设备,如硬盘驱动器或 CD-ROM 驱动器。此命令以只读格式挂载映像文件。CD-ROM 映像的内容可以在 /mnt/isosrv/image1/ 中看到。
如果我们的 VCDJ 有很多 ISO 9660 映像,则不可能静态地挂载所有这些映像。下一步是配置自动挂载器。自动挂载器仅在访问 ISO 9660 映像时才会挂载它。它会在一段时间不活动后卸载它。我们需要这样做是因为一次可以通过环回设备挂载的文件系统数量是有限制的。不太可能所有 CD-ROM 都会同时使用,因此自动挂载器可以帮助我们。(有关安装和初始设置自动挂载器的说明,请参阅 Marcel Gagné 的 “Tux Knows It's Nice to Share, Part 4”,网址为 /article/5298。)
首先,编辑 /etc/auto.master,并在其末尾追加以下行
/mnt/isosrv_auto /etc/auto.isosrv --timeout=60
确保目录 /mnt/isosrv_auto 存在。重新启动自动挂载器以使此更改生效。
创建文件 /etc/auto.isosrv,并在其末尾追加以下行
image1 -fstype=iso9660,ro,loop :/mnt/images/image1.iso
为要自动挂载的每个 ISO 9660 CD-ROM 映像创建类似的行。
如果您在 VCDJ 上挂载,您应该看到如下行
automount(pid782) on /mnt/isosrv_auto type autofs (rw,fd=5,pgrp=782,minproto=2,maxproto=3)
(各种数值在您的系统上可能会有所不同。)
当对 /etc/auto.isosrv 进行更改时,不 需要重新启动自动挂载器。到目前为止,我们已经告诉自动挂载器,当某些进程尝试访问 /mnt/isosrv_auto/image1/ 中的某个文件或目录时,它将挂载 image1.iso。在一段时间内没有访问该目录后,映像将被卸载。
最后一个问题。列出 /mnt/isosrv_auto/ 的内容
ls /mnt/isosrv_auto/
如果最近没有任何内容访问 CD-ROM 映像的内容,则此目录将显示为空。
如果您显式列出 CD-ROM 的内容,
ls /mnt/isosrv_auto/image1/
您将看到内容。现在返回并再次列出 /mnt/isosrv_auto/ 的内容,您将看到 image1。最终,自动挂载器将卸载映像,并且该目录将再次为空。
这是一个问题,因为这意味着用户必须知道他们想要访问的所有 CD-ROM 的名称。目录浏览将不起作用,这显然是不可接受的。
解决方案是创建另一个名为 /mnt/isosrv/ 的目录。进入该目录并执行以下命令
mkdir image1 cd image1 ln -s ../../isosrv_auto/image1 disc
对每个 ISO 9660 CD-ROM 映像重复此操作。
列出 /mnt/isosrv/ 的内容将显示所有可用的映像,无论自动挂载器是否已挂载它们。
有关 Samba 的安装和初始设置说明,请参阅 Marcel Gagné 的 “Tux Knows It's Nice to Share, Part 5” (/article/5297)。请务必根据其许可协议设置身份验证以正确保护 CD-ROM 内容。(如果一切都是开源的,则不是问题!)
回想一下,一个目标是通过 Samba 同时提供对 ISO 9660 映像及其内容的访问。为此,请编辑 /etc/smb.conf(或可能是 /etc/samba/smb.conf),并在末尾追加以下行
[isoimages] comment = ISO9660 CD ROM images path = /mnt/images/ [cdroms] comment = Contents of CD ROMs path = /mnt/isosrv/
重新启动 Samba。现在转到 Windows 客户端(或任何其他可以作为 SMB 客户端的计算机)并浏览您的 VCDJ。您应该看到两个新的共享:isoimages 和 cdroms。isoimages 共享中包含所有 ISO 9660 映像,而 cdroms 共享中包含映像的内容。浏览 cdroms 共享中的目录 image1 的内容。如果您在 VCDJ 上挂载,您应该看到如下行
/mnt/images/image1.iso on /mnt/isosrv_auto/image1 type iso9660 (ro,loop=/dev/loop0)

Jeremy Impson (jeremy.impson@lmco.com) 是位于纽约州奥韦戈的洛克希德·马丁系统集成公司的高级副研究科学家。他在那里是移动通信和游牧计算中心的成员,他在那里使用开源软件开发移动计算系统。