Como obter o nome da partição física dos detalhes do iSCSI no Windows?

4

Eu tenho um software que precisa do nome de uma partição em \Device\Harddisk2\Partition1 style, como mostrado, por exemplo, em WinObj . Eu quero obter esse nome de partição de detalhes da conexão iSCSI que sustenta a partição. O problema é que a ordem de disco não é fixa - dependendo de quais dispositivos estão conectados e inicializados em que ordem, ela pode se mover.

Suponhamos que eu tenha o nome do portal (DNS do iSCSI target), o IQN de destino, etc. Gostaria de descobrir de alguma forma quais volumes no sistema se relacionam com ele, de maneira automatizada.

Eu posso escrever algumas consultas WMI do PowerShell que se aproximam das informações desejadas:

PS> get-wmiobject -class Win32_DiskPartition
NumberOfBlocks   : 204800
BootPartition    : True
Name             : Disk #0, Partition #0
PrimaryPartition : True
Size             : 104857600
Index            : 0
...

Do Name aqui, acho que posso fabricar o nome correspondente adicionando 1 ao número da partição: \Device\Harddisk0\Partition1 - Partition0 parece ser um mapeamento de partição falso para o todo disco.

Mas o texto acima não tem informações suficientes para mapear para o dispositivo físico subjacente, a menos que eu adivinhe com base na correspondência exata de tamanho.

Eu posso obter algumas informações sobre dispositivos SCSI, mas não é útil unir as coisas (o destino do 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...

Da mesma forma, posso executar consultas como estas:

PS> get-wmiobject -namespace ROOT\WMI -class MSiSCSIInitiator_TargetClass
PS> get-wmiobject -namespace ROOT\WMI -class MSiSCSIInitiator_PersistentDevices

Esses caras retornam informações relacionadas ao meu nome de destino iSCSI e ao nome do volume GUID, respectivamente (um nome de volume como \?\Volume{guid-goes-here} ), mas o nome do volume GUID não é bom para mim e parece não ser confiável correspondência entre o nome do alvo e o volume que eu posso juntar.

Eu simplesmente não consigo encontrar uma maneira fácil de obter de um IQN (por exemplo, iqn.1992-01.com.example:storage:diskarrays-sn-a8675309 ) para partições físicas mapeadas desse destino.

A maneira como faço isso manualmente? Eu inicio o Gerenciamento de Disco, e procuro por uma partição do tamanho correto, verifico que seu driver diz NEXENTA COMSTAR, e observe o número do disco. Mas mesmo isso não é confiável se eu tiver vários volumes iSCSI do mesmo tamanho exato.

Alguma sugestão?

    
por Barry Kelly 29.06.2012 / 05:44

1 resposta

2

Uma possibilidade: se você puder encontrar o nome do volume GUID (sua pergunta não deixa isso claro) e se o volume tiver uma letra de unidade atribuída, Win32_Volume vinculará o nome do volume GUID à letra da unidade e Win32_LogicalDiskToPartition vinculará a letra da unidade para o número do disco e o número da partição.

No entanto, MSiSCSIInitiator_SessionClass parece ser uma opção melhor. Este comando funciona para mim:

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

Se houver mais de uma partição, a classe Win32_DiskDriveToDiskPartition pode ser usada para listá-las.

    
por 30.06.2012 / 06:47