Hyper-V: настройка автоматического запуска и порядка загрузки виртуальных машин

В гипервизоре Hyper-V, как и в VMWare ESXi , вы можете настроить параметры автоматического запуска и выключения виртуальных машин при включении/перезагрузке хостовой ОС. В этой статье мы покажем, как настроить действия, которые должен выполнить хост Hyper-V с виртуальными машинами на нем при включении или корректном выключении, а также как задать порядок загрузки ВМ.

Как настроить автоматический запуск/выключение виртуальных машин в Hyper-V?

По умолчанию сервер Hyper-V при перезагрузке сохраняет состояние виртуальных машин на нем. Т.е. если ВМ была запущена до перезагрузки, Hyper-V запустит ее автоматически. Настройки автозапуска задаются персонально для каждой ВМ.

Запустите консоль Hyper-V, откройте свойства любой ВМ и перейдите в раздел Settings -> Automatic Start Action . Доступно три опции управления автозапуском виртуальной машины:

  • Nothing – при загрузке хоста виртуальная машина не запускается автоматически (не зависимо от ее состояния до перезагрузки сервера);
  • Automatically start if it was running when the service stopped – ВМ будет автоматически запущена только если она была включена до выключения хоста.
  • Always start this virtual machine automatically – всегда включать данную виртуальную машину при загрузке хоста Hyper-V.

Для последней опции доступен еще один параметр – Startup Delay . Здесь можно указать задержку запуска для данной виртуальной машины (в секундах). С помощью такой задержки вы можете управлять порядком запуска виртуальных машин (например, включать контроллер домена перед запуском ВМ с SQL Server), а также снизить нагрузку на систему хранения, вызванную одновременным запуском множетсва ВМ).

настройка автоматического запуска виртуальных машин hyper-v

Что интересно, в Windows Admin Center пока отсутствуют опции для управления автозагрузкой виртуальных машин Hyper-V.

Также в разделе Automatic Stop Action можете задать для виртуальных машин действие, которое нужно выполнить при выключении (перезагрузке) хоста.

Здесь подразумеваются не аварийные ситуации (отключение питания, падение в BSOD), а корректная перезагрузка хостовой ОС, когда у виртуальных машин есть время чтобы завершить работу.
  • Save the virtual machine state – сохраняется полное состояние виртуальной машины (включая память). При следующем запуске эта ВМ продолжит работу с того же места. Здесь нужно иметь в виду, что на диске потребуется дополнительное свободное место для сохранения оперативной памяти ВМ (*.BIN файлы). Гостевая ОС при этом не перезагружается.
  • Turn off the virtual machine – при завершении работы хоста Hyper-V такая виртуальная машина просто выключается (аналогия отключения питания на физическом компьютере). Состояние ВМ не сохраняется, гостевая ОС начинает полноценный цикл загрузки. В таком режиме есть риск получить неконсистентные данные в приложениях, запущенных внутри ВМ;
  • Shutdown the guest operating system – выполняется штатное выключение гостевой ОС через службу интеграции Hyper-V (graceful shutdown). Все запущенные внутри ВМ приложения выключаются штатно, риск получить неконсистентные данные минимален.

настроить действие с виртуальными машинами при выключении

Вы можете проверить и изменить настройки автозапуска и выключения виртуальных машин с помощью PowerShell.

Выведем текущие настройки запуска и остановки всех ВМ:

Get-VM –VMname * | Select-Object VMname,AutomaticStartAction,AutomaticStartDelay,AutomaticStopAction

вывести настройки запуска, выключения ВМ на хосте Hyper-V через powershell (AutomaticStartAction,AutomaticStartDelay,AutomaticStopAction)

Вы можете изменить настройки автозапуска для ВМ с помощью опции AutomaticStartAction . Возможные значения (Nothing, StartIfRunning, Start).

Get-VM –VMname win10 | Set-VM –AutomaticStartAction Start

Вы можете использовать PowerShell для настройки параметров виртуальных машин на хосте с бесплатным Windows Hyper-V Server , на котором отсустует графический интерфейс.

Чтобы установить задержку запуска для всех ВМ, кроме одной (например контролера домена с FSMO ролями ):

Get-VM –VMname * | Where-object –FilterScript {$_.vmname –notlike “msk-dc*”} | Set-VM –AutomaticStartDelay 90

С помощью параметра – AutomaticStopActio n соотвественно можно задать параметры выключения ВМ (Save, TurnOff,ShutDown)

Порядок загрузки (запуска) виртуальных машин в Hyper-V

При включении отдельностоящего хоста Hyper-V администратору необходимо управлять порядком запуска виртуальных машин. Например, вам нужно чтобы ВМ с Exchange загружалась только после загрузки контроллера домена, а сервер с приложением должен стартовать после db сервера. В Hyper-V нет встроенных инструментов управления порядком запуска виртуальных машин, кроме параметра задержки старта (AutomaticStartDelay).

В самых простых случаях вы можете настроить порядок загрузки ВМ, задав для них разные задержки запуска:

Get-VM –VMname dc01| Set-VM –AutomaticStartDelay 0
Get-VM –VMname exchange, db01 | Set-VM –AutomaticStartDelay 90
Get-VM –VMname rds01,app01 | Set-VM –AutomaticStartDelay 180

Другой вариант – вы можете стартовать ВМ по очереди с помощью стартап скрипта PowerShell. В таком скрипте можно задать задержку перед запуском следующей ВМ и выполнить дополнительные проверки доступности приложения или сервиса в ВМ (что убедиться что нужно приложение или служба запустились). Также для удобства можно объединить несколько ВМ в одну группу с помощью меток. Например, я задал такие метки для ВМ

set-vm dc01,dc02 -Notes "Boot order 1"
set-vm exchange1, db01 -Notes "Boot order 2"
set-vm rds01,app01 -Notes "Boot order 3"

задать метки виртуальным машинам hyper-v для управления порядком загрузки

Следующий PowerShell скрипт запускает виртуальные машины в определённом порядке, выполняя дополнительные проверки доступности определенных служб (TCP портов) в ВМ с помощью PowerShell командлета Test-NetConnection :

$VMtoStart = Get-VM | where notes -contains 'Boot order 1'
foreach ($cn in $VMtoStart)
{Start-VM $cn.name -asjob}
While (!(Test-NetConnection dc01 -Port 445 -WarningAction SilentlyContinue).tcpTestSucceeded ){
Start-Sleep 30
}
$VMtoStart = Get-VM | where notes -contains 'Boot order 2'
foreach ($cn in $VMtoStart)
{Start-VM $cn.name -asjob}
While ((Test-NetConnection exchange1 -Port 25 -WarningAction SilentlyContinue).tcpTestSucceeded ){
Start-Sleep 30
}
$VMtoStart = Get-VM | where notes -contains 'Boot order 3'
foreach ($cn in $VMtoStart)
{Start-VM $cn.name -asjob}

Осталось добавить этот PowerShell скрипт в автозагрузку или запускать через задание планировщика (нужно не забыть отключить автоматический запуск всех ВМ, которые запускаются этим скриптом). Не забывайте, что в Windows запуск PowerShell скриптов по-умолчанию ограничен. Если нужно, подпишите этот PS1 скрипт или измените политику запуска PowerShell скриптов .

EnglishRussianUkrainian