当文件系统体系结构变得更加复杂、操作系统组件数量成倍增加,发起程序通过越来越不同的硬件和软件路径访问存储目标时,识别存储设备的技术变得不足。

例如,即插即用 (PnP) 管理器为计算机 (设备) ID 生成实例标识符。 每个实例 ID 对应于设备树中的单个设备节点,并 唯一标识设备(如果设备保持在同一位置)。 实例 ID 在重新启动计算机时保持不变,但如果将设备移动到其他总线或不同的计算机,则它们不会保持不变。 因此,对于存储区域网络 (SAN) 中的应用程序,以及某些较新的系统组件(如 Windows Vista 诊断服务)在分布式存储环境中运行的应用程序,实例 ID 不足。 当硬盘驱动器预测 SMART 故障时,它会为诊断服务生成事件。 此事件必须包含一个标识符,该标识符唯一标识磁盘可能位于的所有计算机上的故障硬盘以及可附加到的所有总线上。 为此,实例标识和任何其他 设备标识 字符串都不足。

某些应用程序和系统服务(例如 Microsoft 群集服务 (MSCS) 和分区管理器)使用设备布局签名 ( STORAGE_DEVICE_LAYOUT_SIGNATURE ) 来唯一标识群集中的存储设备。 但在某些情况下,设备布局签名不足以达到此目的,并且包括以下限制:

  • 签名可能会更改或清除。

  • 如果设备未旋转或在访问签名所在的扇区时遇到问题,则签名可能不可用。

  • 如果磁盘由另一个群集节点保留,则签名不可用。 MSCS 只能读取与运行 MSCS 的节点关联的磁盘的驱动器布局。 必须访问不同群集节点中的磁盘的软件必须使用磁盘布局签名的替代项。

  • 驱动器布局签名不能帮助区分 LUN (逻辑单元) 及其快照。 由于 LUN 及其快照具有相同的内容,因此其驱动器布局签名将相同。

    序列号有时是一种可靠的技术,用于唯一标识不依赖于设备位置的存储设备。 序列号通常作为设备查询数据的一部分提供。 发起程序可以使用请求查询查询 IOCTL_STORAGE_QUERY_PROPERTY数据, 端口驱动程序以一个 STORAGE_DEVICE_DESCRIPTOR报告查询 结果。 但是,此方法不能帮助识别不报告查询数据的设备,例如磁带机。

    设备唯一标识符 (DUID)

    由于唯一标识设备的技术通常会随着技术的发展而过时,因此 Microsoft 开发了一种称为设备唯一 ID (DUID) 的设备 ID 格式,该格式可扩展,并可以结合新技术来识别可用的设备。

    DUID 由一个 STORAGE_DEVICE_UNIQUE_IDENTIFIER定义, 此结构的第一个版本 (DUID_VERSION_1) 包括以下标识符的组合:

    STORAGE_DEVICE_ID_DESCRIPTOR
    该STORAGE_DEVICE_ID_DESCRIPTOR结构包含从设备的重要产品数据的页面0x83提取的标识符 (VPD) 。 通常,只有 SCSI 光纤通道设备支持此页面。 集成驱动器 (IDE) 和通用串行总线 (USB) 设备、IEEE 1394 驱动器和 RAID 控制器不提供页面0x83。

    STORAGE_DEVICE_DESCRIPTOR
    该STORAGE_DEVICE_DESCRIPTOR包含其他查询数据,包括 SerialNumberOffset 成员中单元序列号的偏移量。 序列号的格式设置为可变长度、 以 NULL 结尾的字符串。 如果存储设备符合 SCSI,则端口驱动程序会尝试从 VPD 的可选"单元序列号"页提取 (页0x80) 序列号。 如果存储设备是 IDE 设备,则端口驱动程序会从设备的标识数据生成序列号。

    STORAGE_DEVICE_LAYOUT_SIGNATURE
    该STORAGE_DEVICE_LAYOUT_SIGNATURE包含设备布局签名。

    在将来的版本中,会向 DUID 添加更多数据。

    DUID 没有固定的大小,因此使用 DUID (称为 DUID 使用者) 的软件必须从 STORAGE_DEVICE_UNIQUE_IDENTIFIER 结构的 Size 成员获取 DUID 的大小。 DUID 的版本在此同一结构的 Vers*●ion 成员中可用。

    某些设备未为系统提供足够的信息,以确保设备的 DUID 对于所有用途和所有 DUID 使用者来说都足够唯一。 如果操作系统可以从设备的 VPD 检索唯一 ID,则它可以创建一个对于所有 DUID 使用者来说足够唯一的 DUID。 但是,如果系统必须单独从设备布局签名创建 DUID,则 DUID 对于某些 DUID 使用者来说足够唯一,而对于其他使用者来说则足够唯一。

    系统尝试创建具有以下特征的 DUID:

  • 当操作系统重启时,DUID 保持不变。

  • 即使设备从一台计算机移动到另一台计算机、将一个适配器移到另一个适配器或另一个通道,DUID 也保持不变。

  • DUID 标识设备,而不是媒体。 这种区别对于具有可移动媒体的驱动器非常重要。

  • 在多路径系统上,所有 I/O 路径的 DUID 都相同。

    DUID 具有以下限制:

  • DUID 通常包含无法显示的二进制内容。

  • DUID 并不总是以 null 终止。 DUID 使用者必须检查该 结构STORAGE_DEVICE_LAYOUT_SIGNATURE大小 成员, 以确定 DUID 的长度。

  • DUID 使用者必须使用 CompareStorageDuids 来比较 DUID,而不是按字节比较它们。

  • 枚举 器不得尝试使用 DUID 来标识设备对象即插即用 (PnP) 用途。 多路径系统可以具有多个共享同一 DUID 的设备。 但对于 PnP,设备标识必须是唯一的。

    发起程序可以使用属性 ID StorageDeviceUniqueIdProperty IOCTL_STORAGE_QUERY_PROPERTY请求查询 DUID 信息数据

    如何比较 DUID

    DUID 使用者必须使用 Storduids.h 中定义的 CompareStorageDuids 例程来比较两个 DUID。 CompareStorageDuids 返回DUID_MATCH_STATUS一 个值,该值指示两个 DUID 是否匹配。 如果操作成功, CompareStorageDuids 将返回以下值之一:

    DuidExactMatch
    两个 DUID 中所有字段完全匹配。

    DuidSubIdMatch
    DUID 由多个子 ID 决定。 至少有一个子 ID 匹配,并且两个 DUID 可能表示同一设备。 更新设备固件时,可能会获取新标识符,这将更改设备 DUID 的组合。 如果 DUID 使用者将设备的旧 DUID 与新的 DUID 进行比较, 则 CompareStorageDuids 可能会返回 DuidSubIdMatch 而不是 DuidExactMatch 。 这是基于子 ID 的有效匹配项的示例。 DUID 使用者必须选择是接受 DuidSubIdMatch 返回值作为匹配还是不匹配,具体取决于 DUID 使用者的要求。

    DuidNoMatch
    序列号不匹配,并且 VPD 中重要产品数据页 83h 中没有任何唯一子 (与) 匹配。

    除上述值外, CompareStorageDuids 可能返回各种错误代码。

    CompareStorageDuids 例程使用以下算法来比较两个 DUID:

  • 检查是否完全匹配。 如果 DUID 中所有数据都匹配,则 DUID 完全匹配, CompareStorageDuids 返回 DuidExactMatch 。 如果没有,请继续下一次检查。

  • 检查 VPD 标识符。 如果任何唯一子 ID 匹配,则 DUID 匹配, CompareStorageDuids 返回 DuidSubIdMatch 。 如果没有子 ID 匹配或设备未提供唯一的 VPD 标识符,请继续下一检查。

  • 检查单元序列号。 如果供应商 ID、产品 ID 和序列号相同,则 DUID 匹配, CompareStorageDuids 返回 DuidSubIdMatch 。 如果这些值均不匹配,或者设备未提供这些值,请继续下一次检查。

  • 检查驱动器布局签名。 如果两个 DUID 的驱动器布局签名匹配,则 DUID 匹配且 CompareStorageDuids 返回 DuidSubIdMatch 。 如果驱动器签名不匹配或系统无法读取设备的驱动器布局签名,则 DUID 不匹配, CompareStorageDuids 将返回 DuidNoMatch

  •