SCSI 介质更换器驱动程序

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

这是为真正的自动点唱机设计的。它支持与常见的 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 源码兼容。因此,如果有任何软件(有人知道吗???)支持 BSDish 更换器驱动程序,它也应该可以与此驱动程序一起工作。

随着时间的推移,添加了一些 ioctl,例如,NetBSD ioctl API 未涵盖卷标签支持。

当前状态

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

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

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

使用它

这是一个主设备号为 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(用设备的 SCSI-ID 替换 ID)

  2. 在命令行上使用“max_scsi_luns=1”引导内核(在 lilo.conf 中附加“append=”max_scsi_luns=1”应该可以解决问题)

有问题吗?

如果您使用“insmod debug=1”插入驱动程序模块,它将非常详细,并在系统日志中打印大量内容。使用 CONFIG_SCSI_CONSTANTS=y 编译内核会大大提高错误消息的质量,因为内核会将错误代码转换为人类可读的字符串。

您可以使用 dmesg 命令显示这些消息(或检查日志文件)。如果您因为驱动程序的问题而给我发送一些问题,请包含这些消息。

Insmod 选项

debug=0/1

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

verbose=0/1

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

init=0/1

在 insmod 时向更换器发送 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>