Как получить имя физического раздела из данных iSCSI в Windows?
У меня есть часть программного обеспечения, которому нужно имя раздела в \Device\Harddisk2\Partition1
стиль, как показано, например, в WinObj. Я хочу получить это имя раздела из сведений о подключении iSCSI, которое лежит в основе раздела. Проблема в том, что порядок дисков не фиксирован - в зависимости от того, какие устройства подключены и в каком порядке инициализируются, он может перемещаться.
Итак, предположим, у меня есть имя портала (DNS для цели iSCSI), целевой IQN и т. Д. Я хотел бы каким-то образом выяснить, какие тома в системе относятся к нему, в автоматическом режиме.
Я могу написать несколько запросов PowerShell WMI, которые будут немного ближе к нужной информации:
PS> get-wmiobject -class Win32_DiskPartition
NumberOfBlocks : 204800
BootPartition : True
Name : Disk #0, Partition #0
PrimaryPartition : True
Size : 104857600
Index : 0
...
От Name
здесь, я думаю, я могу изготовить соответствующее имя, добавив 1 к номеру раздела: \Device\Harddisk0\Partition1
- Partition0
представляется поддельным отображением раздела на весь диск.
Но приведенное выше не имеет достаточно информации для сопоставления с базовым физическим устройством, если только я не приму предположение, основанное на точном соответствии размера.
Я могу получить некоторую информацию об устройствах SCSI, но это бесполезно для объединения вещей (целью iSCSI является Nexenta/Solaris COMSTAR):
PS> get-wmiobject -class Win32_SCSIControllerDevice
__GENUS : 2
__CLASS : Win32_SCSIControllerDevice
...
Antecedent : \\COBRA\root\cimv2:Win32_SCSIController.DeviceID="ROOT\\ISCSIPRT\\0000"
Dependent : \\COBRA\root\cimv2:Win32_PnPEntity.DeviceID="SCSI\\DISK&VEN_NEXENTA&PROD_COMSTAR...
Точно так же я могу выполнить такие запросы:
PS> get-wmiobject -namespace ROOT\WMI -class MSiSCSIInitiator_TargetClass
PS> get-wmiobject -namespace ROOT\WMI -class MSiSCSIInitiator_PersistentDevices
Эти ребята возвращают информацию, касающуюся моего целевого имени iSCSI и имени тома GUID соответственно (имя тома, например \\?\Volume{guid-goes-here}
), но имя тома GUID мне не подходит, и не существует надежного соответствия между целевым именем и томом, к которому я могу присоединиться.
Я просто не могу найти простой способ получить от IQN (например, iqn.1992-01.com.example:storage:diskarrays-sn-a8675309
) к физическим разделам, сопоставленным с этой целью.
Как я это делаю вручную? Я запускаю Управление дисками и ищу раздел правильного размера, проверяю, что его драйвер говорит NEXENTA COMSTAR, и смотрю на номер диска. Но даже это ненадежно, если у меня несколько томов iSCSI одинакового размера.
Какие-либо предложения?
1 ответ
Одна возможность: если вы можете найти имя тома GUID (ваш вопрос не проясняет это) и если тому назначена буква диска, Win32_Volume свяжет имя тома GUID с буквой диска, а Win32_LogicalDiskToPartition свяжет букву диска на номер диска и номер раздела.
Тем не мение, MSiSCSIInitiator_SessionClass
выглядит как лучший вариант. Эта команда работает для меня:
PS C:\Windows\system32> (get-wmiobject -namespace ROOT\WMI -class MSiSCSIInitiator_SessionClass -filter "TargetName='iqn.2001-05.com.equallogic:0-8a0906-d27481f06-93a000d015c4ed69-oslo-san-1'").Devices | Select -property LegacyName
LegacyName
----------
\\.\PhysicalDrive2
Если может быть более одного раздела, Win32_DiskDriveToDiskPartition
класс может быть использован для их перечисления.