Virtualization WMI Provider

Сегодня я хочу попытаться объяснить как используя PowerShell, можно управлять ролью виртуализации Hyper-v. Пока я для себя вижу такую возможность только через WMI провайдер под названием Virtualization WMI Provider. Знакомство начнем с класса Msvm_ComputerSystem он нам позволит узнать информацию о хост машине и о ВМ созданных на этом сервере.

[PS] C:\>get-wmiobject -namespace root\virtualization -Class Msvm_ComputerSystem  -filter  'ElementName <> "VS-02"'
__GENUS                       : 2
__CLASS                       : Msvm_ComputerSystem
__SUPERCLASS                  : CIM_ComputerSystem
__DYNASTY                     : CIM_ManagedElement
__RELPATH                     : Msvm_ComputerSystem.CreationClassName="Msvm_ComputerSystem",Name="A115BF3C-1856-4F59-BF04-F3E8B0FF96B6"
__PROPERTY_COUNT              : 29
__DERIVATION                  : {CIM_ComputerSystem, CIM_System, CIM_EnabledLogicalElement, CIM_LogicalElement...}
__SERVER                      : VS-02
__NAMESPACE                   : root\virtualization
__PATH                        : \\VS-02\root\virtualization:Msvm_ComputerSystem.CreationClassName="Msvm_ComputerSystem"
,Name="A115BF3C-1856-4F59-BF04-F3E8B0FF96B6"
AssignedNumaNodeList          : {0}
Caption                       : Виртуальная машина
CreationClassName             : Msvm_ComputerSystem
Dedicated                     :
Description                   : Виртуальная машина (Майкрософт)
ElementName                   : SRV-01
EnabledDefault                : 2
EnabledState                  : 2
HealthState                   : 5
IdentifyingDescriptions       :
InstallDate                   : 20090421014319.000000-000
Name                          : A115BF3C-1856-4F59-BF04-F3E8B0FF96B6
NameFormat                    :
OnTimeInMilliseconds          : 14056760
OperationalStatus             : {2}
OtherDedicatedDescriptions    :
OtherEnabledState             :
OtherIdentifyingInfo          :
PowerManagementCapabilities   :
PrimaryOwnerContact           :
PrimaryOwnerName              : ISEA\abigor_adm
ProcessID                     : 2824
RequestedState                : 12
ResetCapability               : 1
Roles                         :
Status                        :
StatusDescriptions            :
TimeOfLastConfigurationChange : 20090421021103.000000-000
TimeOfLastStateChange         : 20090421021103.000000-000

Так, вот мы получили все данные по ВМ. Как видно у меня она пока одна. Эту информацию теперь можно использовать например для создания снимков состояния данной ВМ.
Для создания снимка воспользуемся классом Virtual System Management Classes
У него есть метод CreateVirtualSystemSnapshot, ниже я приведу выдержку описания свойства этого метода:
uint32 CreateVirtualSystemSnapshot(
[in] CIM_ComputerSystem REF SourceSystem,
[out] CIM_VirtualSystemSettingData REF SnapshotSettingData,
[out] CIM_ConcreteJob REF Job
);

Если честно, тут из описания, я понял, что SourceSystem это имя виртуальной машины. Но ниже на справочной странице есть пример скрипта, в нем я понял что это путь до ВМ :)

Пробуем создать снимок.

[PS] C:\>$vsms = get-wmiobject -namespace root\virtualization Msvm_VirtualSystemManagementService
[PS] C:\>$vm = get-wmiobject -namespace root\virtualization -Class Msvm_ComputerSystem  -filter  'ElementName <> "VS-02"'
[PS] C:\>$vm.__PATH
\\VS-02\root\virtualization:Msvm_ComputerSystem.CreationClassName="Msvm_ComputerSystem",Name="A115BF3C-1856-4F59-BF04-F3E8B0FF96B6"

Так, теперь создадим сам снимок следующей командой:

[PS] C:\>$vsms.CreateVirtualSystemSnapshot($vm.__PATH)
__GENUS             : 2
__CLASS             : __PARAMETERS
__SUPERCLASS        :
__DYNASTY           : __PARAMETERS
__RELPATH           :
__PROPERTY_COUNT    : 3
__DERIVATION        : {}
__SERVER            :
__NAMESPACE         :
__PATH              :
Job                 : \\VS-02\root\virtualization:Msvm_ConcreteJob.InstanceID="7E004A3B-ECD9-4A2E-8DB9-38708E701417"
ReturnValue         : 4096
SnapshotSettingData :
[PS] C:\>

В оснастке Hyper-V у ВМ srv-01 появился снимок, получилось :)
Все отлично, но не может же у нас до бесконечности накапливаться количество снимков, Тут попросту ни каких винчестеров не хватит, значит надо и удалять старые снимки. Для этого у класса Msvm_VirtualSystemManagementService есть метод RemoveVirtualSystemSnapshot со следующеми свойствами:

uint32 RemoveVirtualSystemSnapshot(
[in] CIM_VirtualSystemSettingData REF SnapshotSettingData,
[out] CIM_ConcreteJob REF Job
);
Все отлично, но надо понять, что удалять для это воспользуемся классом Msvm_VirtualSystemSettingData у него есть свойство SettingType который принимает два значения:

3 – Настройки/данные ВМ

5 – Настройки/данные снимков ВМ

[PS] C:\>$vsmss = get-wmiobject -namespace root\virtualization -Class Msvm_VirtualSystemSettingData -Filter 'SettingType = 5'

Теперь в переменной $vsmss у нас хранятся информация о всех снимках. Так как пока у меня снимок один, я его и удалю через метод RemoveVirtualSystemSnapshot:

[PS] C:\>$vsms.RemoveVirtualSystemSnapshot($vsmss)

Смотрим через оснастку. Да, у меня больше созданного снимка нету :)
Пока все :)

  1. Пока что нет комментариев.
Необходимо войти на сайт, чтобы написать комментарий.