Hyper-V Server 2019: Установка, настройка и обслуживание
Microsoft Windows Hyper-V Server - это бесплатный продукт с возможностями виртуализации корпоративного класса помогающий повышать эффективность использования серверов и сокращать расходы. Это отдельный продукт, который включает только гипервизор Windows, модель драйвера Windows Server и компоненты виртуализации. Последняя доступная версия вышла в 2019 году и называется - Microsoft Hyper-V Server 2019. На более современных системах начиная с Windows Server 2022 в desktop или core-варианте потребуется установить Hyper-V отдельно. Правда в этом случае лицензия на Windows уже понадобится.
В этой заметке расскажу как развернуть и подготовить MS Hyper-V хост для успешного старта виртуальных Windows и Linux машин:
1. Подготовка
• Скачиваем дистрибутив на сайте Microsoft или где-то еще!
• Устанавливаем Windows Hyper-V на физический сервер так же как и любой другой дистрибутив от Microsoft.
• Настраиваем сеть при помощи Server Configuration (sconfig) или команд powershell:
# Перечислить все доступные сетевые адаптеры:
Get-NetAdapter -Name *
# Перечислить все сетевые адаптеры с поддержкой IPV6:
Get-NetAdapterBinding -ComponentID ms_tcpip6
# Отключить IPV6 на сетевом адаптере Ethernet:
Disable-NetAdapterBinding -InterfaceAlias "Ethernet" -ComponentID ms_tcpip6
# Перечислить все IP-адреса в системе:
Get-NetIPAddress | ft
# Перечислить все сетевые интерфейсы:
Get-NetIPConfiguration
# Перечислить все сетевые интерфейсы и применённые к ним сетевые профили:
Get-NetConnectionProfile
# Изменить тип сети для сетевого интерфейса с индексом 13 на Private:
Set-NetConnectionProfile -InterfaceIndex 13 -NetworkCategory Private
# Отобразить активный профиль сети с индексом 13:
Get-NetConnectionProfile -InterfaceIndex 13
# Назначить статический IP адрес, маску сети, шлюз по умолчанию и адреса DNS для
сетевого адаптера с индексом 13:
New-NetIPAddress -InterfaceIndex 13 -IPAddress 192.168.1.2 -DefaultGateway 192.168.1.1 -PrefixLength 24 Set-DnsClientServerAddress -InterfaceIndex 13 -ServerAddresses 192.168.1.3,192.168.1.4
• Задаем имя серверу (2). Например: virt
• Cтавим обновления (5, 6);
2. Настройка подключения к виртуальной машине Hyper-V
Разрешаем удаленный доступ через RDP (7) * и WinRM (4) * при помощи sconfig:
* Данный пункт меню всего лишь позволяет включить и выключить существующее правило брандмауэра WinRM (Windows Remote Management HTTP-In) для всех сетевых профилей. По умолчанию на всех Windows Server данное правило активно. Для проверки можно выполнить следующую команду:
WinRM enumerate winrm/config/listener
Если получим следующий вывод команды:
Listener Address = * Transport = HTTP Port = 5985 Hostname Enabled = true URLPrefix = wsman CertificateThumbprint ListeningOn = 127.0.0.1, 192.168.0.42
то все нормально, служба работает и готова принимать подключения на 5985 порту.
Теперь необходимо включить и настроить сам WinRM:
winrm quickconfig
или в powershell:
Enable-PSRemoting –Force
Что бы управлять сервером вне домена через WinRM необходимо задействовать механизм аутентификации CredSPP:
winrm set winrm/config/service/auth @{CredSSP="true"}
или в powershell:
Enable-WSManCredSSP -Role server
На управляющем компьютере администратора, сопоставим имя сервера и его IP-адрес добавлением записи в host. При помощи Powershell это можно сделать так:
Add-Content -Path "C:\Windows\System32\drivers\etc\hosts" -Value "192.168.0.42 virt"
Проверим что мы добавили, запись должна начинаться с новой строки:
Get-Content -Path 'C:\Windows\System32\drivers\etc\hosts'
Поскольку мы настраиваем подключение к серверу в рабочей группе через NTLM (В домене используется Kerberos), то необходимо добавить наш сервер в TrustedHosts на компьютере администратора. Можно прописать его IP-адрес, FQDN или указать любой компьютер используя символ *.
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "virt" -Force
Просмотреть список TrustedHosts можно при помощи команды:
Get-Item WSMan:\localhost\Client\TrustedHosts
Что бы очистить список TrustedHosts вводим:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "" -Force
Теперь включим CredSPP на клиенте с указанием сервера которому мы доверим свои учетные данные:
Enable-WSManCredSSP -Role client -DelegateComputer "virt"
Так же необходимо включить NTLM-аутентификацию задействовав политику: Allow delegating fresh credentials with NTLM-only server authentication которая находится по адресу: Computer Configuration\Administrative Templates\System\Credentials Delegation или в русском варианте:
Конфигурация компьютера\Административные шаблоны\Система\Передача учетных данных\Разрешить предачу новых учетных данных с проверкой подлинности сервера «только NTLM».
Включаем политику, затем жмем на кнопку Показать, и добавляем серверы, к которым собираемся подключаться. В нашем примере это wsman/virt и vsman/virt.local
Теперь, можем спокойно подключаться к нашему Hyper-V-серверу через PowerShell remoting используя команду:
Enter-PSSession -ComputerName virt -Credential virt\Administrator
Что бы каждый раз не указывать логин и не вводить пароль, пропишем учетные данные сервера Hyper-V в диспетчере учетных данных управляющего компьютера:
cmdkey /add:virt /user:Administrator /pass:MyPa$$word
После чего пробуем снова подключиться к серверу:
Enter-PSSession virt
В случае успеха увидим командную строку удаленной машины:
[virt]: PS C:\Users\Administrator\Documents>
На управляющем ПК администратора проверяем подключение к гипервизеру Hyper-V через оснастку Hyper-V Management Tools (virtmgmt.msc)
Добавить оснастку можно через стандартный мастер добавления компонентов Windows или через Powershell:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Management-Clients
Просмотреть все доступные опции можно при помощи следующей команды:
Get-WindowsOptionalFeature -Online | ? featurename -match 'Microsoft-Hyper-V*'
Через DISM:
DISM /Online /Enable-Feature /All /FeatureName:Microsoft-Hyper-V-Management-Clients
3. Настройка брандмауэра Hyper-V
Правильно настроим файрвол Windows - Уберем все лишнее, оставим только необходимое для работы. Переведем основной интерфейс и правила в частный (Private) профиль.
Управлять брандмауэром можно при помощи контекста netsh advfirewall, командлетов Powershell или графического интерфейса (в core версии windows понадобится установить дополнение Server Core App Compatibility Feature on Demand FoD добавляющее множество графических утилит и mmc оснасток присущих версии Windows c графическим интерфейсом. Но об этом ниже.)
# Отобразить список всех правил брандмауэра в формате полного (DisplayName) и сокращенного имени (Name) для входящего и исходящего трафика:
Get-NetFirewallRule | where { $_.Direction -eq "Inbound" } | Select-Object DisplayName, Name Get-NetFirewallRule | where { $_.Direction -eq "Outbound" } | Select-Object DisplayName, Name
# Отобразить список включенных правил брандмауэра для входящего и исходящего трафика:
Get-NetFirewallRule | where {($_.enabled -eq $True) -and ($_.Direction -eq "Inbound")} | ft Get-NetFirewallRule | where {($_.enabled -eq $True) -and ($_.Direction -eq "Outbound")} | ft
# Отобразить список включенных правил более подробно с указанием протокола, локальных и удаленных портов, IP-адресов:
Get-NetFirewallRule -Action Allow -Enabled True -Direction Inbound | Format-Table -Property Name, @{Name='Protocol';Expression={($PSItem | Get-NetFirewallPortFilter).Protocol}}, @{Name='LocalPort';Expression={($PSItem | Get-NetFirewallPortFilter).LocalPort}}, @{Name='RemotePort';Expression={($PSItem | Get-NetFirewallPortFilter).RemotePort}}, @{Name='RemoteAddress';Expression={($PSItem | Get-NetFirewallAddressFilter).RemoteAddress}}, Enabled,Profile,Direction,Action
Замените Inbound на Outbound что бы получить вывод по исходящим правилам:
# Что бы изменить профиль всех входящих и разрешенных правил на Domain и Private используем команду:
Set-NetFirewallRule -DisplayName '*'-Action Allow -Enabled True -Direction Inbound -Profile @('Domain', 'Private')
# Удалить правило HTTP-Inbound:
Remove-NetFirewallRule -DisplayName 'HTTP-Inbound'
# Удалить все правила начинающиеся на CoreNet-ICMP6:
Get-NetFirewallRule | Where-Object { $_.Name -like "CoreNet-ICMP6*" } | Remove-NetFirewallRule
# Удалить все правила где в имени есть V6:
Get-NetFirewallRule | Where-Object { $_.Name -like "*v6*" } | Remove-NetFirewallRule
# Удалить все правила для входящего и исходящего трафика:
Get-NetFirewallRule | Where { $_.Direction -eq "Inbound" } | Remove-NetFirewallRule Get-NetFirewallRule | Where { $_.Direction -eq "Outbound" } | Remove-NetFirewallRule
Итак, настраиваем Windows Firewall по классической схеме: Все что не разрешено - запрещено!
# Переведем текущий сетевой адаптер в частный профиль:
Set-NetConnectionProfile -InterfaceIndex 6 -NetworkCategory Private
# Выключим публичный и доменный профили. Временно разрешим входящие соединения для частного профиля. Исходящие по умолчанию разрешены.
Set-NetFirewallProfile -Profile Domain,Public -Enabled False
Set-NetFirewallProfile -Name Private -DefaultInboundAction Allow
Удалим все правила для входящего и исходящего трафика:
Remove-NetFirewallRule
# Разрешить icmp ping:
New-NetFireWallRule -DisplayName 'Allow ICMPv4 Ping' -Name 'ICMP-v4-Ping' -Protocol ICMPv4 -IcmpType 8 -Action Allow
# Для удаленного управления сервером и подключения через оснастку Hyper-V Management создадим правило WinRM:
New-NetFireWallRule -DisplayName 'Windows Remote Management (HTTP-In)' -Name 'WINRM-HTTP-In-TCP' -Direction Inbound -Protocol tcp -Program "System" -LocalPort 5985 -Profile Private
# Изменить правило, например добавить удаленный IP-адрес с которого можно подключаться к серверу WinRM:
Set-NetFirewallRule -DisplayName 'Windows Remote Management (HTTP-In)' -RemoteAddress 192.168.1.10
или
Set-NetFirewallRule -Name 'WINRM-HTTP-In-TCP' -RemoteAddress 192.168.1.10
# Для удаленного управления сервером по RDP добавим:
New-NetFireWallRule -DisplayName 'Remote Desktop (TCP-In)' -Name 'RDP-In-TCP' -Direction Inbound -Protocol tcp -LocalPort 3389 -Program "%SystemRoot%\system32\svchost.exe" -Profile Private
# Для удаленного управления через Server Manager и Computer Management добавим следующие правила:
New-NetFirewallRule -DisplayName "Windows Remote Management (RPC-EPMAP)" -Name 'WINRM-RPC-EPMAP' -Direction Inbound -Protocol TCP -LocalPort 135 -Program "%SystemRoot%\system32\svchost.exe" -Profile Private New-NetFirewallRule -DisplayName "Windows Remote Management (NP-In)" -Name 'WINRM-NP-In-TCP' -Direction Inbound -Protocol TCP -LocalPort 445 -Program "System" -Profile Private New-NetFirewallRule -DisplayName "Windows Remote Management (RPC)" -Name 'WINRM-RPC-In-TCP' -Direction Inbound -Protocol TCP -LocalPort RPC -Program "%SystemRoot%\system32\svchost.exe" -Profile Private
# Что бы подключаться к серверу через SMB/CIFS (File and Printer Sharing):
New-NetFirewallRule -DisplayName 'File and Printer Sharing (NB-Datagram-In)' -Name 'FPS-NB_Datagram-In-UDP' -Direction Inbound -Protocol UDP -LocalPort 138 -Program "System" -Profile Private New-NetFirewallRule -DisplayName 'File and Printer Sharing (NB-Name-In)' -Name 'FPS-NB_Name-In-UDP' -Direction Inbound -Protocol UDP -LocalPort 139 -Program "System" -Profile Private New-NetFirewallRule -DisplayName 'File and Printer Sharing (NB-Session-In)' -Name 'FPS-NB_Session-In-TCP' -Direction Inbound -Protocol TCP -LocalPort 139 -Program "System" -Profile Private
Получим следующую иллюстрацию:
После настройки запретим входящие соединения для частного профиля командой:
Set-NetFirewallProfile -Name Private -DefaultInboundAction False
Либо можно создать всего одно правило, разрешающее любой входящий траффик, но только с компьютеров которым вы доверяете:
New-NetFirewallRule -DisplayName 'Main Inbound Rule (All)' -Name Main-In-All -Direction Inbound -RemoteAddress 192.168.2.5 -Profile Private
Так же можно настроить на системе с графическим интерефейсом набор правил по своему усмотрению, затем выполнить экспорт из рестра:
reg export "HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules" D:\Temp\MyFirewallRules.reg
На целевой core-системе выполнить импорт:
reg import D:\Temp\MyFirewallRules.reg
4) Настройка хранилища виртуальных машин:
# Создадим новый раздел на диске, где у нас будут хранится файлы виртуальных машин. Для этого сначала высвободим место на существующем разделе. Под систему нам вполне хватит 20Gb:
Resize-Partition -DiskNumber 0 -PartitionNumber 2 -Size 20Gb
Затем создадим новый раздел на диске максимально возможного размера и назначим ему букву D:
New-Partition -DiskNumber 0 -DriveLetter D –UseMaximumSize
# Отформатируем новый раздел в NTFS и зададим ему метку Data:
Format-Volume -DriveLetter D -FileSystem NTFS -NewFileSystemLabel "Data"
# Создадим каталог, где будут хранится файлы виртуальных машин:
New-Item -Path "D:\Hyper-V\Virtual Hard Disks" -Type Directory
# Посмотрим параметры хоста Hyper-V при помощи команды:
Get-VMHost | Format-List
Как видим директории виртуальных машин VirtualMachinePath и виртуальных дисков VirtualHardDiskPath находятся на одном разделе с операционной системой, что неправильно. Поэтому, пропишем путь к созданным ранее директориям с помощью команды:
Set-VMHost -VirtualMachinePath D:\Hyper-V -VirtualHardDiskPath 'D:\Hyper-V\Virtual Hard Disks'
# Добавим директорию Hyper-V в список исключений Windows Defender:
Add-MpPreference -ExclusionPath D:\Hyper-V
# Если нужно удалить, то:
Remove-MpPreference -ExclusionPath D:\Hyper-V
# Отключить защиту Windows Defender в реальном времени:
Set-MpPreference -DisableRealtimeMonitoring $true
5) Установка дополнения Server Core App Compatibility Feature on Demand (FOD):
Если на сервере запущенна служба обновлений, то устаноить FOD можно при помощи команды:
Add-WindowsCapability -Online -Name ServerCore.AppCompatibility~~~~0.0.1.0
Если по каким то причинам это не доступно, то скачать можно через веб-узел Volume Licensing Service Center или по следующей ссылке.
Затем примонтировать образ в систему:
$fodIso = Mount-DiskImage -ImagePath "d:\Downloads\17763.1.180914-1434.rs5_release_amd64fre_SERVER-FOD-PACKAGES_OEM_amd64fre_MULTI.iso"
и установить при помощи команды:
Add-WindowsCapability -Online -Name ServerCore.AppCompatibility~~~~0.0.1.0 -Source E:\ -LimitAccess
где E:\ - диск куда примотрировался ISO образ. Просмотреть какие диски доступны в системе можно при помощи: Get-Volume.
Затем перезапускаем сервер:
Restart-Computer -Force
После установки дополнения будут доступны следующие компоненты системы как:
• Консоль управления (MMC) (mmc.exe).
• Средство "Просмотр событий" (Eventvwr.msc).
• Системный монитор (PerfMon.exe).
• Монитор ресурсов (Resmon.exe).
• Диспетчер устройств (Devmgmt.msc).
• Проводник (Explorer.exe).
• Windows PowerShell (Powershell_ISE.exe).
• Средство управления дисками (Diskmgmt.msc).
• Диспетчер отказоустойчивости кластеров (CluAdmin.msc).
• Брэндмауэр Windows в режиме повышенной безопастности (wf.msc)
и многие др. :)
6) FAQ по Windows Server Hyper-V
— У меня есть виртуальные машины на VirtualBox и я хочу перенести их на сервер с Hyper-V, что мне нужно сделать?
— Вам нужно сконвертировать жесткие диски *vdi в формат *.vhd. Затем, если ваша система была создана с использованием MBR, то в Hyper-V вы можете создать новую машину «Поколения 1» с похожими характеристиками как у машины c VirtualBox и подцепить туда полученный после конвертации *.vhd. Команда выглядит так:
cd C:\Program Files\Oracle\VirtualBox VBoxManage clonehd source.vdi target.vhd --format vhd
Если ваша система была создана с использованием GPT, то рекомендуется создавать виртуальную машину «Поколения 2». Для этого вам необходимо сконвертировать ранее полученный vhd-диск в vhdx. Это можно сделать средствами самого Hyper-V Manager в настройках диска:
Или при помощи команды powershell:
Convert-VHD -Path ″D:\Hyper-V\Win10.vhd″ -VHDType Fixed -DestinationPath ″D:\Hyper-V\Win10.vhdx″