記憶装置のデバイス一意識別子 (DUID)

ファイル システム アーキテクチャが複雑になり、オペレーティング システム コンポーネントの数が増え、イニシエーターはますます多様なハードウェアパスとソフトウェア パスを介してストレージ ターゲットにアクセスするため、ストレージ デバイスを識別する手法が不十分になります。

たとえば、プラグ アンド プレイ (PnP) マネージャーは、コンピューター内の各デバイスの インスタンス (ID) を生成します。 各インスタンス ID は、デバイス ツリー 内の 1 つのデバイス ノードに対応し、デバイスが同じ場所に残る場合、デバイスを一意に識別します。 インスタンス ID はコンピューターの再起動時に保持されますが、デバイスを別のバスまたは別のコンピューターに移動する場合は残りません。 その結果、インスタンス ID は、記憶域ネットワーク (SAN) 内のアプリケーションや、分散ストレージを使用する環境で動作する Windows Vista 診断サービスなどの一部の新しいシステム コンポーネントでは不十分です。 ハード ディスク ドライブは、SMART エラーを予測すると、診断サービスのイベントを生成します。 このイベントには、ディスクが存在する可能性のあるすべてのコンピューター上の障害が発生したハード ディスクと、接続可能なすべてのバス上で、障害が発生したハード ディスクを一意に識別する識別子が含まれている必要があります。 インスタンス ID とその他の デバイス識別文字列 は、この目的には不十分です。

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 構造体には、デバイスの重要な製品データ (VPD) のページ 0x83 から抽出される識別子が含まれています。 通常、このページは 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 は、メディアではなくデバイスを識別します。 この区別は、リムーバブル メディアを持つドライブにとって重要です。

  • マルチパス システムでは、DUID はすべての入出力パスで同じです。

DUID には次の制限事項があります。

  • DUID には、多くの場合、表示できないバイナリ コンテンツが含まれています。

  • DUID は必ずしも null で終了するとは限りません。 DUID コンシューマーは、DUID の長さを決定するために、STORAGE_DEVICE_LAYOUT_SIGNATURE 構造体の Size メンバーをチェックする必要があります。

  • DUID コンシューマーは、バイト単位で比較するのではなく、CompareStorageDuids を使用して DUID を比較する必要があります。

  • 列挙子は、プラグ アンド プレイ (PnP) の目的でデバイス オブジェクトを識別するために DUID を使用してはなりません。 マルチパス システムは、同じ DUID を共有する複数のデバイスを持つことができます。 ただし、PnP の場合、デバイス ID は一意である必要があります。

イニシエーターは、StorageDeviceUniqueIdProperty のプロパティ ID を持つ IOCTL_STORAGE_QUERY_PROPERTY 要求を使用して、DUID 情報データを照会できます。

DUID を比較する方法

DUID コンシューマーは、Storduids.h で定義されている CompareStorageDuids ルーチンを使用して、2 つの DUID を比較する必要があります。 CompareStorageDuids は、2 つの DUID が一致するかどうかを示す DUID_MATCH_STATUS 値を返します。 操作が成功した場合、 CompareStorageDuids は次のいずれかの値を返します。

DuidExactMatch
2 つの DUID 内のすべてのフィールドが正確に一致します。

DuidSubIdMatch
DUID は、複数のサブ ID で構成されます。 サブ ID の少なくとも 1 つが一致し、2 つの DUID が同じデバイスを表している可能性があります。 デバイス ファームウェアが更新されると、新しい識別子が取得され、デバイスの DUID の構成が変更される可能性があります。 DUID コンシューマーがデバイスの古い DUID を新しい DUID と比較すると、CompareStorageDuidsDuidExactMatch ではなく DuidSubIdMatch を返す可能性があります。 これは、サブ ID に基づく有効な一致の例です。 DUID コンシューマーは、DUID コンシューマーの要件に応じて、DuidSubIdMatch の戻り値を一致値として受け入れるか不一致として受け入れるかを選択する必要があります。

DuidNoMatch
シリアル番号が一致せず、重要な製品データ (VPD) のページ 83h の一意のサブ ID は一致しません。

上記の値に加えて、 CompareStorageDuids はさまざまなエラー コードを返す場合があります。

CompareStorageDuids ルーチンでは、次のアルゴリズムを使用して 2 つの DUID を比較します。

  1. 完全一致のクエリを確認します。 DUID 内のすべてのデータが一致する場合、DUID は正確に一致し、CompareStorageDuidsDuidExactMatch を返します。 できない場合は、次の確認に進みます。

  2. VPD 識別子を確認します。 一意のサブ ID が一致する場合、DUID は一致し、CompareStorageDuidsDuidSubIdMatch を返します。 サブ ID が一致しない場合、またはデバイスが一意の VPD 識別子を提供しない場合は、次の確認に進みます。

  3. ユニットのシリアル番号を確認します。 ベンダー ID、製品 ID、シリアル番号が同じ場合、DUID は一致し、CompareStorageDuidsDuidSubIdMatch を返します。 これらの値が一致しない場合、またはデバイスがこれらの値を提供しない場合は、次の確認に進みます。

  4. ドライブ レイアウトの署名を確認します。 2 つの DUID のドライブ レイアウトシグネチャが一致する場合、DUID は一致し CompareStorageDuidsDuidSubIdMatch を返します。 ドライブ署名が一致しない場合、またはシステムがデバイスのドライブ レイアウト署名を読み取ることができない場合、DUID は一致せず、CompareStorageDuidsDuidNoMatch を返します。