USB 大容量存储客户机设备驱动程序

用途

支持通用串行总线 (USB) 协议,用于大容量存储和大容量类型硬盘,可移动磁盘驱动器 (RDX) ,闪存驱动器, CD-ROM , DVD-RAM ,蓝光只读和读/写光学存储器设备。

语法

#include <sys/devinfo.h>
#include <sys/scsi.h>
#include <sys/scdisk.h>
#include <sys/ide.h>
#include <sys/usb.h>
#include <sys/usbdi.h>
#include <sys/mstor.h>

描述

典型的 USB 硬盘, RDX ,闪存驱动器, CD-ROM , DVD-RAM ,蓝光只读和读/写光盘驱动器操作是使用 openclosereadwriteioctl 子例程实现的。

与设备相关的子例程

USB 大容量存储设备驱动程序仅支持 opencloseioctlconfig 子例程。

打开和关闭子例程

openx 子例程主要由诊断命令和实用程序使用。 运行子例程需要适当的权限。 如果在没有必要授权的情况下运行 open 子例程,该子例程将返回 -1 值,并将 errno 全局变量设置为 EPERM 值。

奥佩克斯 子例程中指定的 扩展 参数将选择要用于目标设备的操作。 /usr/include/sys/usb.h 文件定义 ext 参数的可能值。

扩展 参数可包含下列标志值的任何逻辑组合:

描述
SC_DIAGNOSTIC 将所选设备置于 Diagnostic 方式。 此方式是单独进入的,这意味着一次只能有一个进程可以打开设备。 当设备处于 Diagnostic 方式时,将在 openclose 操作期间初始化 USB 设备,并禁用错误日志记录。 在 Diagnostic 方式下,仅接受 closeioctl 子例程操作。 所有其他设备支持的子程序都返回 -1 值,并将 errno 全局变量设置为 EACCES 值。

仅当当前未打开目标设备时,才能以 Diagnostic 方式打开设备。 如果在目标设备已打开的情况下以 Diagnostic 模式打开设备,子程序将返回 -1 值,并将 errno 全局变量设置为 EACCES 值。

SC_SINGLE 将所选设备置于 Exclusive Access 方式。 一次只能有一个进程以 Exclusive Access 方式打开设备。

仅当设备当前未打开时,才能以 Exclusive Access 方式打开该设备。 如果在 Exclusive Access 模式下打开设备,而设备已经打开,则子程序返回 -1 值,并将 errno 全局变量设置为 EBUSY 值。 如果 SC_DIAGNOSTIC 标志与 SC_SINGLE 标志一起指定,那么设备将处于 Diagnostic 方式。

readx 和 writex 子例程

readxwritex 子例程在 USB 设备上不受支持。 即使调用了这些参数,也不会处理 ext 参数。

ioctl 子例程

用于 usbcd 设备驱动程序的 ioctl 子例程操作特定于以下类别的 USB 设备:
  • 所有 USB 设备的常见 ioctl 操作
  • USB 硬盘,闪存驱动器和 RDX 设备
  • USB CD-ROM 和读/写光学设备

所有 USB 设备都支持公共 ioctl 操作

以下 ioctl 操作可用于硬盘,闪存驱动器, RDX , CD-ROM 和读/写光学设备:

操作 描述
DKiordse 向该设备发出读命令,并在发生错误时获取目标设备检测数据。 如果 DKIORDSE 操作返回 -1 值,并且 status_validity 字段设置为 SC_SCSI_ERROR 值,则会返回有效的感测数据。 否则,将省略目标检测数据。

提供了 DKIORDSE 操作以供诊断使用。 它允许在活动系统环境中运行时对目标设备进行有限的使用。 DKIORDSE 操作的 arg 参数包含 sc_rdwrt 结构的地址。 此结构在 /usr/include/sys/scsi.h 文件中定义。

devinfo 结构定义读操作的最大传输大小。 如果传输量超过最大限制,子程序将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。

注: 发出 read 命令以从 CD-ROM 设备获取检测数据时,可以将 CDIORDSE 操作替换为 DKIORDSE 操作。 DKIORDSE 操作是建议的操作。
DKIOCMD 在以 NormalDiagnostic 方式成功打开设备时, DKIOCMD 操作可以向指定的设备发出任何小型计算机系统接口 (SCSI) 命令。 设备驱动程序不会记录该操作的任何错误恢复或故障。

