Заметки сисадмина
Назад

Hyper-V Server 2019: Установка, настройка и обслуживание

Опубликовано: 22.03.2024
Время на чтение: 74 мин
0
261

Hyper-V-logo2

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:

sconfig-server-core1

* Данный пункт меню всего лишь позволяет включить и выключить существующее правило брандмауэра 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)

Hyper-V_Management1

Добавить оснастку можно через стандартный мастер добавления компонентов 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

Получим следующую иллюстрацию:

Windows_Firewall_Inbound_Hyper-V

После настройки запретим входящие соединения для частного профиля командой:

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 в настройках диска:

Hyper-V-convert-diskИли при помощи команды powershell:

Convert-VHD -Path ″D:\Hyper-V\Win10.vhd″ -VHDType Fixed -DestinationPath ″D:\Hyper-V\Win10.vhdx″

 

, ,
Поделиться
Похожие записи