SCSI 介质更换器驱动程序

这是一个用于 SCSI 介质更换器设备的驱动程序,这些设备在 /proc/scsi/scsi 中显示为“类型:介质更换器”。

这适用于真正的点唱机(Jukeboxes)。它支持与常见的小型 CD-ROM 更换器、单 LUN 每插槽的 SCSI 更换器或 IDE 驱动器一起使用。

用户态工具可从此处获取:

http://linux.bytesex.org/misc/changer.html

一般信息

首先,关于更换器的工作原理:更换器有 2 个(可能更多)SCSI ID。一个用于控制机械手的更换器设备,另一个用于实际读写数据的设备。后者可以是任何设备,MOD、CD-ROM、磁带或其他。对于更换器设备来说,这“无关紧要”,它负责介质的移动,没有别的。

与例如 IDE-CD 更换器相比,SCSI 更换器模型更为复杂。但它允许处理几乎所有可能的情况。它知道 4 种不同类型的更换器元素:

介质传输

这个负责介质的移动,即传输臂。也称为“拾取器”。

存储

一个可以容纳介质的插槽。

导入/导出

与上述相同,但可以从外部访问,即操作员(你!)可以通过它向更换器中放入和取出介质。有时被称为“邮件槽”。

数据传输

这是读写设备,即 CD-ROM / 磁带 / 其他驱动器。

这些元素的数量都不限于一个:一个巨大的点唱机可以有 123 个 CD-ROM 的插槽、5 个 CD-ROM 读取器(因此有 6 个 SCSI ID:更换器和每个 CD-ROM)和 2 个传输臂。处理起来没有问题。

如何实现

我将该驱动程序实现为具有 NetBSD 风格 ioctl 接口的字符设备驱动程序。我只是将 NetBSD 的头文件和另一个 Linux SCSI 设备驱动程序作为起点。该接口应该与 NetBSD 源代码兼容。因此,如果有任何软件(有人知道吗?)支持 BSD 风格的更换器驱动程序,它也应该与此驱动程序一起工作。

随着时间的推移,又添加了一些 ioctl,例如 NetBSD ioctl API 中不包含卷标签支持。

当前状态

尚未实现对多个传输臂的支持(到目前为止也没有人提出要求...)。

我本人使用 Grundig 的 35 槽 CD-ROM 点唱机测试和使用此驱动程序。我收到了一些报告称它与磁带自动加载器(Exabyte、HP 和 DEC)配合良好。有些人使用此驱动程序与 Amanda 一起。它在小型(11 槽)和大型(4 个 MOs,88 槽)磁光点唱机上运行良好。可能也适用于许多其他更换器,大多数(但不是全部 :-) 人们只有在它工作时才会给我发邮件...

我没有任何设备列表,既没有黑名单也没有白名单。因此,询问我特定设备是否受支持是相当没有意义的。理论上,所有支持 SCSI-2 介质更换器命令集的更换器设备都应该开箱即用地与此驱动程序配合使用。如果不行,那就是一个 bug。要么在驱动程序内部,要么在更换器设备的固件内部。

使用方法

这是一个主设备号为 86 的字符设备,因此使用“mknod /dev/sch0 c 86 0”来创建驱动程序的特殊文件。

如果模块找到了更换器,它会打印一些关于设备的消息[如果看不到任何内容,请尝试“dmesg”],并且应该出现在 /proc/devices 中。如果没有...一些更换器将 ID ? / LUN 0 用于设备,ID ? / LUN 1 用于机械手。但 Linux 默认查找 LUN 0 以外的 LUN,因为有太多损坏的设备。所以你可以尝试

  1. echo “scsi add-single-device 0 0 ID 1” > /proc/scsi/scsi(将 ID 替换为设备的 SCSI-ID)

  2. 在命令行中用“max_scsi_luns=1”启动内核(在 lilo.conf 中添加“append=”max_scsi_luns=1”应该可以奏效)

遇到问题?

如果你使用“insmod debug=1”加载驱动程序模块,它会变得非常详细,并向 syslog 打印大量信息。使用 CONFIG_SCSI_CONSTANTS=y 编译内核可以大大提高错误消息的质量,因为内核会将错误代码转换为人类可读的字符串。

你可以使用 dmesg 命令显示这些消息(或检查日志文件)。如果你因驱动程序问题而给我发送电子邮件提问,请务必包含这些消息。

Insmod 选项

debug=0/1

启用调试消息(见上文,默认值:0)。

verbose=0/1

启用详细输出(默认值:1)。

init=0/1

在模块加载时向更换器发送 INITIALIZE ELEMENT STATUS 命令(默认值:1)。

timeout_init=<seconds>

INITIALIZE ELEMENT STATUS 命令的超时时间(默认值:3600)。

timeout_move=<seconds>

所有其他命令的超时时间(默认值:120)。

dt_id=<id1>,<id2>,... / dt_lun=<lun1>,<lun2>,...

这两个选项允许指定数据传输元素的 SCSI ID 和 LUN。你可能不需要这个,因为点唱机应该提供这些信息。但有些设备不提供...

vendor_firsts=, vendor_counts=, vendor_labels=

这些 insmod 选项可用于告知驱动程序存在某些供应商特定的元素类型。例如,Grundig 就有这样的情况。一些点唱机有一个打印机,可以为新刻录的 CD 贴标签,该打印机被寻址为元素 0xc000(类型 5)。要将此供应商特定元素告知驱动程序,请使用此选项:

$ insmod ch                     \
        vendor_firsts=0xc000    \
        vendor_counts=1         \
        vendor_labels=printer

所有这三个 insmod 选项都接受最多四个逗号分隔的值,这样你就可以配置元素类型 5-8。你可能需要相关设备的 SCSI 规范来找到正确的值,因为它们不在 SCSI-2 标准的涵盖范围内。

致谢

我使用著名的全球邮件补丁方法编写了这个驱动程序。在以下人员(或多或少)的帮助下:

特别感谢

他提供了一个旧的、二手(但功能齐全)的 CD-ROM 点唱机,我现在用它来开发/测试驱动程序和工具。

玩得开心,

Gerd

Gerd Knorr <kraxel@bytesex.org>