Яндекс.Метрика

    Песочница

    PowerShell+Hyper-V

    Не могу уже через gui...


    Примерно так начинался мой разговор с другом которому в течение короткого промежутка времени пришлось несколько раз подряд экспортировать виртуальные машины из Hyper-V. Обычно для этого используется Hyper-V Manager (HVM), который устанавливается вместе с ролью Hyper-V под Windows Server 2008 R2. Я должен признаться что интерфейс этой программы не вызывает у меня каких-либо негативных эмоций. Среди всех программ для управления, которые Microsoft поставляет к Server эта мне кажется наиболее удобной и понятной (сравниваю например с IIS Manager, который вызывает недоумение у новых пользователей и бурное негодование у тех кто использовал IIS 6 в 2003 Server). Однако если нужно экспортировать или импортировать виртуальную машину в количестве N-штук в промежуток t-времени то используя Hyper-V Manager можно сломать кнопку у мыши и жутко возненавидеть Hyper-V. Тут на помощь и приходит PowerShell.
    Import-Module HyperV

    … И по умолчанию такого модуля в PowerShell конечно нет. Microsoft решила что писать командлеты для управления Hyper-V ни кто не будет (действительно дикая затея). С другой стороны этот мир полон людей умеющих и готовых упрощать жизнь себе и другим пользователям. Так на свет и появился PowerShell management Library for Hyper-V.
    Первое что нужно сделать- это скачать этот модуль + документация, по вкусу. (Оба доступны по:http://pshyperv.codeplex.com/releases)
    Потом необходимо этот модуль установить. Процесс не сложный (запускаемый файл install выдает себя с головой).
    Теперь можно работать. Запускаем PowerShell, импортируем модуль (то что написано в подзаголовке).
    И нам доступны все функции которые мы могли использовать через HVM, вот некоторые из них:

    Подключение к виртуальной машине
    New-VMConnectSession

    Манипулирование состоянием виртуальных машин
    Get-VMState, Set-VMState, Convert-VmState,
    Ping-VM, Test-VMHeartBeat, Shutdown-VM, Start-VM, Stop-VM, Suspend-VM
    Get-VMKVP, Add-KVP, Remove-KVP, Get-VMJPEG

    Возможность делать бэкапы, экспорт виртуальных машин и снятие снэпшотов
    Export-VM, Import-VM, Get-VMSnapshot, Choose-VMSnapshot, Apply-VMSnapshot, New-VMSnapshot ,Remove-VMSnapshot, Rename-VMSnapShot, Update-VMSnapshot, Get-VMSnapshotTree, Get-VmBackupScript

    Добавление и удаление вирт. машин, настройка их свойств
    New-VM, Remove-VM, Set-VM, Get-VMCPUCount, Set-VMCPUCount, Get-VMMemory, Set-VMMemory, Set-VMSerialPort

    Управление дисковыми контроллерами
    Get-VMDiskController
    Add-VMSCSIController, Remove-VMSCSIcontroller
    Get-VMDriveByController, Add-VMDRIVE, Remove-VMdrive
    Get-VMDiskByDrive, Add-VMDISK, Set-VMDisk, Get-VMDisk
    Get-VMFloppyDisk, Add-VMFloppyDisk
    Add-VMNewHardDisk

    Управление сетевыми интерфейсами
    Get-VMNic, List-VMNic, Choose-VMNIC, Add-VMNIC, Remove-VMNIC, Set-VMNICAddress, Set-VMNICConnection, Get-VMNicport,
    Get-VMnicSwitch, Choose-VMSwitch, New-VMSwitchPort, Get-VMByMACaddress, Choose-VMExternalEthernet,
    New-VMExternalSwitch, New-VMInternalSwitch,New-VmPrivateSwitch

    Работа с VHD файлами
    Get-VHDDefaultPath, Get-VHDInfo, New-VHD, Compact-VHD, Test-VHD,Convert-VHD,Merge-VHD,Mount-VHD, Unmount-VHD

    Все приведенные команды говорят сами за себя.
    Например чтобы получить состояние виртуальной машины достаточно ввести:
    List-VMState имя вирт. машины
    и в результате:
    image
    В моем примере всего одна виртуальная машина => я не указывал параметров, но если у вас их много, то наверное следует явно указать ее имя, если не хочется потом пробираться сквозь консольный вывод.
    Так же просто например узнать об используемых сетевых интерфейсах для виртуальных машин, достаточно лишь ввести:
    Get-VMNic
    и получаем:
    image
    Ну и самое, то что и было необходимо моему другу- возможность делать экспорт в фоне, по расписанию. Для этого можно написать командлет который потом запихнуть в Scheduler. У меня например этот командлет останавливает виртуальную машину, делает ее экспорт, запускает снова и посылает мне письмо об ошибке или успехе выполнения командлета. После этого управление передается другому скрипту который архивирует и посылает backup на удаленный ftp.
    Экспорт: export-vm -vm MyVM1 -path D:\backups\VM -copystate -wait -force
    Параметр -copystate говорит что нужно скопировать все (включая виртуальный диск => размер экспорта на выходе может получиться очень большим)

    Вместо заключения

    Как видно управление своими виртуальными машинами из PowerShell может быть очень удобным и ненапряжным. Достаточно лишь прочитать параметры тех команд которые вам необходимы и написать свой скрипт.

    P.S. Совершенно не претендую на «открытие Америки» просто решил что кому-нибудь информация об этом полезном модуле окажется полезной. Я описал лишь наиболее простые варианты для которых можно использовать PowerShell management library for Hyper-V. Если кто-то знает или написал собственные более удобные инструменты для оптимизации работы с Hyper-V буду только рад узнать о них.