Hyper-V. Часть 7: Управляем Hyper-V с рабочей станции

Все части серии «Hyper-V»

Во всех предыдущих частях команды выполнялись на самом хосте. В работе так не делают: заходить на хост по RDP ради каждой машины не нужно, а на хосте с Server Core и негде открыть окно консоли. Разберём, как управлять Hyper-V с рабочей станции администратора: какие средства на неё поставить и какие права выдать, как подключиться к хосту в домене и вне домена, как открыть консоль машины и как выполнять команды внутри гостя без его сети.


Средства управления

Hyper-V Manager и модуль PowerShell есть в Windows 10 и 11 редакций Pro и Enterprise; в Home компонента Hyper-V нет (Hyper-V в Windows). Сам гипервизор на рабочей станции ставить не обязательно — достаточно средств управления (удалённое управление хостами):

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Tools-All -All
Get-WindowsOptionalFeature -Online -FeatureName 'Microsoft-Hyper-V-Management*' | Format-Table FeatureName, State

Microsoft-Hyper-V-Tools-All включает два компонента: Microsoft-Hyper-V-Management-Clients — Hyper-V Manager (virtmgmt.msc) и окно подключения к машине vmconnect.exe, и Microsoft-Hyper-V-Management-PowerShell — модуль Hyper-V. В окне «Компоненты Windows» это пункт «Средства управления Hyper-V».

На другом Windows Server, с которого вы управляете хостами, те же средства без самой роли ставит Install-WindowsFeature RSAT-Hyper-V-Tools (установка роли). Модуль кластеров, который понадобится в частях о сборке и обслуживании кластера, — RSAT-Clustering-PowerShell на сервере или компонент Rsat.FailoverCluster.Management.Tools на Windows 10/11:

Add-WindowsCapability -Online -Name 'Rsat.FailoverCluster.Management.Tools~~~~0.0.1.0'

Права на хосте

Пользователь должен входить в локальную группу Administrators или Hyper-V Administrators на хосте. Вторая даёт полный доступ к Hyper-V, но не к остальной системе (встроенные группы), поэтому администраторов виртуализации добавляют в неё:

Invoke-Command -ComputerName hv1, hv2 { Add-LocalGroupMember -Group 'Hyper-V Administrators' -Member 'CORP\hv-admins' }
Invoke-Command -ComputerName hv1, hv2 { Get-LocalGroupMember -Group 'Hyper-V Administrators' }

Членство в Hyper-V Administrators не даёт прав на файлы: если машине нужен диск из папки, к которой у пользователя нет доступа, Add-VMHardDiskDrive откажет. Папки Hyper-V на хосте обычно настраивают так, чтобы группа имела к ним полный доступ.

Хост в том же домене

Если рабочая станция и хост в одном домене, вход проходит по Kerberos и ничего настраивать не нужно, кроме включённого на хосте удалённого управления (Enable-PSRemoting; на Windows Server оно включено по умолчанию). Командлеты модуля Hyper-V принимают -ComputerName и ходят на хост через WMI — это порт TCP 135 и динамический порт из диапазона 49152–65535 (порты служб Windows):

Get-VM -ComputerName hv1, hv2 | Format-Table ComputerName, Name, State, Uptime
Start-VM -ComputerName hv1 -Name app1
virtmgmt.msc    # Hyper-V Manager, «Подключиться к серверу» → hv1

Удобнее один раз открыть CIM-сеанс и передавать его всем командам — так не нужно повторять подключение для каждой:

$hv = New-CimSession -ComputerName hv1, hv2
Get-VM -CimSession $hv | Format-Table ComputerName, Name, State
Get-VMSwitch -CimSession $hv | Format-Table ComputerName, Name, SwitchType

Всё, что выходит за рамки модуля Hyper-V, — модули Storage и NetAdapter, файлы, службы — удобнее выполнять на самом хосте через PowerShell Remoting (WinRM, TCP 5985):

Invoke-Command -ComputerName hv1 { Get-Volume | Format-Table DriveLetter, FileSystemLabel, SizeRemaining, Size }
Enter-PSSession -ComputerName hv1

Если ваша учётная запись не администратор хоста, Hyper-V Manager умеет подключаться от имени другого пользователя («Подключиться как другой пользователь»), а в PowerShell есть -Credential: Enter-PSSession -ComputerName hv1 -Credential CORP\hv-admin.

Хост вне домена

Хост в рабочей группе (или в чужом домене без доверия) Hyper-V Manager подключает через CredSSP. Настройка — по документации (удалённое управление хостами). На хосте:

Enable-PSRemoting
Enable-WSManCredSSP -Role Server

На рабочей станции:

Set-Item WSMan:\localhost\Client\TrustedHosts -Value 'hv9.example.net' -Concatenate
Enable-WSManCredSSP -Role Client -DelegateComputer 'hv9.example.net'

