存储设备的设备惟一标示符(DUID)

由于文件系统构架变得更复杂,操作系统组件数目倍增,启动程序访问存储目标通过激增的多样的硬件和软件路径等原因,识别存储设备的方法变得不充足。

例如,即插即用管理器为计算机中每一设备产生了一个实例标示符(instance identifier )。每一实例标示符相当于设备树中一个单独设备节点,并惟一标示该设备,如果设备保留在相同的位置。当计算机重启时,实例标示符仍然存在,但是当你移除设备到一个不同的总线上或不同的计算机上时,实例ID并不保持相同。因此,实例ID,对于存储区域网络(SAN)和一些较新的系统组件而言,并不准确,如Windows Vista Diagnostic Service,其操作在分发式存储环境中。当硬盘驱动器预言一个SMART失败,其将产生一个诊断服务时间。在磁盘可能在的所有计算机上和磁盘可能绑定的所有总线上,该事件必须包含惟一标志失败硬盘的标示符。然而,实例ID和任意其它的设备标示符字符串为达到这一目的并不精确。

一些应用程序和系统服务,如Microsoft Cluster ServiceMSCR)和分区管理器,在设备簇中,使用设备布局签名device layout signature(STORAGE_DEVICE_LAYOUT_SIGNATURE)来惟一标示存储设备。然而在一些环境下,设备布局签名是不精确的,包含如下限制

l         签名可能改变或清除

l         如果设备没有旋转或者访问签名保留区域遇到问题,签名无法获取

l         签名无法被获取,如果磁盘被其它簇节点预留。MSCS

l         驱动器布局签名无法帮助区分逻辑单元号(LUN)和它的快照。因为一个逻辑单元号和它的快照有着相同的内容,他们的驱动器布局签名将是相同的。

序列号有时可以作为一个可信赖的方法去唯一识别存储设备,其不依赖于设备的位置。序列号通常作为设备的询盘数据的一部分可以被获取。启动程序可以通过IOCTL_STORAGE_QUERY_PROPERTY 来查询询盘数据,端口驱动程序在一个STORAGE_DEVICE_DESCRIPTOR结构体中上报查询结果。然而,这种方法无法识别那些不上报询盘数据的设备,如磁带驱动器,

 

设备唯一标识符(DUIDs)

由于唯一识别设备的方法经常因为技术的进步变为不再使用,Microsoft开发了一种被称为设备唯一ID(DUID)的设备ID格式,DUID具有可扩充性,并能包含新的方法去识别设备。

              DUID由数据结构STORAGE_DEVICE_UNIQUE_IDENTIFIER定义,该数据结构的第一个版本包含下列标示组合:

STORAGE_DEVICE_ID_DESCRIPTOR

STORAGE_DEVICE_ID_DESCRIPTOR结构包含从设备的重要产品数据(VPD)中0x83页中提取的标识符。典型的,只有SCSI和光纤通道设备支持该页面。集成驱动器电子(IDE)和通用串行总线(USB)设备, IEEE1394设备和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的版本也可以从相同的数据结构中Version变量获取。

一些设备并不会提供足够的信息给操作系统以保证设备的DUID对于所有的使用和所有的DUID消费者都十分的唯一。如果系统能从设备的VPD中检索到唯一ID,系统将创建一个DUID,对于所有的DUID来说将十分的唯一。然而,如果系统必须单独地从设备布局签名中创建一个DUIDDUID对于一些DUID消费者来说以充足唯一,但是并不是对于所有而言。

系统试图创建具有如下特征的DUID

l         系统重启时DUID保持不变

l         DUID保持不变。即使当设备从一台电脑移动到另一台电脑,或一个适配器到另一适配器,一个通道到另一通道。

l         DUID是被设备而不是媒介。这一区别对于具有可移动媒介的设备而言十分重要。

DUID具有如下限制:

l         DUID通常包含不能被显示的二进制内容;

l         DUID并不是总是NULL终止的。DUID消费者必须检查STORAGE_DEVICE_LAYOUT_SIGNATURE数据结构中成员Size来确定DUID的长度;

l         枚举者不能为热拔插目的去试图使用DUID去识别设备对象。多路系统可以有多个设备共享相同的DUID。但是对于热拔插目的,设备ID必须是唯一的。

如何比较DUID

DUID消费者使用头文件Storduids.h中定义的CompareStorageDuids例程来比较两个DUIDCompareStorageDuids 返回一个DUID_MATCH_STATUS值,显示这两个DUID是否匹配。如果操作成功,CompareStorageDuids返回下面中一个值:

DuidExactMatch

这两个DUID中所有的位都匹配。

DuidSubIdMatch

DUID是有许多子-ID组成。至少其中一个子-ID匹配,这两个DUID可能代表着相同的设备。当设备固件更新时,它可能获取新的设备标识符,将改变设备DUID的组成。如果DUID消费者对于具有新的DUID设备采用旧的DUID进行比较,CompareStorageDuids可能返回DuidSubIdMatch代替DuidExactMatch这只是一个基于子-ID的一个合法的匹配。基于DUID消费者的需求,DUID消费者必须选择是否接受DuidSubIdMatch返回值作为匹配或不匹配。

DuidNoMatch

序列号不匹配。产品重要数据中页83h中唯一子ID均不匹配。

除了前面的值,CompareStorageDuids可能返回一些错误代码.

1.       检查完全匹配。如果DUID中所有数据都匹配,DUID完全匹配,CompareStorageDuids返回DuidExactMatch。如果不是,继续下一步检查。

2.       检查VPD标识符。如果任一唯一子-ID匹配,那么DUID匹配,CompareStorageDuids返回DuidSubIdMatch匹配。如果没有子-ID匹配或者设备不提供唯一产品重要数据(VPD)标识符,继续如下的检查。

3.       检查单元序列号。如果厂商ID,产品ID,序列号相同,那么DUID匹配,CompareStorageDuids返回CompareStorageDuids。如果这些都不匹配或设备不提供唯一产品重要数据(VPD)标识符,继续如下的检查。

检查驱动器布局签名。如果两个DUID的设备布局签名匹配,那么DUID匹配,CompareStorageDuids 返回 DuidSubIdMatch如果设备签名不匹配或者系统不能读到设备驱动器布局签名。DUID不匹配,同时CompareStorageDuids返回DuidNoMatch

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值