存储驱动构架
由于文件系統構架變得更復雜,操作系統組件數目倍增,啟動程序訪問存儲目標通過激增的多樣的硬件和軟件路徑等原因,識別存儲設備的方法變得不充足。
例如,即插即用管理器為計算機中每一設備產生了一個實例標示符(instance identifier )。每一實例標示符相當于設備樹中一個單獨設備節點,并惟一標示該設備,如果設備保留在相同的位置。當計算機重啟時,實例標示符仍然存在,但是當你移除設備到一個不同的總線上或不同的計算機上時,實例ID并不保持相同。因此,實例ID,對于存儲區域網絡(SAN)和一些較新的系統組件而言,并不準確,如Windows Vista Diagnostic Service,其操作在分發式存儲環境中。當硬盤驅動器預言一個SMART失敗,其將產生一個診斷服務時間。在磁盤可能在的所有計算機上和磁盤可能綁定的所有總線上,該事件必須包含惟一標志失敗硬盤的標示符。然而,實例ID和任意其它的設備標示符字符串為達到這一目的并不精確。
一些應用程序和系統服務,如Microsoft Cluster Service(MSCR)和分區管理器,在設備簇中,使用設備布局簽名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來說將十分的唯一。然而,如果系統必須單獨地從設備布局簽名中創建一個DUID,DUID對于一些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例程來比較兩個DUID。CompareStorageDuids 返回一個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。
總結
- 上一篇: 这些芯片知识,你知多少
- 下一篇: 交换机、路由器、防火墙综述