Иногда нужна ещё групповая политика «Конфигурация компьютера → Административные шаблоны → Система → Передача учётных данных → Разрешить передачу новых учётных данных с проверкой подлинности сервера только NTLM» со значением wsman/hv9.example.net. Учётные данные при подключении — локальной учётной записи хоста: hv9\Administrator.

$cred = Get-Credential 'hv9\Administrator'
Get-VM -ComputerName hv9.example.net -Credential $cred

Консоль машины: vmconnect

Чтобы увидеть экран машины — установку ОС, загрузчик, синий экран, машину без сети, — нужна консоль. Её открывает vmconnect.exe — то же окно, которое мы открывали в первой части на самом хосте:

vmconnect.exe hv1 app1

По сети соединение идёт только до хоста: картинку экрана машины отдаёт служба VMMS, она слушает TCP 2179 (порты служб Windows). Поэтому консоль работает, даже если у гостя нет ни сети, ни включённого RDP. Проверить на хосте:

Invoke-Command -ComputerName hv1 { Get-NetTCPConnection -LocalPort 2179 -State Listen }

У консоли два режима. Базовый показывает экран и передаёт клавиатуру и мышь — как монитор, подключённый к машине. Расширенный сеанс (enhanced session) — это RDP, который идёт не по сети, а по VMBus: с ним работают буфер обмена и копирование файлов, перенаправление локальных дисков, принтеров, звука, USB-устройств и смарт-карт, а окно меняет разрешение экрана гостя (локальные ресурсы в VMConnect). Условия:

  • на хосте включена настройка расширенного сеанса — Set-VMHost -EnableEnhancedSessionMode $true, по умолчанию на Windows Server она выключена (Set-VMHost);
  • vmconnect запущен на Windows 10, Windows Server 2016 или более новой системе;
  • в госте Windows 10 или Windows Server 2016 и новее с включёнными службами удалённых рабочих столов.
Set-VMHost -ComputerName hv1 -EnableEnhancedSessionMode $true
vmconnect.exe hv1 app1 /edit     # открыть настройки сеанса: разрешение, диски, устройства

Для Ubuntu и других Linux расширенный сеанс настраивается отдельно, внутри гостя (там же).

Консоль — инструмент для случаев, когда к машине иначе не подключиться. Для повседневной работы к гостю подключаются как к любому серверу — по RDP, WinRM или SSH по сети: так не нужны права администратора Hyper-V на хосте, а сессия не зависит от того, на каком узле кластера сейчас машина.

PowerShell Direct

С хоста можно выполнять команды внутри гостя без сети и без настроенного WinRM — канал идёт по VMBus. Это PowerShell Direct, которым мы уже пользовались в частях о дисках и сети: нужны хост и гость не старше Windows Server 2016 (или Windows 10) и учётные данные гостя (PowerShell Direct).

$cred = Get-Credential 'app1\Administrator'
Invoke-Command -VMName app1 -Credential $cred -ScriptBlock { Get-NetIPAddress -AddressFamily IPv4 }
Enter-PSSession -VMName app1 -Credential $cred
$s = New-PSSession -VMName app1 -Credential $cred
Copy-Item -ToSession $s -Path 'D:\dist\agent.msi' -Destination 'C:\Temp\'

Этим спасают машины с неправильно настроенной сетью или брандмауэром: зайти в них по сети нельзя, а по VMBus — можно. Машина должна быть запущена и находиться на том же хосте, где выполняется команда; учётные данные проверяет сам гость, поэтому членство в Hyper-V Administrators на хосте не даёт доступа внутрь машины.

PowerShell Direct работает только локально на хосте, поэтому с рабочей станции его вызывают изнутри сессии на хосте, а учётные данные гостя передают через $using::

$cred = Get-Credential 'app1\Administrator'
Invoke-Command -ComputerName hv1 {
    Invoke-Command -VMName app1 -Credential $using:cred { Get-Service W32Time }
}

Смотрим руками

Все машины на всех хостах одной таблицей — с рабочей станции:

$hv = New-CimSession -ComputerName hv1, hv2
Get-VM -CimSession $hv | Sort-Object ComputerName, Name |
    Format-Table ComputerName, Name, State, Uptime, @{n='MemGB'; e={[math]::Round($_.MemoryAssigned/1GB, 1)}}

Проверить, что с рабочей станции открываются все нужные порты хоста:

foreach ($p in 135, 5985, 2179) {
    Test-NetConnection -ComputerName hv1 -Port $p | Select-Object ComputerName, RemotePort, TcpTestSucceeded
}

Источники


Рабочей станции администратора хватает средств управления и членства в Hyper-V Administrators: модуль ходит на хосты по WMI, консоль машин — к VMMS на порт 2179, а внутрь гостя без сети ведёт PowerShell Direct.

Дальше — часть 8: переносим виртуальные машины между хостами. Экспорт и импорт, живая миграция без кластера и её аутентификация, перенос хранилища на работающей машине, совместимость процессоров, обновление версии конфигурации после переезда и Hyper-V Replica для аварийного переключения.

Оставить комментарий могут только зарегистрированные пользователи.

Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.