В предыдущих версиях 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"
Когда-нибудь они сделают проброс USB
Точно , проброса USB очень не хватает. Использую сторонние программы USB over IP для проброса ключей 1C но это все равно костыли.
А какое ПО вы используете(Предположу что линуксовый пакет usbip)? Как со стабильностью, месяцами работает?
fabulatech usb over network
работает под windows , месяцами работает ,но вот если был разрыв сетевой связности , например , ребут коммутатора , то автоматом на клиенте (сервер 1С) ключики могут и не подцепится корректно. Приходится рестартовать службу сервера fabulatech куда физически вставлены ключи , а потом рестарт службы на клиенте.
Я юзаю usbipd-win. — как раз на сайте есть статья:
https://winitpro.ru/index.php/2022/09/13/windows-probros-usb-ustrojstv-wsl-linux/
Сделали. На Dda спокойно поднимается usb pci-e
Альтернатива для проброса без проблем gpu и usb — Proxmox Virtual Environment https://www.proxmox.com/en/proxmox-virtual-environment/overview
И для инкрементных бэкапов ( full-бэкапы у proxmox ve — из коробки) Proxmox Backup Server — https://www.proxmox.com/en/proxmox-backup-server/overview
P.s. Proxmox, ceph, zfs, pfsense и все-все-все https://forum.netgate.com/topic/163435/proxmox-ceph-zfs-pfsense-%D0%B8-%D0%B2%D1%81%D0%B5-%D0%B2%D1%81%D0%B5-%D0%B2%D1%81%D0%B5-%D1%87%D0%B0%D1%81%D1%82%D1%8C-2/
Лучше не использовать Microsoft если нужна графика на гостевых машинах.
1. DDA — пробрасывать видеокарту только на одну машину
2. GPU партишенинг лишает виртуалку возможности сохранения виртуалки и контрольных точек. А ещё если закрыть RDP даже не отключая сеанс — вся память GPU отключится и все приложения использующих gpu будут сообщать о недоступности видеопамяти и перестанут работать с GPU при переподключении к RDP, и это потребует перезапуск приложений работающих с GPU.
У меня заработало! В том числе и игры. Наконец-то
смог разделить на “два пк» игры и работу. Не
согласен с теми — кто пишет, что:»hyper-v не для
графики». Лично у меня на VMware Workstation pro
FreeCad, Slash3D, Blender и ПО Adobe выдавали
частые сбои в виде подтормаживаний и зависаний, а про игры без directX 12
на том же VMware лучше даже не говорить. Автору за статью спасибо!
Работает! Супер! Спасибо!
Проброс видеокарты работает одновременно на нескольких ВМ или только на одной? Имею ввиду в один момент времени. То есть запускаю сразу 5 ВМ или 10 или 20, на всех одновременно видеокарта будет работать?
где бы ещё взять драйвер GTX для windows server 2019 ?..
Ставится обычный game драйвер
Для каких целей нужен GPU на виртуалке?
Классически это CAD, 3D моделирование.
сейчас хайповая тема — нейронки, AI — там тоже GPU дает кратный буст по вычислениям.
Для AI тема это расшарить GPU с другого ПК, не с виртуалки. Типа обьединить ресурсы с хостом. Не занимались таким?
Здравствуйте,
на этапе проброса карты в вм коммандой типа
Add-VMAssignableDevice -VMName VMName -LocationPath "PCIROOT(0)#PCI(0300)#PCI(0000)"
получаю ошибку The specified device was not found. хотя параметр скопирован и точно правильный
Подскажите в чем может быть причина?
Видеокарта вероятно не поддерживает GPU Partitioning. или не установлены дрова с ее поддержкой.
В статье неправильно описано получение -LocationPath. Более правильное решение я взял с официального сайта мелкомягких:
Get-PnpDevice -Class Display | ForEach-Object { Write-Output «$($_.FriendlyName) имеет идентификатор устройства $($_.DeviceId) и находится по адресу $($_ | Get-PnpDeviceProperty DEVPKEY_Device_LocationPaths | Select-Object -ExpandProperty Data | Where-Object { $_ -like «PCIROOT*» })»; }
В моем случае результат выгладит вот так:
NVIDIA Quadro M6000 имеет идентификатор устройства PCI\VEN_10DE&DEV_17F0&SUBSYS_1129103C&REV_A1\4&295088B2&0&0010 и находится по адресу PCIROOT(80)#PCI(0200)#PCI(0000)
Базовый видеоадаптер (Майкрософт) имеет идентификатор устройства PCI\VEN_102B&DEV_0533&SUBSYS_3381103C&REV_01\4&2383FE5D&0&01E2 и находится по адресу PCIROOT(0)#PCI(1C02)#PCI(0001)
Вот отсюда уже берется LocationPath