Программное подключение VHD к удаленной виртуальной машине Hyper-V.
-
18-09-2019 - |
Вопрос
С помощью диспетчера Hyper-V я могу подключиться к удаленному хосту виртуальной машины, перейти к настройкам виртуальной машины и добавить существующий файл .VHD в качестве нового жесткого диска.Если на хосте виртуальной машины работает Server 2008 R2, а диск подключен к контроллеру SCSI, я могу сделать это даже во время работы виртуальной машины (см. Что нового в Hyper-V R2).
Делая это вручную, все работает отлично.Проблема в том, что теперь я хочу автоматизировать это, чтобы иметь возможность подключать разные виртуальные жесткие диски на лету во время некоторых автоматических тестов.
У меня уже есть код C#, который подключается к удаленному хосту виртуальной машины через WMI и запускает/останавливает виртуальные машины, вызывая Запросстатечанже, и я хотел бы расширить его, чтобы иметь возможность сказать: «Вот путь к VHD, подключите его как диск SCSI к этой виртуальной машине».Но глядя на список классов виртуализации WMI, я не могу понять, как это сделать.
Самое близкое, что я нашел, это Устанавливать метод Msvm_ImageManagementService, но, похоже, при этом VHD монтируется внутри текущей ОС, а это не то, что мне нужно.
Решение
Необходимо добавить синтетический диск (Тип Ресурса.Диск, РесурсПодтип.ДискСинтетический), используя Msvm_VirtualSystemManagementService.AddVirtualSystemResources.Родитель = путь WMI контроллера SCSI.
ManagementObject synthetic = Utilities.GetResourceAllocationSettingData(scope,
ResourceType.Disk, ResourceSubType.DiskSynthetic);
synthetic["Parent"] = <ideControllerPath>; //or SCSI controller path (WMI path)
synthetic["Address"] = <diskDriveAddress>; //0 or 1 for IDE
string[] RASDs = new string[1];
RASDs[0] = synthetic.GetText(TextFormat.CimDtd20);
Затем прикрепить виртуальный жесткий диск (Тип Ресурса.Экстент хранения, РесурсПодтип.виртуальный жесткий диск), используя Msvm_VirtualSystemManagementService.AddVirtualSystemResources.Родитель = путь WMI синтетического диска, Связь = *.vhd путь к файлу.
ManagementObject hardDisk = Utilities.GetResourceAllocationSettingData(scope,
ResourceType.StorageExtent, ResourceSubType.VHD);
hardDisk["Parent"] = <syntheticPath>; //WMI path
string[] connection = { <vhdPath> }; //Path to *.vhd file
hardDisk["Connection"] = connection;
string[] RASDs = new string[1];
RASDs[0] = hardDisk.GetText(TextFormat.CimDtd20);
Использовать Общие утилиты для примеров виртуализации и WMI-проводник.
Другие советы
Также взгляните на http://hypervlib.codeplex.com для примера.