SCSI 状态字节和适配器状态字节通过 arg 参数返回,该参数包含在 /usr/include/sys/scsi.h 文件中定义的 sc_iocmd 结构的地址。 如果 DKIOCMD 操作失败,子程序将返回 -1 值,并将 errno 全局变量设置为非零值。 在此情况下,调用者必须对返回的状态字节进行求值,以确定操作失败的原因以及恢复操作。

devinfo 结构定义命令的最大传输大小。 如果传输量超过最大值,子程序将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。

DKIOCMD (续) 以下示例代码向 usbms0 设备发出 DKIOCMD ioctl 操作以获取 SCSI 标准查询数据:
    char sense_data[255];
    char *data_buffer=NULL;
    struct sc_iocmd sciocmd;
....

    fd = open("/dev/usbms0", O_RDWR);
    if (fd == -1){
        printf("\niocmd: Open FAIL\n");
        exit(-1);
    }

    memset(&sciocmd, '\0', sizeof(struct scsi_iocmd));
    sciocmd.version = SCSI_VERSION_1;
    sciocmd.timeout_value = 30;
    sciocmd.command_length = 6;
    sciocmd.flags = B_READ;
    sciocmd.autosense_length = 255;
    sciocmd.autosense_buffer_ptr = &sense_data[0];

    sciocmd.data_length = 0xFF;
    sciocmd.buffer = inq_data;
    sciocmd.scsi_cdb[0] = SCSI_INQUIRY;
    sciocmd.scsi_cdb[1] = 0x00; /* Standard Inquiry*/
    sciocmd.scsi_cdb[2] = 0x00;
    sciocmd.scsi_cdb[3] = 0x00;
    sciocmd.scsi_cdb[4] = 0xFF;
    sciocmd.scsi_cdb[5] = 0x00;

    if ((rc=ioctl(fd, DKIOCMD, &sciocmd)) != 0){
        printf("iocmd: Ioctl FAIL errno %d\n",errno);
        printf("status_validity: %x, scsi_status: %x, adapter_status:%x\n",
               sciocmd.status_validity, sciocmd.scsi_bus_status,
               sciocmd.adapter_status);
        hexdump(sense_data, (long)20);
        close(fd);
        exit(-1);
    } else {
        printf("cdiocmd : Ioctl PASS\n");
        if (cmd = SCSI_INQUIRY)
            hexdump(inq_data,0x20);
    }

    close(fd);
DKIOLCMD 在以 NormalDiagnostic 方式成功打开设备时, DKIOLCMD 操作可以向指定的设备发出任何 SCSI 命令。 设备驱动程序不记录该操作的任何错误恢复故障。

ioctl 操作类似于用于向 USB 海量存储设备发出 16 字节 SCSI 命令的 DKIOCMD16 操作。

SCSI 状态字节和适配器状态字节通过包含 sc_iocmd16cdb 结构地址的 arg 参数返回。 此结构在 /usr/include/sys/scsi.h 文件中定义。 如果 DKIOLCMD 操作失败,子程序将返回 -1 值,并将 errno 全局变量设置为非零值。 在此情况下,调用者必须对返回的状态字节进行求值,以确定操作失败的原因以及恢复操作。

在完成 DKIOLCMD ioctl 请求时,残差字段指示设备未完全满足此请求的剩余数据。 在成功完成时,剩余字段指示设备没有所请求的所有数据,或者设备的数据量小于所请求的数据量。 在请求失败时,必须检查 status_validity 字段以确定是否存在有效的 SCSI 总线问题。 在这种情况下,残差字段指示设备针对此请求未能完成的字节数。

devinfo 结构定义命令的最大传输大小。 如果传输量超过最大值,子程序将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。

DKIOLCMD (续) 以下示例代码向 usbms0 设备发出 DKIOLCMD ioctl 操作以获取 SCSI 标准查询数据:
    char sense_data[255];
    char *data_buffer=NULL;
    struct sc_iocmd16cdb sciocmd;
