В гипервизоре 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), а также снизить нагрузку на систему хранения, вызванную одновременным запуском множетсва ВМ).
Также в разделе Automatic Stop Action можете задать для виртуальных машин действие, которое нужно выполнить при выключении (перезагрузке) хоста.
- 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
Вы можете изменить настройки автозапуска для ВМ с помощью опции AutomaticStartAction. Возможные значения (Nothing, StartIfRunning, Start).
Get-VM –VMname win10 | Set-VM –AutomaticStartAction Start
Чтобы установить задержку запуска для всех ВМ, кроме одной (например контролера домена с FSMO ролями):
Get-VM –VMname * | Where-object –FilterScript {$_.vmname –notlike “msk-dc*”} | Set-VM –AutomaticStartDelay 90
С помощью параметра –AutomaticStopAction соотвественно можно задать параметры выключения ВМ (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"
Следующий 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 скриптов.