第 2 章. sg 驱动程序的作用

sg 驱动程序允许用户应用程序向理解 SCSI 命令的设备发送 SCSI 命令。SCSI 命令的长度为 6、10、12 或 16 字节[1]。SCSI 磁盘驱动程序 (sd) 一旦设备初始化完成,就只会发送 SCSI READ 和 WRITE 命令。人们可能还想做一些其他有趣的事情,例如,执行低级格式化或打开写缓存。

与某些 SCSI 命令相关联的是要写入设备的数据。SCSI WRITE 命令就是一个明显的例子。当收到指令时,sg 驱动程序会安排将数据与 SCSI 命令一起传输到设备。较低级别的驱动程序(通常称为“主机总线适配器”[HBA] 或简称为“适配器”驱动程序)可能无法将命令发送到设备。这种情况的一个例子是当设备没有响应时,在这种情况下,“host_status”或“driver-status”错误将被传达回用户应用程序。

一切顺利的话,SCSI 命令(以及可选的一些数据)将被传送到设备。设备将以一个名为“scsi_status”的单字节值响应。“GOOD”是 scsi 状态,表示一切顺利。最常见的其他状态是“CHECK CONDITION”。在后一种情况下,SCSI 中间层会发出 REQUEST SENSE SCSI 命令。REQUEST SENSE 的响应长度为 18 个字节或更长,称为“sense buffer”(感应缓冲区)。它将指示原始命令可能未被执行的原因。重要的是要认识到,“CHECK CONDITION”的严重程度可能从信息性的(例如,命令需要在成功之前重试)到致命的(例如,“介质错误”,这通常表明是时候更换磁盘了)不等。

因此,在所有情况下,用户应用程序都应检查各种状态值。如有必要,“sense buffer”(感应缓冲区)将被复制回用户应用程序。像 READ 这样的 SCSI 命令会将数据传回用户应用程序(如果它们成功)。如有必要,sg 驱动程序会安排将数据从设备传输到用户空间。

到目前为止的描述都集中在磁盘设备上,但实际上,对于磁盘来说,sg 驱动程序并不是非常必要,因为已经有一个专门为此目的构建的设备驱动程序:sd。读取音频和数据 CD (sr [scd]) 以及磁带 (st) 也是如此。然而,理解 SCSI 命令集的扫描仪和 CDR “刻录”程序倾向于使用 sg 驱动程序。其他应用包括磁带“机器人”和音乐 CD “抓轨”。

要了解有关 SCSI(草案)标准和资源的更多信息,请访问 www.t10.org。要使用 sg 设备驱动程序,您应该熟悉您希望控制的设备支持的 SCSI 命令。获取扫描仪等设备的相关信息可能非常具有挑战性(如果供应商不提供)。

发送到 SCSI 设备的第一个 SCSI 命令是在初始化时发送的 INQUIRY 命令。所有 SCSI 设备都应及时响应 INQUIRY 命令,提供诸如供应商、产品名称和版本等信息。附录 C 展示了如何使用 sg 驱动程序发送 INQUIRY 命令并打印响应中的一些信息。

注释

[1]

SCSI 命令操作码 0x7f 允许可变长度命令,但 Linux 目前不支持。