簡體   English   中英

使用特定硬件創建新的Hyper-V VM(使用WMI)

[英]Create a new Hyper-V VM (using WMI) with specific hardware

我要創建一個具有確定數量的RAM,網卡,處理器核心數量的新Hyper-V VM,並將VHD文件附加到IDE控制器。

問題在於Msvm_ResourceAllocationSettingData並不是很容易使用。 我使用的代碼不起作用(這是將VHD附加到現有VM的代碼,但是我也想在創建新的VHD時使用它)。

public void AttachVhd(IdeChannel ideChannel, String vhdPath) {

        // Get VirtualSystemSettingData
        ManagementObject vssd = this.GetVirtualSystemSettingData();

        // Get the IDE Controller
        ManagementObject ideController = this.GetResourceAllocationSettingData(ResourceType.IdeController, ResourceSubType.IdeController);

        // Create synthetic disk:
        ManagementObject syntheticDiskRasd = this.GetResourceAllocationSettingData(ResourceType.Disk, ResourceSubType.DiskSynthetic);
        syntheticDiskRasd["Parent"]  = ideController.Path;
        syntheticDiskRasd["Address"] = ideChannel == IdeChannel.Primary ? "0" : "1";

        this.AddVirtualSystemResources(syntheticDiskRasd);

        // Attach it
        ManagementObject vhdRasd = this.GetResourceAllocationSettingData(ResourceType.StorageExtent, ResourceSubType.Vhd); ;
        vhdRasd["Parent"]     = syntheticDiskRasd.Path;
        vhdRasd["Connection"] = new String[] { vhdPath };

        this.AddVirtualSystemResources( vhdRasd );

        // Cleanup
        vhdRasd.Dispose();
        syntheticDiskRasd.Dispose();
        ideController.Dispose();
        vssd.Dispose();
    }

    private ManagementObject GetResourceAllocationSettingData(ResourceType resourceType, ResourceSubType resourceSubType)
    {
        String desiredSubType = ResourceSubTypeStrings.GetString(resourceSubType); // Scout.Common.Extensions.GetDescription( resourceType );

        using(ManagementObjectCollection settingsDatas = _vm.GetRelated("Msvm_VirtualSystemSettingData"))
        foreach(ManagementObject settingData in settingsDatas)
        {
            using(ManagementObjectCollection rasds = settingData.GetRelated("Msvm_ResourceAllocationSettingData"))
            foreach(ManagementObject rasd in rasds)
            {
                ResourceType rasdResourceType    = (ResourceType)(UInt16)rasd["ResourceType"];
                String       rasdResourceSubType =               (String)rasd["ResourceSubType"];
                String       rasdOtherType       =               (String)rasd["OtherResourceType"];

                if( rasdResourceType == resourceType && rasdResourceSubType == desiredSubType )
                {
                    return rasd;
                }
            }
        }

        return null;
    }

    private void AddVirtualSystemResources(ManagementObject rasd)
    {
        using (ManagementObject vmService = HyperV.GetManagementService())
        {
            ManagementBaseObject inParams = vmService.GetMethodParameters("AddVirtualSystemResources");
            inParams["TargetSystem"]         = _vm;
            inParams["ResourceSettingsData"] = rasd.GetText(TextFormat.CimDtd20);

            ManagementBaseObject outParams = vmService.InvokeMethod("AddVirtualSystemResources", inParams, options: null);

            String[]            addedResources = (String[])outParams["NewResources"];
            OperationReturnCode returnValue    = (OperationReturnCode)(UInt32)outParams["ReturnValue"];

            if (returnValue == OperationReturnCode.JobStarted)
            {
                String jobPath = (String)outParams["Job"];
                HyperV.MonitorJob(jobPath);
            }
            else if (returnValue == OperationReturnCode.Completed)
            {
            }
            else
            {
                throw new ApplicationException( returnValue.ToString() );
            }
        }
    }

除了找到您的問題,我還可以為您提供一個可行的示例嗎?

請參閱我的Apache CloudStack Hyper-V插件中的 WmiCalls.DeployVirtualMachine

如果您需要其他詳細信息,請發表評論,我將更新答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM