Устранение проблем с виртуальными сетями Hyper-V с помощью PowerShell

Опубликовано: 15 Марта, 2023
Устранение проблем с виртуальными сетями Hyper-V с помощью PowerShell

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

В последнее время я использую инструмент на основе PowerShell для устранения проблем с виртуальными сетями Hyper-V. Прежде чем я покажу вам, как работает этот инструмент, я должен указать, что он не включен в собственный PowerShell. Этот инструмент на самом деле является частью System Center Virtual Machine Manager и предназначен для запуска через командную оболочку Virtual Machine Manager.

Итак, что это за инструмент? Связанный командлет — Repair-SCVirtualNetwork.

Использование командлета PowerShell

Использование командлета Repair-SCVirtualNetwork обычно довольно простое и понятное. Обычно вам просто нужно указать виртуальную сеть, которую вы хотите восстановить. Однако это может немного усложнить то, что несколько хостов Hyper-V обычно используют общее имя виртуального коммутатора.

Давайте представим на мгновение, что у меня есть два хоста Hyper-V с именами Hyper-V-1 и Hyper-V-2. Давайте также представим, что у меня есть виртуальная машина с именем VM1, работающая на Hyper-V-1, и я хочу выполнить живую миграцию этой виртуальной машины на Hyper-V-2. Если эта динамическая миграция должна быть полностью плавной, тогда Hyper-V-2 необходимо будет предоставить виртуальный коммутатор с тем же именем, что и виртуальный коммутатор, который VM1 в настоящее время использует в Hyper-V-1. Конечным результатом будет наличие нескольких виртуальных коммутаторов с одинаковым именем.

Если вы хотите увидеть более конкретный пример, посмотрите на снимок экрана ниже. На этом изображении я ввел командлет Get-SCVirtualNetwork. Затем я использовал командлет Select-Object, чтобы указать, что я хочу видеть имя виртуальной сети и имя узла Hyper-V, на котором находится виртуальный коммутатор виртуальной сети. Как вы можете видеть на рисунке, у меня есть несколько хостов Hyper-V, которые содержат виртуальную сеть с именем My Virtual Switch.

Изображение 4247 Проблема и обходной путь

К сожалению, командлет PowerShell Repair-SCVirtualNetwork не содержит параметра, позволяющего указать, что восстановление должно выполняться для определенного хоста. Командлет позволяет указать только имя виртуальной сети, которую вы хотите восстановить. Так как же обойти проблему с одинаковыми именами виртуальных сетей на нескольких хостах?

Прежде чем я покажу вам, как решить эту проблему, я хочу показать вам, что в некотором запутанном виде System Center коллективно обрабатывает эти виртуальные коммутаторы с одинаковыми именами, как если бы они были одной виртуальной сетью, хотя на самом деле они являются отдельными объектами. Позвольте мне показать вам, что я имею в виду.

Если вы откроете консоль диспетчера виртуальных машин, перейдете в рабочую область «Виртуальные машины и службы», а затем щелкните «Сети виртуальных машин», вы увидите список сетей виртуальных машин, которые существуют в вашей организации. Если вы посмотрите на рисунок ниже, вы заметите, что консоль отображает только один экземпляр My Virtual Switch, хотя группа All Hosts явно содержит каждый из хостов, показанных на предыдущем снимке экрана.

Кроме того, если бы я щелкнул правой кнопкой мыши на виртуальном коммутаторе и выбрал команду View Dependent Resources из контекстного меню, я бы увидел список всех виртуальных машин, которые зависят от этого виртуального коммутатора. Эти виртуальные машины распределены по узлам в моей организации. Кстати, мои хосты Hyper-V не кластеризованы.

Поскольку существует несколько экземпляров рассматриваемой виртуальной сети, первое, что необходимо сделать перед восстановлением виртуальной сети, — это сопоставить эти экземпляры виртуальной сети с переменной. Поступая таким образом, я могу сузить круг задач и ссылаться только на одну виртуальную сеть. Это важно, потому что командлет PowerShell Repair-SCVirtualNetwork завершится ошибкой, если вы попытаетесь запустить его одновременно в нескольких виртуальных сетях.

Обычно именно так вы сопоставляете виртуальную сеть с переменной:

$VirtualNetwork = Get-SCVirtualNetwork -Name «Мой виртуальный коммутатор»

Однако, поскольку цель состоит в том, чтобы захватить одну виртуальную сеть, нам нужно добавить фильтр. Таким образом, мы можем указать, виртуальную сеть какого хоста мы хотим исследовать. Вот как выглядит команда:

$VirtualNetwork = Get-SCVirtualNetwork -Name «Мой виртуальный коммутатор» | Где-объект {$_.VMHost -eq «hyper-v-1.mgmt.com»}

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

Изображение 4248
Сопоставив виртуальные сети с переменной, мы можем запустить процесс восстановления. Как упоминалось ранее, все, что вам нужно сделать, это запустить командлет Repair-SCVirtualNetwork и добавить имя виртуальной сети, которую вы хотите восстановить. Поскольку в этом случае экземпляр виртуальной сети был сопоставлен с переменной, нам нужно ссылаться на переменную, а не указывать фактическое имя виртуальной сети. Вот как будет выглядеть команда:

Repair-SCVirtualNetwork -VirtualNetwork $VirtualNetwork

Проблемы с виртуальной сетью Hyper-V: дополнительная информация

К счастью, проблемы с виртуальной сетью Hyper-V, как правило, возникают довольно редко. Однако при возникновении проблем вы можете использовать командлет Repair-SCVirtualNetwork для устранения проблемы. Полную документацию по командлету можно найти здесь.