裝置唯一識別碼 (存放裝置的 DUID)
當檔案系統架構變得更複雜、作業系統元件數目乘以,以及啟動器透過越來越多樣化的硬體和軟體路徑存取儲存體目標時,識別存放裝置的技術就變得不足。
例如,隨插即用 (PnP) 管理員會為電腦中的每個裝置產生實例識別碼 (識別碼) 。 每個實例識別碼都會對應到 裝置樹 狀結構中的單一裝置節點,如果裝置保留在相同的位置,則會唯一識別裝置。 重新開機電腦時,實例識別碼會持續存在,但是如果您將裝置移至不同的匯流排或不同的電腦,它們不會維持不變。 因此,儲存體區域網路中的應用程式 (SAN) ,以及某些較新的系統元件,例如 Windows Vista 診斷服務,這些應用程式在具有分散式儲存體的環境中運作,因此實例識別碼不足。 硬碟預測 SMART 失敗時,會產生診斷服務的事件。 此事件必須包含一個識別碼,唯一識別磁片可能位於的所有電腦上,以及可連結的所有匯流排上,唯一識別失敗的硬碟。 實例識別碼和任何其他 裝置識別碼 都不足以達到此目的。
某些應用程式和系統服務,例如 Microsoft 叢集服務 (MSCS) 和資料分割管理員,請使用裝置配置簽章 (STORAGE_DEVICE_LAYOUT_SIGNATURE) 唯一識別叢集中的存放裝置。 但在特定情況下,裝置配置簽章不適合此用途,並包含下列限制:
簽章可能會變更或清除。
如果裝置未旋轉或存取簽章所在的磁區時,簽章可能無法使用。
如果磁片由另一個叢集節點保留,則簽章無法使用。 MSCS 只能讀取與 MSCS 執行所在的節點相關聯的磁片磁片的磁片磁碟機配置。 必須存取不同叢集節點中磁片的軟體必須使用磁片配置簽章的替代方案。
磁片磁碟機配置簽章無法協助區分邏輯單元編號 (LUN) 及其快照集。 因為 LUN 及其快照集具有相同的內容,所以其磁片磁碟機配置簽章會相同。
序號有時是可唯一識別不相依于裝置位置之存放裝置的可靠技術。 序號通常可作為裝置查詢資料的一部分。 啟動器可以使用 IOCTL_STORAGE_QUERY_PROPERTY 要求來查詢查詢資料,而埠驅動程式會在 STORAGE_DEVICE_DESCRIPTOR 結構中報告查詢的結果。 不過,這項技術無法協助識別不會報告查詢資料的裝置,例如磁帶機。
裝置唯一識別碼 (DUID)
由於唯一識別裝置的技術通常會隨著技術演進而過時,因此 Microsoft 開發了稱為裝置唯一識別碼的裝置識別碼格式, (DUID) 可延伸,而且可以納入新技術來識別裝置。
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 擷取唯一識別碼,它可以為所有 DUID 取用者建立足夠唯一的 DUID。 但是,如果系統必須單獨從裝置配置簽章建立 DUID,則 DUID 對於某些 DUID 取用者而言就已足夠唯一,但不適用於其他取用者。
系統會嘗試建立具有下列特性的 DUID:
當作業系統重新開機時,DUID 會維持不變。
DUID 會維持不變,即使裝置從一部電腦移到另一部電腦、一個介面卡到另一個介面卡,或一個通道到另一個通道也一樣。
DUID 會識別裝置,而不是媒體。 對於具有卸載式媒體的磁片磁碟機而言,這項區別很重要。
在多重路徑系統上,所有 I/O 路徑的 DUID 都相同。
DUID 有下列限制:
DUID 通常包含無法顯示的二進位內容。
DUID 不一定是 Null終止。 DUID 取用者必須檢查STORAGE_DEVICE_LAYOUT_SIGNATURE結構的Size成員,以判斷 DUID 的長度。
DUID 取用者必須使用 CompareStorageDuids 來比較 DUID,而不是比較它們位元組位元組。
列舉值不得嘗試使用 DUID 來識別裝置物件,以用於隨插即用 (PnP) 用途。 多重路徑系統可以有多個共用相同 DUID 的裝置。 但對於 PnP,裝置識別碼必須是唯一的。
啟動器可以使用具有StorageDeviceUniqueIdProperty屬性識別碼的 IOCTL_STORAGE_QUERY_PROPERTY要求來查詢 DUID 資訊資料。
如何比較 DUID
DUID 取用者必須使用 Storduids.h 中定義的 CompareStorageDuids 常式來比較兩個 DUID。 CompareStorageDuids 會傳回 DUID_MATCH_STATUS 值,指出兩個 DUID 是否相符。 如果作業成功, CompareStorageDuids 會 傳回下列其中一個值:
DuidExactMatch
兩個 DUID 中的所有欄位完全相符。
DuidSubIdMatch
DUID 是由數個子識別碼所組成。 至少有一個子識別碼相符,而兩個 DUID 可能代表相同的裝置。 更新裝置韌體時,可能會取得新的識別碼,這會變更裝置 DUID 的組合。 如果 DUID 取用者比較裝置的舊 DUID 與新的 DUID, CompareStorageDuids 可能會傳回 DuidSubIdMatch ,而不是 DuidExactMatch。 這是以子識別碼為基礎的有效比對範例。 DUID 取用者必須根據 DUID 取用者的需求,選擇是否接受 DuidSubIdMatch 傳回值做為相符或不相符。
DuidNoMatch
序號不符,而且重要產品資料的第 83h 頁中沒有唯一的子識別碼, (VPD) 相符。
除了上述值之外, CompareStorageDuids 可能會傳回各種錯誤碼。
CompareStorageDuids常式會使用下列演算法來比較兩個 DUID:
檢查是否完全相符。 如果 DUID 中的所有資料都相符,DUID 會完全相符, CompareStorageDuids 會傳回 DuidExactMatch。 如果沒有,請繼續進行下一次檢查。
檢查 VPD 識別碼。 如果有任何唯一的子識別碼相符,DUID 會比對且 CompareStorageDuids 會傳回 DuidSubIdMatch。 如果沒有相符的子識別碼,或裝置未提供唯一的 VPD 識別碼,請繼續進行下一次檢查。
檢查單位序號。 如果廠商識別碼、產品識別碼和序號相同,DUID 會比對且 CompareStorageDuids 會傳回 DuidSubIdMatch。 如果這些值都不符合,或裝置未提供這些值,請繼續進行下一次檢查。
檢查磁片磁碟機配置簽章。 如果兩個 DUID 的磁片磁碟機配置簽章相符,DUID 會比對且CompareStorageDuids 會傳回 DuidSubIdMatch。 如果磁片磁碟機簽章不符,或系統無法讀取裝置的磁片磁碟機配置簽章,DUID 不相符,且 CompareStorageDuids 會傳回 DuidNoMatch。