....

    fd = open("/dev/usbms0", O_RDWR);
    if (fd == -1){
        printf("\niocmd: Open FAIL\n");
        exit(-1);
    }

    memset(&sciocmd, '\0', sizeof(struct scsi_iocmd));
    sciocmd.version = SCSI_VERSION_1;
    sciocmd.timeout_value = 30;
    sciocmd.command_length = 6;
    sciocmd.flags = B_READ;
    sciocmd.autosense_length = 255;
    sciocmd.autosense_buffer_ptr = &sense_data[0];

    sciocmd.data_length = 0xFF;
    sciocmd.buffer = inq_data;
    sciocmd.scsi_cdb[0] = SCSI_INQUIRY;
    sciocmd.scsi_cdb[1] = 0x00; /* Standard Inquiry*/
    sciocmd.scsi_cdb[2] = 0x00;
    sciocmd.scsi_cdb[3] = 0x00;
    sciocmd.scsi_cdb[4] = 0xFF;
    sciocmd.scsi_cdb[5] = 0x00;

    if ((rc=ioctl(fd, DKIOCMD, &sciocmd)) != 0){
        printf("iocmd: Ioctl FAIL errno %d\n",errno);
        printf("status_validity: %x, scsi_status: %x, adapter_status:%x\n",
               sciocmd.status_validity, sciocmd.scsi_bus_status,
               sciocmd.adapter_status);
        hexdump(sense_data, (long)20);
        close(fd);
        exit(-1);
    } else {
        printf("cdiocmd : Ioctl PASS\n");
        if (cmd = SCSI_INQUIRY)
            hexdump(inq_data,0x20);
    }

    close(fd);
DK_PASSTHRU 成功打开设备时, DK_PASSTHRU 操作可以向指定的设备发出任何 SCSI 命令。 如果此操作失败,那么设备驱动程序将执行有限的错误恢复。 DK_PASSTHRU 操作与 DKIOCMD 操作不同,因此它不需要带有 SC_DIAGNOSTIC 字段的 ext 自变量的 openx 命令。 因此,可以向其他操作正在使用的设备发出 DK_PASSTHRU 操作。

SCSI 状态字节和适配器状态字节通过包含 sc_passthru 结构地址的 arg 参数返回。 此结构在 /usr/include/sys/scsi.h 文件中定义。 如果 DK_PASSTHRU 操作失败,子程序将返回 -1 值,并将 errno 全局变量设置为非零值。 在此情况下,调用者必须对返回的状态字节进行求值,以确定操作失败的原因以及恢复操作。

如果 DK_PASSTHRU 操作因 sc_passthru 结构中的字段值无效而失败,子程序将返回 -1 值,并将 errno 全局变量设置为 EINVALeinval_arg 字段设置为具有无效值的字段的字段号 (对于版本字段,以 1 开头)。 einval_arg 字段的值 0 指示没有关于故障的其他信息可用。

sc_passthru 结构的版本字段可以设置为 SCSI_VERSION_2 的值,您可以指定以下字段:
  • variable_cdb_ptr 字段是指向包含 cdb 变量的缓冲区的指针。
  • variable_cdb_length 字段确定 variable_cdb_ptr 字段指向的 cdb 变量的长度。

在完成 DK_PASSTHRU 请求时,残差字段指示设备未完全满足此请求的剩余数据。 在成功完成时,剩余字段指示设备没有所请求的所有数据,或者设备的数据量小于所请求的数据量。 在请求失败时,必须检查 status_validity 字段以确定是否存在有效的 SCSI 总线问题。 在这种情况下,残差字段指示设备针对此请求未能完成的字节数。

devinfo 结构定义命令的最大传输大小。 如果尝试传输的大小超过最大传输大小,子程序将返回 -1 值,将 errno 全局变量设置为 EINVAL 值,并将 einval_arg 字段设置为 SC_PASSTHRU_INV_D_LEN 值。 这些值在 /usr/include/sys/scsi.h 文件中定义。

注: 如果以非 root 用户身份调用 DK_PASSTHRU 操作,那么该操作将失败并返回 EACCES 错误值而不是 EPERM 值。
DK_PASSTHRU (续) 以下示例代码向 usbms0 设备发出 DK_PASSTHRU ioctl 操作以获取 SCSI 标准查询数据:
    char sense_data[255];
    char *data_buffer=NULL;
    struct sc_passthru sciocmd;
....

    fd = open("/dev/usbms0", O_RDWR);
    if (fd == -1){
        printf("\npassthru: Open FAIL\n");
        exit(-1);
    }

    memset(&sciocmd, '\0', sizeof(struct sc_passthru));
    sciocmd.version = SCSI_VERSION_1;
    sciocmd.timeout_value = 30;
    sciocmd.command_length = 6;
    sciocmd.autosense_length = 255;
    sciocmd.autosense_buffer_ptr = &sense_data[0];

    sciocmd.data_length = 0xFF;
    sciocmd.buffer = inq_data;

    sciocmd.flags = B_READ;

    sciocmd.scsi_cdb[0] = SCSI_INQUIRY;
    sciocmd.scsi_cdb[1] = 0x00; /* Standard Inquiry*/
    sciocmd.scsi_cdb[2] = 0x00;
    sciocmd.scsi_cdb[3] = 0x00;
    sciocmd.scsi_cdb[4] = 0xFF;
    sciocmd.scsi_cdb[5] = 0x00;

    if ((rc=ioctl(fd, DK_PASSTHRU, &sciocmd)) != 0){
        if (sciocmd.adap_set_flags & SC_AUTOSENSE_DATA_VALID) {
            /* look at sense data */
        } /* end SC_AUTOSENSE_DATA_VALID */

        printf("passthru: Ioctl FAIL errno %d\n",errno);
        printf("status_validity: %x, scsi_status: %x, adapter_status:%x\n",
               sciocmd.status_validity, sciocmd.scsi_bus_status,
               sciocmd.adapter_status);
        printf("Residual: %x\n", sciocmd.residual);
        exit(-1);
    } else {
        printf("passthru: Ioctl PASS\n");
        printf("status_validity: %x, scsi_status: %x, adapter_status:%x\n",
               sciocmd.status_validity, sciocmd.scsi_bus_status,
               sciocmd.adapter_status);
        printf("Residual: %x\n", sciocmd.residual);
        /* inq_data buffer has valid Standard Inquiry data */
    }

针对 USB 硬盘,闪存驱动器和 RDX 设备的 ioctl 操作

以下 ioctl 操作仅适用于 USB 硬盘,闪存驱动器和 RDX 设备:

操作 描述
IOCINFO 返回 /usr/include/sys/devinfo.h 文件中定义的 devinfo 结构。 IOCINFO 操作是唯一为所有使用 ioctl 子例程的设备驱动程序定义的操作。 将返回以下值:
devinfo.devtype = DD_SCDISK;
devinfo.flags =(uchar)DF_RAND;
devinfo.devsubtype = 0x00;
devinfo.un.scdk.max_request = Maximum_transfer_supported_by_usbcd_driver;
devinfo.un.scdk.numblks = Largest_LBA_supported_by_device+1;
devinfo.un.scdk.blksize = Block_size_set_for_the_USB_Disk/Flash/RDX_Device;
DKPMR 在成功打开设备时发出 SCSI 阻止介质除去 (PMR) 命令。 此命令可防止介质弹出,直到设备关闭,电源关闭并重新启动,或直到发出 DKAMR 操作为止。 DKAMR 操作的 arg 参数为空。 如果 DKAMR 操作成功,那么子例程将返回值 0。 如果设备是 SCSI 硬盘,则 DKAMR 操作失败,子程序返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 如果 DKAMR 操作因任何其他原因失败,子程序将返回 -1 值,并将 errno 全局变量设置为 EIO 值。
注: 提供此功能的目的是支持支持弹出介质盒带的 USB RDX 设备。
DKAMR 在成功打开设备时发出 "允许除去介质" (AMR) 命令。 然后,可以使用驱动程序的弹出按钮或 DKEJECT 操作来弹出介质。 此 ioctl 操作的 arg 参数为空。 如果 DKAMR 操作成功,那么子例程将返回值 0。 如果设备是 SCSI 硬盘,那么 DKAMR 操作将失败。 此外,该子程序还会返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 对于此操作失败的任何其他原因,子例程返回 -1 值,并将 errno 全局变量设置为 EIO 值。
注: 提供此功能的目的是支持支持弹出介质盒带的 USB RDX 设备。

CD-ROM 和读/写光学设备的 ioctl 操作

以下 ioctl 操作可用于 CD-ROM 和读/写光学设备:

操作 描述
IOCINFO 返回 /usr/include/sys/devinfo.h 文件中定义的 devinfo 结构。 IOCINFO 操作是唯一为所有使用 ioctl 子例程的设备驱动程序定义的操作。 将返回以下值:
devinfo.devtype = DD_CDROM;
devinfo.flags = (uchar)DF_RAND;
devinfo.devsubtype = 0x00;
devinfo.un.idecd.numblks = 
  Largest logical block addressing (LBA) supported by device + 1;
devinfo.un.idecd.blksize = Block size set for the USB Disk, flash, or RDX device;
Idepassthru 在成功打开设备时,向指定设备发出 AT 连接包接口 (ATAPI) 命令。 IDEPASSTHRU 操作不需要带有 SC_DIAGNOSTIC 值的 ext 自变量的 openx 命令。 因此,可以向其他操作正在使用的设备发出 IDEPASSTHRU 操作。

AT 附件 (ATA) 状态字节和 ATA 错误字节通过 arg 参数返回。 此参数包含 /usr/include/sys/ide.h 文件中定义的 ide_ata_passthru 结构的地址。 如果 IDEPASSTHRU 操作失败,子程序将返回 -1 值,并将 errno 全局变量设置为非零值。 在此情况下,调用者将评估返回的状态字节以确定操作失败的原因以及恢复操作。

如果 IDEPASSTHRU 操作失败,那么设备驱动程序将执行有限的错误恢复。 如果由于 ide_ata_passthru 结构中的某个字段具有无效值而导致操作失败,则子程序会返回 -1 值,并将 errno 全局变量设置为 EINVAL

成功完成 IDEPASSTHRU 请求时,残差字段指示设备没有所请求的所有数据,或者设备的数据量小于所请求的数据量。 如果 IDEPASSTHRU 请求失败,那么残差字段指示设备对此请求未能完成的字节数。

IDEPASSTHRU (续)

以下示例代码发出使用 IDEPASSTHRU 操作的 SCSI 查询命令:

    struct ide_atapi_passthru atapicmd;
    char inq_buffer[255];
    uchar sense_data[255];
 
    /* set up the arg parameter block */
    memset(&atapicmd, '\0', sizeof(struct ide_atapi_passthru));
    memset(sense_data, '\0', 255);

    atapicmd.ide_device = 0;
    atapicmd.flags = IDE_PASSTHRU_READ;
    atapicmd.timeout_value    = 30;
    atapicmd.rsv0             = IDE_PASSTHRU_VERSION_01;
    atapicmd.rsv1             = 0;
    atapicmd.atapi_cmd.length = 12;
    atapicmd.atapi_cmd.resvd  = 0;
    atapicmd.atapi_cmd.resvd1 = 0;
    atapicmd.atapi_cmd.resvd2 = 0;

    atapicmd.data_ptr = inq_buffer;
    atapicmd.buffsize = 0xFF;

    atapicmd.atapi_cmd.packet.opcode  = SCSI_INQUIRY;
    atapicmd.atapi_cmd.packet.byte[0] = (0x00 | vpd)  ;  /*Standard Inquiry */
    atapicmd.atapi_cmd.packet.byte[1] = page_code;  /*Page Code-Valid if vpd=1 */
    atapicmd.atapi_cmd.packet.byte[2] = 0x00;
    atapicmd.atapi_cmd.packet.byte[3] = 0xFF;
    atapicmd.atapi_cmd.packet.byte[4] = 0x00;

    atapicmd.sense_data        = sense_data;
    atapicmd.sense_data_length = 255;

    fd = openx(“/dev/cd0”, O_RDWR, NULL, SC_DIAGNOSTIC);
    if (fd == -1) {
         printf("IDEPASSTHRU: Openx failed with errno %x \n", errno);
         exit(-1);
    }

   if ((rc = ioctl(fd, IDEPASSTHRU, &atapicmd) != 0)) {
         printf("IDEPASSTHRU: IOCTL Failed");
         printf("errno %d\n",errno);
         printf("ata_status: %x, ata_error:%x\n",
                atapicmd.ata_status, atapicmd.ata_error);
         close(fd);
         exit(-1);
     } else {
         printf("IDEPASSTHRU : Ioctl PASS\n");
         printf("ata_status: %x, ata_error: %x\n",
                atapicmd.ata_status, atapicmd.ata_error);
     }
     close(fd);
