磁带 SCSI 设备驱动程序
用途
支持顺序存取大容量存储介质设备驱动程序。
语法
#include <sys/devinfo.h>
#include <sys/scsi.h>
#include <sys/tape.h>与设备相关的子例程
大多数磁带操作是使用 开, 读, 写和 关闭 子例程实现的。 但是,如果要以 "诊断" 方式打开设备,那么必须使用 奥佩克斯 子例程。
打开和关闭子例程
奥佩克斯 子例程是供诊断命令和实用程序使用的。 执行需要相应的权限。 在没有适当授权的情况下试图执行该子程序,会导致该子程序返回 -1 值,并将 errno 全局变量设置为 EPERM 。
奥佩克斯 子例程允许设备驱动程序进入 "诊断" 方式并禁用命令重试逻辑。 此操作允许执行 ioctl 操作,这些操作执行与诊断处理相关的特殊功能。 其他 奥佩克斯 功能 (例如,强制打开和保留的预留) 也可用。
传递给 奥佩克斯 子例程的 扩展 参数将选择要用于目标设备的操作。 ext 参数在 /usr/include/sys/scsi.h 文件中定义。 此参数可以包含以下标志值的任意组合以逻辑方式一起 OR 运算:
| 标志值 | 描述 |
|---|---|
| SC_DIAGNOSTIC | 将所选设备置于诊断方式。 此方式是单入方式。 当设备处于诊断方式时,将在 开 或 关闭 操作期间执行 SCSI 操作并禁用错误日志记录。 在诊断方式下,仅接受 关闭 和 ioctl 操作。 所有其他设备支持的子程序返回 -1 值, errno 全局变量设置为 EACCES 值。 仅当目标设备当前未打开时,才能以诊断方式打开该设备。 如果尝试在诊断模式下打开设备,而目标设备已经打开,则返回 -1 值,并将 errno 全局变量设置为 EACCES 。 |
| SC_FORCED_OPEN | 强制总线设备复位 (BDR) ,而不考虑另一个启动器是否保留了该设备。 在 开 序列开始之前,会将 SCSI 总线设备复位发送至该设备。 否则, 开 操作将正常执行。 |
| SC_RETAIN_RESERVATION | 在执行 关闭 操作后,通过不发出发行版来保留设备的保留。 此标志阻止其他发起方使用该设备,除非它们破坏主机的预留。 |
内核扩展和设备支持编程概念 中的 "openx 子例程的 SCSI 选项" 提供了有关开放式操作的更多具体信息。
ioctl 子例程
STIOCMD ioctl 操作提供了将 SCSI 命令直接发送到磁带设备的方法。 这使应用程序能够发出特定 SCSI 命令,这些命令不受磁带设备驱动程序直接支持。
要使用 STIOCMD 操作,必须以 "诊断" 方式打开设备。 如果在设备未处于诊断模式时尝试此命令,将返回 -1 值,并将 errno 全局变量设置为 EACCES 值。 STIOCMD 操作用于传递 scsi_iocmd 结构的地址。 该结构在 /usr/include/sys/scsi_buf.h 文件中定义。
有关发出参数的信息,请参阅 小型计算机系统接口 (SCSI) 规范 以获取适用的设备。
错误情况
除了列出的那些错误之外,针对此设备的 ioctl , 开, 读和 写 子例程在以下情况下不成功:
| 错误 | 描述 |
|---|---|
| EACCES | 指示已向不处于诊断方式的设备发出诊断命令。 |
| EAGAIN | 指示已尝试打开已经打开的设备。 |
| EBUSY | 指示目标设备已由另一个发起方保留。 |
| EINVAL | 指示提供了 O_APPEND 值作为打开方式。 |
| EINVAL | 指示由 读 或 写 操作提供的 nbyte 参数不是块大小的倍数。 |
| EINVAL | 指示 ioctl 操作的某个参数无效。 |
| EINVAL | 指示所请求的 ioctl 操作在当前设备上不受支持。 |
| EIO | 指示磁带机已复位或磁带已被更改。 如果先前对磁带执行的操作在关闭时使磁带超出磁带开始位置,那么打开时将返回此错误。 |
| EIO | 指示设备无法将指定的记录数向前移动或反向移动st_count迂到 EOM (介质结束) 或文件标记之前的字段。 |
| EMEDIA | 指示磁带设备迂到了不可恢复的介质错误。 |
| 电子文件 | 指示已尝试对已具有允许的最大打开设备数的 SCSI 适配器执行 开 操作。 |
| ENOTREADY | 指示磁带机中没有磁带,或者磁带机未准备就绪。 |
| ENXIO | 指示已尝试写入到 EOM 处的磁带。 |
| EPERM | 指示此子例程需要适当的权限。 |
| ETIMEDOUT | 指示某个命令已超时。 |
| EWRPROTET | 指示在只读磁带上尝试了请求读/写方式的 开 操作。 |
| EWRPROTET | 指示已在只读磁带上尝试执行影响介质的 ioctl 操作。 |
可靠性和可维护性信息
从磁带设备返回的错误如下所示:
| 错误 | 描述 |
|---|---|
| 异常中止命令 | 指示设备已结束命令。 |
| 空白检查 | 指示读取命令迂到了空白磁带。 |
| 数据保护 | 指示在受写保护的磁带上尝试了写操作。 |
| 良好完成 | 表示命令成功完成。 |
| 硬件错误 | 指示在命令执行期间或自测试期间发生了不可恢复的硬件故障。 |
| 非法的请求 | 指示非法命令或命令参数。 |
| 介质错误 | 指示该命令已终止,但出现未恢复的介质错误情况。 此情况可能是由磁带缺陷或脏头引起的。 |
| 未就绪 | 指示逻辑单元处于脱机状态。 |
| 已恢复的错误 | 指示在应用某些恢复后该命令成功。 |
| 单元辅助操作请求 | 指示设备已重置或已打开电源。 |
每次发生上述列表中的介质,硬件和异常终止命令错误时,都将记录这些错误。 异常中止命令 错误可能是可恢复的,但如果恢复失败,那么将记录该错误。 对于 已恢复错误 和已恢复的 异常中止命令 错误类型,将保留阈值; 超过这些阈值时,将记录错误。 然后将清除阈值。
磁带设备介质错误的错误记录值
在错误记录模板中为磁带设备介质错误定义的字段为:
| 字段 | 描述 |
|---|---|
| Comment | 等于磁带介质错误。 |
| Class | 等于 H ,表示发生硬件错误。 |
| Report | 等于 TRUE ,表示在生成错误报告时应包含此错误。 |
| Log | 等于 TRUE ,指示在发生此错误时应创建错误日志条目。 |
| Alert | 等于 FALSE ,表示此错误不可警告。 |
| Err_Type | 等于 PERM ,表示永久性失败。 |
| Err_Desc | 等于 1332 ,指示磁带操作发生故障。 |
| Prob_Causes | 等于 5003 ,表示磁带介质。 |
| User_Causes | 等于 5100 和 7401 ,分别表示源自磁带和有缺陷的介质的原因。 |
| User_Actions | 等于 1601 和 0000 ,分别表明应更换可移动介质并重试操作,并应执行问题确定过程。 |
| Inst_Causes | 无。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于 5003 ,表示磁带介质。 |
| Fail_Actions | 等于 1601 和 0000 ,分别表示应更换可移动介质并重试操作,并应执行问题确定过程。 |
该Detail_Data字段包含命令类型,设备和适配器状态,以及来自发生错误的特定设备的请求检测信息。 该Detail_Data字段包含在 err_rec 结构中。 此结构在 /usr/include/sys/errids.h 文件中定义。 sc_error_log_df 结构,它描述了包含在Detail_Data字段在 /usr/include/sys/scsi.h 文件中定义。
有关特定请求检测信息的格式,请参阅 小型计算机系统接口 (SCSI) 规范 以获取适用的设备。
错误-磁带或硬件异常终止命令错误的记录值
err_hdr 结构中的字段 (如 /usr/include/sys/erec.h 文件中针对硬件错误和异常中止的命令错误所定义) 为:
| 字段 | 描述 |
|---|---|
| Comment | 等于磁带硬件或异常中止命令错误。 |
| Class | 等于 H ,表示发生硬件错误。 |
| Report | 等于 TRUE ,表示在生成错误报告时应包含此错误。 |
| Log | 等于 TRUE ,指示在发生此错误时应创建错误日志条目。 |
| Alert | FALSE ,指示此错误不可警醒。 |
| Err_Type | 等于 PERM ,表示永久性失败。 |
| Err_Desc | 等于 1331 ,表示磁带机出现故障。 |
| Prob_Causes | 等于 6314 ,指示磁带机发生错误。 |
| User_Causes | 无。 |
| User_Actions | 等于 0000 ,指示应该执行问题确定过程。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于 5003 和 6314 ,表明故障原因分别是磁带和磁带机。 |
| Fail_Actions | 等于 0000 以执行问题确定过程。 |
该Detail_Data字段包含命令类型,设备和适配器状态,以及来自发生错误的特定设备的请求检测信息。 该Detail_Data字段包含在 err_rec 结构中。 此结构在 /usr/include/sys/errids.h 文件中定义。 sc_error_log_df 结构,它描述了包含在Detail_Data字段在 /usr/include/sys/scsi.h 文件中定义。
有关特定请求检测信息的格式,请参阅 小型计算机系统接口 (SCSI) 规范 以获取适用的设备。
错误-已超过磁带的记录值-已恢复错误阈值
err_hdr 结构中定义的字段 (如 /usr/include/sys/erec.h 文件中针对已超过阈值计数器的已恢复错误所定义) 为:
| 字段 | 描述 |
|---|---|
| Comment | 指示已超过磁带已恢复的错误阈值。 |
| Class | 等于 H ,表示发生硬件错误。 |
| Report | 等于 TRUE ,表示在生成错误报告时应包含此错误。 |
| Log | 等于 TRUE ,指示在发生此错误时应创建错误日志条目。 |
| Alert | 等于 FALSE ,表示此错误不可警告。 |
| Err_Type | 等于 PERM ,表示永久性失败。 |
| Err_Desc | 等于 1331 ,表示磁带机出现故障。 |
| Prob_Causes | 等于 5003 和 6314 ,指示可能原因分别是磁带机和磁带机。 |
| User_Causes | 等于 5100 和 7401 ,分别表示介质有缺陷,读/写头很脏。 |
| User_Actions | 等于 1601 和 0000 ,表示应分别更换可移动介质和重试操作,并执行问题确定过程。 |
| Inst_Causes | 无。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于 5003 和 6314 ,指示原因分别是磁带机和磁带机。 |
| Fail_Actions | 等于 0000 ,以执行问题确定过程。 |
该Detail_Data字段包含命令类型,设备和适配器状态,以及来自发生错误的特定设备的请求检测信息。 此字段包含在 err_rec 结构中。 err_rec 结构在 /usr/include/sys/errids.h 文件中定义。 该Detail_Data字段还指定超过阈值的错误类型。 sc_error_log_df 结构,它描述了包含在Detail_Data字段在 /usr/include/sys/scsi.h 文件中定义。
有关特定请求检测信息的格式,请参阅 小型计算机系统接口 (SCSI) 规范 以获取适用的设备。
磁带 SCSI 适配器的错误记录值-检测到错误
在 /usr/include/sys/erec.h 文件中为适配器检测到的错误定义的 err_hdr 结构中的字段为:
| 字段 | 描述 |
|---|---|
| Comment | 等于磁带 SCSI 适配器检测到的错误。 |
| Class | 等于 H ,表示发生硬件错误。 |
| Report | 等于 TRUE ,表示在生成错误报告时应包含此错误。 |
| Log | 等于 TRUE ,指示在发生此错误时应创建错误日志条目。 |
| Alert | 等于 FALSE ,表示此错误不可警告。 |
| Err_Type | 等于 PERM ,表示永久性失败。 |
| Err_Desc | 等于 1331 ,表示磁带机出现故障。 |
| Prob_Causes | 等于 3300 和 6314 ,分别表示适配器和磁带机出现故障。 |
| User_Causes | 无。 |
| User_Actions | 等于 0000 ,指示应该执行问题确定过程。 |
| Inst_Causes | 无。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于 3300 和 6314 ,分别表示适配器和磁带机出现故障。 |
| Fail_Actions | 等于 0000 ,以执行问题确定的过程。 |
该Detail_Data字段包含命令类型和适配器状态。 此字段包含在 err_rec 结构中,该结构由 /usr/include/sys/err_rec.h 文件定义。 请求-检测信息不可用,并带有此类错误。 sc_error_log_df 结构描述包含在以下内容中的信息:Detail_Data字段,在 /usr/include/sys/scsi.h 文件中定义。
有关特定请求检测信息的格式,请参阅 小型计算机系统接口 (SCSI) 规范 以获取适用的设备。
错误-记录磁带机清洁错误的值
某些磁带机在需要清洁时返回错误。 在此类下对需要清洁的驱动器进行分组时发生的错误。
| 字段 | 描述 |
|---|---|
| Comment | 指示磁带机需要进行清洁。 |
| Class | 等于 H ,表示发生硬件错误。 |
| Report | 等于 TRUE ,表示在生成错误报告时应包含此错误。 |
| Log | 等于 TRUE ,指示在发生此错误时应创建错误日志条目。 |
| Alert | 等于 FALSE ,表示此错误不可警告。 |
| Err_Type | 等于 TEMP ,指示发生临时故障。 |
| Err_Desc | 等于 1332 ,表示磁带操作错误。 |
| Prob_Causes | 等于 6314 ,表示可能原因是磁带机。 |
| User_Causes | 等于 7401 ,表示脏的读/写头。 |
| User_Actions | 等于 0000 ,指示应该执行问题确定过程。 |
| Inst_Causes | 无。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于 6314 ,表示原因为磁带机。 |
| Fail_Actions | 等于 0000 ,表示要执行问题确定过程。 |
该Detail_Data字段包含命令类型和适配器状态,以及来自发生错误的特定设备的请求检测信息。 此字段包含在 err_rec 结构中,该结构由 /usr/include/sys/errids.h 文件定义。 sc_error_log_df 结构描述包含在以下内容中的信息:Detail_Data字段,在 /usr/include/sys/scsi.h 文件中定义。
有关特定请求检测信息的格式,请参阅 小型计算机系统接口 (SCSI) 规范 以获取适用的设备。
错误-记录未知错误的值
由于未知原因而发生的错误将在此类中进行分组。 数据保护错误将属于此类。 这些由磁带设备驱动程序检测到的错误从未在磁带机中出现过。
未知错误的 err_hdr 结构描述了以下字段:
| 字段 | 描述 |
|---|---|
| Comment | 等于磁带未知错误。 |
| Class | 等于所有错误类。 |
| Report | 等于 TRUE ,表示在生成错误报告时应包含此错误。 |
| Log | 等于 TRUE ,指示在发生此错误时应该创建错误日志条目。 |
| Alert | 等于 FALSE ,表示此错误不可警告。 |
| Err_Type | 等于 UNKN ,指示错误类型是未知的。 |
| Err_Desc | 等于 0xFE00,指示错误描述是未知的。 |
| Prob_Causes | 无。 |
| User_Causes | 无。 |
| User_Actions | 无。 |
| Inst_Causes | 无。 |
| Inst_Actions | 无。 |
| Fail_Causes | 等于 0xFFFF,表示失败原因未知。 |
| Fail_Actions | 等于 0000 ,指示应该执行问题确定过程。 |
该Detail_Data字段包含命令类型和适配器状态,以及来自发生错误的特定设备的请求检测信息。 该Detail_Data字段包含在 err_rec 结构中。 此字段包含在 /usr/include/sys/errids.h 文件中。 sc_error_log_df 结构描述包含在以下内容中的信息:Detail_Data字段,在 /usr/include/sys/scsi.h 文件中定义。
有关特定请求检测信息的格式,请参阅 小型计算机系统接口 (SCSI) 规范 以获取适用的设备。
文件
/dev/rmt0, /dev/rmt0.1, /dev/rmt0.2, ..., /dev/rmt0.7,
/dev/rmt1, /dev/rmt1.1, /dev/rmt1.2, ..., /dev/rmt1.7,...,
| 项 | 描述 |
|---|---|
| /dev/rmt255, /dev/rmt255.1, /dev/rmt255.2, ..., /dev/rmt255.7 | 提供一个接口,以允许 SCSI 设备驱动程序访问 SCSI 磁带机。 |