Уникальные идентификаторы устройств (DUID) для устройств хранения
Методы идентификации запоминающих устройств становятся неадекватными по мере усложнения архитектуры файловой системы, увеличения числа компонентов операционной системы, а инициаторы обращаются к целевым объектам хранилища с помощью все более разнообразных аппаратных и программных путей.
Например, диспетчер Plug and Play (PnP) создает идентификатор экземпляра для каждого устройства на компьютере. Каждый идентификатор экземпляра соответствует одному узлу устройства в дереве устройств и однозначно идентифицирует устройство, если устройство остается в том же расположении. Идентификаторы экземпляров сохраняются при перезагрузке компьютера, но не остаются прежними при перемещении устройства на другую шину или другой компьютер. В результате идентификаторы экземпляров неадекватны для приложений в сетях хранения данных (SAN) и некоторых новых системных компонентов, таких как служба диагностики Windows Vista, которые работают в средах с распределенным хранилищем. Когда жесткий диск прогнозирует сбой SMART, он создает событие для службы диагностики. Это событие должно содержать идентификатор, который однозначно идентифицирует неработоующий жесткий диск на всех компьютерах, в которые может находиться диск, и на всех автобусах, к которым он может быть подключен. Идентификаторы экземпляров и любые другие строки идентификации устройств неадекватны для этой цели.
Некоторые приложения и системные службы, такие как Служба кластеров Майкрософт (MSCS) и диспетчер секций, используют сигнатуру макета устройства (STORAGE_DEVICE_LAYOUT_SIGNATURE) для уникальной идентификации устройства хранения в кластере. Но сигнатура макета устройства не подходит для этой цели при определенных обстоятельствах и включает следующие ограничения:
Подпись может измениться или быть очищена.
Подпись может быть недоступна, если устройство не вращается или имеет проблемы с доступом к секторам, в которых находится подпись.
Подпись недоступна, если диск зарезервирован другим узлом кластера. MSCS может считывать макет диска только для дисков, связанных с узлом, на котором выполняется MSCS. Программное обеспечение, которое должно получать доступ к дискам в разных узлах кластера, должно использовать альтернативу подписи макета диска.
Сигнатуры макета диска не позволяют различать логический номер единицы (LUN) и его snapshot. Так как LUN и его snapshot имеют идентичное содержимое, подписи макета диска будут одинаковыми.
Серийный номер иногда является надежным методом уникальной идентификации запоминающего устройства, который не зависит от расположения устройства. Серийный номер часто доступен в составе данных запроса устройства. Инициаторы могут запрашивать данные запроса с помощью запроса IOCTL_STORAGE_QUERY_PROPERTY , а драйвер порта сообщает результаты запроса в STORAGE_DEVICE_DESCRIPTOR структуре. Однако этот метод не помогает определить устройства, такие как ленточные накопители, которые не передают данные запроса.
Уникальные идентификаторы устройств (DUID)
Поскольку методы уникальной идентификации устройств часто устаревают по мере развития технологии, корпорация Майкрософт разработала формат идентификатора устройства, который называется уникальным идентификатором устройства (DUID), который является расширяемым и может включать новые методы идентификации устройств по мере их доступности.
DUID определяется структурой STORAGE_DEVICE_UNIQUE_IDENTIFIER , и первая версия этой структуры (DUID_VERSION_1) включает в себя сочетание следующих идентификаторов:
STORAGE_DEVICE_ID_DESCRIPTOR
Структура STORAGE_DEVICE_ID_DESCRIPTOR содержит идентификаторы, извлеченные из страницы 0x83 жизненно важных данных о продукте устройства (VPD). Как правило, эту страницу поддерживают только устройства SCSI и Fibre Channel. Встроенные устройства с электроникой (IDE) и универсальной последовательной шиной (USB), накопители IEEE 1394 и RAID-контроллеры не предоставляют 0x83 страниц.
STORAGE_DEVICE_DESCRIPTOR
Структура STORAGE_DEVICE_DESCRIPTOR содержит другие данные запроса, включая смещение серийного номера единицы в элементе SerialNumberOffset . Серийный номер отформатирован как строка переменной длины, заканчивающаяся null. Если запоминающее устройство совместимо с SCSI, драйвер порта пытается извлечь серийный номер из необязательной страницы "Серийный номер единицы" (страница 0x80) VPD. Если запоминающее устройство является устройством интегрированной среды разработки, драйвер порта создает серийный номер на основе идентификационных данных устройства.
STORAGE_DEVICE_LAYOUT_SIGNATURE
STORAGE_DEVICE_LAYOUT_SIGNATURE содержит сигнатуру макета устройства.
В будущих версиях в DUID будут добавлены дополнительные данные.
Идентификаторы DUID не имеют фиксированного размера, поэтому программное обеспечение, использующее DUID (известное как потребитель DUID), должно получать размер DUID из элемента Size структуры STORAGE_DEVICE_UNIQUE_IDENTIFIER. Версия DUID доступна в элементе Vers****ion этой же структуры.
Некоторые устройства не предоставляют достаточно информации для системы, чтобы гарантировать, что DUID устройства будет достаточно уникальным для всех типов использования и всех потребителей DUID. Если операционная система может получить уникальные идентификаторы из VPD устройства, она может создать DUID, достаточно уникальный для всех потребителей DUID. Но если система должна создать DUID только на основе сигнатуры макета устройства, DUID будет достаточно уникальным для некоторых потребителей DUID, но не для других.
Система пытается создать DUID со следующими характеристиками:
DuID остается прежним при перезапуске операционной системы.
DuID остается прежним даже при перемещении устройства с одного компьютера на другой, с одного адаптера на другой или из одного канала в другой.
DUID идентифицирует устройство, а не носитель. Это различие важно для дисков со съемными носителями.
В системах с несколькими путями DUID одинаков для всех путей ввода-вывода.
Идентификаторы DUID имеют следующие ограничения:
Идентификаторы DUID часто содержат двоичное содержимое, которое невозможно отобразить.
DuID не всегда заканчиваются null. Потребители DUID должны проверка элемент Sizeструктуры STORAGE_DEVICE_LAYOUT_SIGNATURE, чтобы определить длину DUID.
Потребители DUID должны использовать CompareStorageDuids для сравнения идентификаторов DUID, а не сравнивать их по байтам.
Перечислители не должны пытаться использовать DUID для идентификации объектов устройств в целях Plug and Play (PnP). В системах с несколькими пути может быть несколько устройств, использующих один и тот же DUID. Но для PnP идентификаторы устройств должны быть уникальными.
Инициаторы могут запрашивать информационные данные DUID с помощью запроса IOCTL_STORAGE_QUERY_PROPERTY с идентификатором свойства StorageDeviceUniqueIdProperty.
Сравнение идентификаторов DUID
Потребители DUID должны использовать подпрограмму CompareStorageDuids , определенную в Storduids.h, для сравнения двух идентификаторов DUID. CompareStorageDuids возвращает значение DUID_MATCH_STATUS , указывающее, совпадают ли два идентификатора DUID. Если операция выполнена успешно, функция CompareStorageDuids возвращает одно из следующих значений:
DuidExactMatch
Все поля в двух идентификаторах DUID точно соответствуют.
DuidSubIdMatch
DUID состоит из нескольких вложенных идентификаторов. По крайней мере один из вложенных идентификаторов совпадает, а два идентификатора DUID, вероятно, представляют одно и то же устройство. При обновлении встроенного ПО устройства оно может получить новые идентификаторы, которые изменят состав DUID устройства. Если потребитель DUID сравнивает старый DUID для устройства с новым DUID, функция CompareStorageDuids может возвращать DuidSubIdMatch вместо DuidExactMatch. Это пример допустимого соответствия на основе вложенного идентификатора. Потребитель DUID должен выбрать, будет ли он принимать возвращаемое значение DuidSubIdMatch в качестве соответствия или несоответствия в зависимости от требований потребителя DUID.
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.