DKPMR 在成功打开设备时发出 "小型计算机系统接口" (SCSI) 阻止除去介质命令。 此命令可防止介质弹出,直到设备关闭,关闭电源,然后再打开电源,或者直到发出 DKAMR 操作为止。 DKPMR 操作的 arg 参数为空。 如果 DKPMR 操作成功,那么子例程将返回值 0。 如果设备是 SCSI 硬盘,则 DKPMR 操作失败,子程序返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 如果 DKPMR 操作因任何其他原因失败,子程序将返回 -1 值,并将 errno 全局变量设置为 EIO 值。
DKAMR 在成功打开设备时发出允许除去介质命令。 可以使用磁带机弹出按钮或 DKEJECT 操作来弹出介质。 此操作的 arg 参数为空。 如果 DKAMR 操作成功,那么子例程将返回值 0。 如果设备是 SCSI 硬盘,DKAMR 操作将失败,子程序将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 对于操作失败的任何其他原因,子例程返回 -1 值,并将 errno 全局变量设置为 EIO 值。
DKEJECT 当设备成功打开时,向磁带机发出弹出介质命令。 此操作的 arg 参数为空。 如果 DKEJECT 操作成功,那么子例程将返回值 0。 如果设备是 SCSI 硬盘,则 DKEJECT 操作失败,子程序返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 对于操作失败的任何其他原因,子例程返回 -1 值,并将 errno 变量设置为 EIO 值。
DKAudio 向指定的设备发出播放音频命令,并控制设备的输出端口上的卷。 播放音频命令可播放,暂停,恢复,停止,确定磁道数,并确定当前音频操作的状态。 DKAUDIO 操作仅通过 CD-ROM 驱动器的输出端口播放音频。 此操作的 arg 参数是 /usr/include/sys/scdisk.h 文件中定义的 cd_audio_cmds 结构的地址。 专用访问方式是必需的。

如果在设备的音频支持属性设置为 No 时尝试 DKAUDIO 操作,子程序将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 如果 DKAUDIO 操作失败,子程序将返回 -1 值,并将 errno 全局变量设置为非零值。 在此情况下,调用者必须评估返回的状态字节以确定操作失败和恢复操作的原因。

DK_CD_MODE 发出下列其中一个命令:
CD_GET_MODE
成功打开设备时,在 mode_form_op 结构的 cd_mode_form 字段中返回当前 CD-ROM 数据方式。
CD_CHG_MODE
当设备以互斥存取方式成功打开时,将 CD-ROM 数据方式更改为 mode_form_op 结构的 cd_mode_form 字段中指定的方式。

如果 CD-ROM 没有通过使用模式选择密度代码来配置不同的数据模式,并且通过将 change_mode_form 结构的操作字段设置为 CD_CHG_MODE 命令来更改 CD-ROM 的数据模式,则子程序将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值。 将 CD-ROM 模式更改为任何 DVD 模式的尝试也会导致 -1 返回值和 errno 全局变量设置为 EINVAL。 如果在设备未处于独占访问模式时尝试执行 DK_CD_MODE 命令的 CD_CHG_MODE 操作,子例程将返回 -1 值,并将 errno 全局变量设置为 EACCES 值。 对于操作失败的任何其他原因,子例程返回 -1 值,并将 errno 全局变量设置为 EIO 值。

设备硬件需求

