我有一个软件需要以样式显示分区的名称\Device\Harddisk2\Partition1
,例如程序运行对象。我想从分区底层的 iSCSI 连接的详细信息中获取此分区名称。问题是磁盘顺序不固定 - 根据连接的设备以及初始化的顺序,它可以移动。
因此假设我有门户名称(iSCSI 目标的 DNS)、目标 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
则可以使用该类来列出它们。