Задержка запуска виртуальной машины Hyper-V: решение PowerShell

Опубликовано: 16 Апреля, 2023
Задержка запуска виртуальной машины Hyper-V: решение PowerShell

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

Один из вариантов — обратиться к сценариям PowerShell. На самом деле существует недокументированный командлет Hyper-V, который можно использовать для задержки запуска виртуальной машины.

Командлет называется Wait-VM. Как я уже сказал, этот командлет полностью недокументирован. Microsoft поддерживает веб-страницу с синтаксисом и примерами использования для каждого командлета PowerShell, но по какой-то причине эта страница была исключена. Я совершенно случайно наткнулся на командлет, работая над чем-то не связанным.

Итак, после сказанного давайте взглянем на синтаксис командлета. Несмотря на то, что Microsoft не предоставляет онлайн-документацию для этого командлета, по-прежнему можно получить информацию о синтаксисе командлета, введя командлет Get-Help, а затем командлет Wait-VM. Вот синтаксис, указанный Get-Help:

ИМЯ
Подождите-ВМ

СИНТАКСИС
Wait-VM [-Name] <string[]> [-CimSession <CimSession[]>] [-ComputerName <string[]>] [-Credential <pscredential[]>]
[-AsJob] [-Passthru] [-For {Heartbeat | IP-адрес | Перезагрузка | MemoryOperations}] [-Delay <uint16>] [-Timeout <int>]
[<Общие параметры>]

Wait-VM [-VM] <VirtualMachine[]> [-AsJob] [-Passthru] [-For {Heartbeat | IP-адрес | Перезагрузка | Операции с памятью}]
[-Delay <uint16>] [-Timeout <int>] [<CommonParameters>]

Псевдонимы
Никто

ПРИМЕЧАНИЯ
Get-Help не может найти файлы справки для этого командлета на этом компьютере. Он отображает только частичную справку.
— Чтобы загрузить и установить файлы справки для модуля, включающего этот командлет, используйте Update-Help.

Если вы не привыкли смотреть на полную разбивку синтаксиса для командлетов PowerShell, то поначалу этот может показаться немного сложным. Однако хорошая новость заключается в том, что большинство параметров, перечисленных в приведенном выше синтаксисе, являются необязательными. Использовать командлет Wait-VM на самом деле довольно просто.

Самый простой способ использовать командлет Wait-VM — просто ввести Wait-VM, затем указать параметр Name и имя виртуальной машины, на которой вы хотите ожидать. Например, в своем тестировании я использовал виртуальную машину с именем DC. Вот как выглядела команда:

Wait-VM -Name DC

Изображение 14476
Из того, что я смог наблюдать, кажется, что указанная выше команда заставила мой сценарий PowerShell приостановить и дождаться запуска указанной виртуальной машины. Имейте в виду, что эта команда на самом деле не запускает виртуальную машину. Это надо делать отдельно. Команда просто не позволяет сценарию делать что-либо еще, пока виртуальная машина не будет подключена к сети.

Теперь я должен быть полностью честным с вами и сказать, что, поскольку командлет Wait-VM не задокументирован, я не совсем уверен, какой триггер вызывает прекращение ожидания. Поэкспериментировав с командлетом, я могу точно сказать, что время ожидания не основано на таймере. Разные виртуальные машины ждали разное время. Я также могу сказать вам, что ожидание закончилось тем, что виртуальная машина прошла большую часть процесса загрузки, но еще не отобразила экран входа в систему.

Больше контроля

Если вы предпочитаете немного больше контролировать ожидание, есть несколько параметров, которые вы можете использовать. Один из возможных вариантов — добавить задержку к ожиданию. Командлет Wait-VM включает параметр Delay, который можно использовать для увеличения времени ожидания. Ранее, например, я указывал, что когда я запускал командлет Wait-VM, указав только имя ВМ, ожидание заканчивалось до того, как ВМ достигла приглашения для входа в систему. Я обнаружил, что, добавив задержку, можно увеличить время ожидания, чтобы убедиться, что процесс загрузки виртуальной машины завершен. Например, в одном из своих тестов я решил добавить к ожиданию две минуты (120 секунд). Это привело к тому, что ожидание не закончилось до тех пор, пока не отобразился экран входа в систему. Вот как выглядит команда:

Wait-VM -Name DC -Delay 120

Изображение 14477
Еще одна вещь, которую вы можете сделать, это указать, чего вы хотите, чтобы PowerShell ждал. Если вы посмотрите на синтаксис командлета Wait-VM, вы заметите, что вы можете указать параметр For вместе с тем, чего вы хотите ждать. Возможные варианты включают ожидание, пока виртуальная машина выдаст пульс, получит IP-адрес или перезагрузится. Существует также опция операций с памятью, но я не совсем уверен, что она на самом деле делает.

Использовать параметр For просто. Просто укажите параметр, а затем то, что вы хотите ждать. Например, если вы хотите дождаться пульса виртуальной машины, команда будет выглядеть так:

Wait-VM -Name DC -For Heartbeat

Изображение 14478
Отсрочка запуска виртуальной машины Hyper-V: два последних совета

Я могу придумать около миллиарда различных способов использования командлета Wait-VM в различных сценариях PowerShell. Потенциальные области применения варьируются от развертывания многоуровневых приложений до аварийного восстановления. Однако прежде чем вы попытаетесь использовать этот командлет в производственной среде, я хотел бы дать вам два совета.

Во-первых, проведите немного времени в лабораторной среде, чтобы привыкнуть к команде, прежде чем попробовать ее в рабочей среде. Это недокументированный командлет, поэтому он может вести себя не совсем так, как вы ожидаете.

Во-вторых, вы можете подумать о включении параметра тайм-аута в свои скрипты. Указав период ожидания, вы можете предотвратить зависание сценария в случае, если виртуальная машина не запустится.