USB 硬盘驱动器,闪存驱动器, RDX , CD-ROM 和读/写光盘驱动器具有以下硬件需求:

  • 这些驱动器必须支持每个块 512 字节的块大小。
  • 如果方式检测受支持,那么顺序存取存储器 (SAM) 硬盘和读/写光盘驱动器也必须支持写保护 (WP) 位。
  • USB 硬盘,闪存驱动器, RDX 和读/写光盘驱动器必须报告已恢复错误的请求检测数据的硬件重试计数 (以字节为单位)。 如果 USB 硬盘或读/写光盘驱动器不支持此功能部件,那么系统错误日志可能指示过早发生驱动器故障。
  • USB CD-ROM 和读/写光盘驱动器必须支持 10 个字节的 SCSI 读命令。
  • USB 硬盘,闪存驱动器, RDX 和读/写光盘驱动器必须支持 SCSI 写和验证命令以及 6 个字节的 SCSI 写命令。
  • 对于 SCSI 格式单元命令的缺陷列表头,读/写光盘驱动器必须将有效 (FOV) 位的格式选项设置为 0 ,才能使用格式命令操作。 如果磁带机不支持此功能,那么您可以为磁带机编写应用程序,以便使用 DKFORMAT 操作对介质进行格式化。
  • 如果 USB CD-ROM 驱动器使用 CD_ROM 数据方式 1 格式,那么它必须支持每个块 512 字节的块大小。
  • 如果 USB CD-ROM 驱动器使用 CD_ROM 2 方式 2 表单 1 格式,那么它必须支持每个块 2048 字节的块大小。
  • 如果 USB CD-ROM 驱动器使用 CD_ROM 数据方式 2 表单 2 格式,那么它必须支持每个块 2336 字节的块大小。
  • 如果 USB CD-ROM 驱动器使用 CD_DA 方式,那么它必须支持每个块 2352 字节的块大小。
  • 要使用 DKAUDIO (播放音频) 操作来控制卷,设备必须支持 SCSI-2 方式数据页 0xE
  • 要使用 DKAUDIO (播放音频) 操作,设备必须支持以下 SCSI-2 可选命令:
    • 读取子通道
    • 暂停恢复
    • 播放音频邮件摘要文件 (.msf)
    • 播放音频跟踪索引
    • 读取目录 (read table of contents , TOC)
注: AIX® 操作系统的 USB 设备上仅支持国际标准化组织 (ISO) 文件系统 (只读 ISO 9660) ,通用磁盘格式 (UDF) 文件系统版本 2.01或更低版本。 但是,您可以使用 mksysbtarcpiobackuprestore 命令在驱动器上创建系统备份或数据归档。 还可以使用 dd 命令将 ISO 镜像添加到这些驱动器。
要使用 USB 闪存驱动器, RDX , CD-ROM , DVD-RAM 和 Blu-ray 只读设备,请安装以下设备包:
devices.usbif.08025002
AIX 操作系统不支持用于 USB 设备的即插即用功能部件。 要使闪存驱动器, RDX , CD-ROM , Blu-ray 或 DVD-RAM 驱动器可供 AIX 用户使用, root 用户必须将该驱动器连接到系统 USB 端口并运行以下命令:
# cfgmgr -l usb0
注: 从端口卸下闪存驱动器时请务必谨慎。 如果在卸下驱动器之前未正确关闭或卸下驱动器,那么驱动器上的数据可能已损坏。
卸下驱动器后,驱动器将在对象数据管理器 (ODM) 中保持可用状态,直到 root 用户运行以下命令为止:
# rmdev -l usbmsn
#rmdev -l cdn
当磁带机处于可用状态时,您可以将该磁带机重新连接到系统,并且可以重新安装或重新打开该磁带机。 如果驱动器与系统 USB 端口断开连接,但仍对用户打开,那么在您关闭并重新打开该驱动器之前,该驱动器不可复用。

具有 6100-06 技术级别的 AIX Version 6.1 可识别 USB 连接的蓝光驱动器并将其配置为只读。 AIX 操作系统不支持对 USB 蓝光驱动器中存在的 CD , DVD 或蓝光介质执行写操作。 虽然未阻止写操作 (如果磁带机是可写的) ,但对于在写操作期间迂到的任何问题都不提供支持。

针对符合 USB 标准的行业标准 OEM USB 设备样本,验证了 AIX 操作系统在 USB 原始设备制造商 (OEM) 闪存驱动器,蓝光和光学设备上运行的能力。 您可能会迂到某些不合规的 USB 设备出现问题,并且 AIX 操作系统不提供任何支持来解决这些问题。