2

在我们的 SAN 上创建新卷的 API 非常简单。我无法弄清楚的是如何以编程方式将 iSCSI 启动器连接到它,初始化空间(在 Windows 磁盘管理器的意义上),最后格式化它并挂载它是一个驱动器号。

我目前使用win2k3,但是如果可以简化实现,则可以选择迁移到win2k8。

4

2 回答 2

2

我必须为我公司的一种产品实现磁盘初始化、分区和格式化。我无法分享代码,但我可以为您指明正确的方向。

您需要的 API 称为 VDS- Virtual Disk Service。它是一个 COM API,但我已经从 C++(使用 ATL)和 C#(COM 互操作)成功地使用了它。

可悲的是,文档非常缺乏。您只需要沉浸在对象模型中,编写一些代码,然后逐渐对它有所了解。

Windows Server 2008 附带了一个未记录但非常有用的 C# 包装器围绕 VDS。查找名为 Microsoft.Storage.Vds.dll 的 DLL。您可以使用 Reflector 来发现它的各种类和方法。我在阅读这篇博文时发现了这一点,其中作者试图使用上述 DLL 从 PowerShell 初始化磁盘。

VDS 包括可由 SAN 供应商实施以配置 LUN 和执行其他 SAN 操作的 API;建议您避免使用这些并专注于基本软件提供商,它将在 MBR 或 GPT 磁盘上创建基本(而不是动态)分区。请注意,我提到的 Microsoft 包装器对 GPT 支持有点轻。我不得不对其进行一些修改以使 GPT 磁盘正常工作。

VDS 是一个复杂而挑剔的 API,但如果您只是想初始化磁盘、创建分区、格式化并将其挂载到驱动器号,那么您需要的大部分内容都在那里并且相当容易做到。祝你好运。

于 2009-06-29T16:33:02.543 回答
2

我已经从 Powershell 使用带有脚本的 diskpart 完成了此操作。

就像是:

$target    = ''    #Desired target IQN
$partition = 1     #Desired partition
$drvLetter = ''    #Desired drive letter

#get the disk device number from the iscsi session class (diskpart needs it)
$iscsiSsn = gwmi -namespace "root\wmi" -class MSiSCSIInitiator_SessionClass
$diskNum = ($($iscsiSsn | where { $_.targetname -eq $target}).devices).deviceNumber

#create the diskpart script on-the-fly then call the utility
$dskPrtScr = "$($env:temp)\diskpart.scr"
"sel disk $diskNum`nsel par 1`nassign letter=$drvLetter`nexit" | out-file $dskPrtScr -encoding ascii
diskpart /s $dskPrtScr
于 2010-07-29T13:43:40.647 回答