В предыдущих версиях Hyper-V (начиная с Windows 7/Windows Server 2008R2) для проброса дискретной видеокарты с хоста в виртуальную машину можно было использовать технологию RemoteFX vGPU . Однако, начиная с Windows 10 1809 и Windows Server 2019, Майкрософт отключило поддержку RemoteFX. Вместо нее предлагается использовать новую технологию Discrete Device Assignment (DDA) .
DDA позволяет пробросить PCI/PCIe устройства (включая GPU, NVMe) с хоста в виртуальную машину Hyper-V.
Основные требования к инфраструктуре для использования DDA в Hyper-V:
- Доступно только для виртуальных машин Hyper-V второго поколения (Gen 2);
- На ВМ должно быть отключены динамическая память и чекпоинты;
- Физическая карта должна поддерживать технологию GPU Partitioning;
- Если на хосте развернута среда WSL (Windows Subsystem for Linux), то при пробросе видеокарты с помощью GPU-P, в ВМ может появляться ошибка видеокарты с кодом 43;
- Хотя SR-IOV (Single Root Input/Output Virtualization) не заявлена в требованиях DDA, без ее поддержки проброс GPU в ВМ работает не корректно.
Discrete Device Assignment доступна только в Windows Server с ролью Hyper-V. В десктопных версиях Windows 10/11 для предоставления общего доступа к видеокарте в виртуальных машинах можно использовать GPU Partitioning. В этой статье мы покажем, как пробросить видеокарту в виртуальную машину на Hyper-V.
Проброс видеокарты в виртуальную машину на Windows Server с Hyper-V
Discrete Device Assignment (DDA) позволяет пробросить PCIe устройства в виртуальную машину во всех версиях Windows Server, начиная с 2016.
Перед пробросом GPU в ВМ, нужно изменить ее конфигурацию.
Отключить автоматическое создание снапшотов (описано в статье об управлении запуском и порядке загрузки ВМ на Hyper-V ):
Set-VM -Name VMName -AutomaticStopAction TurnOff
Настроить кэш и лимиты памяти для 32-разрядного пространства MMIO:
Set-VM -Name VMName -GuestControlledCacheTypes $True -LowMemoryMappedIoSpace 3Gb -HighMemoryMappedIoSpace 33280Mb
Затем нужно получить физический путь к PCIe устройству видеокарты на хосте Hyper-V. Для этого нужно открыть свойства GPU в диспетчере устройств, перейти на вкладку Details и выбрать свойство Location paths . Скопируйте значение, которое начинается с PCIROOT .
Либо вы можете получить это значение с помощью PowerShell:
Get-PnpDevice | Where-Object {$_.Present -eq $true} | Where-Object {$_.Class -eq "Display"}|select Name,InstanceId
Отключить эту видеокарту на сервере Hyper-V в диспетчере устройств или с помощью PowerShell:
Dismount-VmHostAssignableDevice -LocationPath "PCIROOT(0)#PCI(0300)#PCI(0000)" –force
Теперь нужно пробросить GPU адаптер в виртуальную машину:
Add-VMAssignableDevice -VMName VMName -LocationPath "PCIROOT(0)#PCI(0300)#PCI(0000)"
Затем включите ВМ и проверьте, что ваша видеокарта появилась в диспетчере устройств в разделе Display Adapters вместе с устройством Microsoft Hyper-V Video.
Чтобы отключить GPU от ВМ и подключить его к хосту:
Remove-VMAssignableDevice -VMName VMName -LocationPath $locationPath
Mount-VMHostAssignableDevice -LocationPath $locationPath
Использование GPU в виртуальных машинах Hyper-V на Windows 10/11
GPU Partitioning (GPU-P) доступно в виртуальных машинах Hyper-V на Windows 10/11, начиная с билда 1903. Проверьте, что ваша видеокарта поддерживает режим GPU Partitioning с помощью команды Get-VMPartitionableGpu (Windows 10) или Get-VMHostPartitionableGpu (для Windows 11).
Для проброса видеокарты в ВМ используется командлет Add-VMGpuPartitionAdapter. Чтобы скопировать драйвера видеокарты с хоста Hyper-V в виртуальную машину нужно использовать скрипт Easy-GPU-PV ( https://github.com/jamesstringerparsec/Easy-GPU-PV ).
Скачайте ZIP архив с скриптом и распакуйте его в папку на хосте Hyper-V.
Откройте консоль PowerShell с правами администратора и разрешите запуск PowerShell скриптов в текущей сессии (подробнее о PowerShell Execution Policy):
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass –Force
Выполняйте скрипт:
.Update-VMGpuPartitionDriver.ps1 -VMName VMName -GPUName "AUTO"
Скрипт скопирует драйвера видеокарты с хоста в ВМ.
Теперь осталось настроить ВМ и пробросить в нее GPU:
Set-VM -VMName VMName -GuestControlledCacheTypes $true -LowMemoryMappedIoSpace 1Gb -HighMemoryMappedIoSpace 32Gb
Add-VMGpuPartitionAdapter -VMName VMName
Если вы обновили драйвера видеокарты на хосте Hyper-V, нужно обновить их в ВМ:
.Update-VMGpuPartitionDriver.ps1 -VMName VM Name -GPUName "AUTO"