Proxmox 7 проброс видеокарты (GPU) внутри вм
Задача
Недавно я собрал себе очередной микро сервер для дома. И у меня была свободная видеокарта от Nvidia модель Geforce GTX 1050Ti.
Нужно было сделать так, что бы её можно было полноценно использовать внутри виртуальной машины. В моем случае, для видео энкодинга.
Я остановился на виртуализации Proxmox (qemu). Т.к. она бесплатная, постоянно развивается и простая в использовании. При этом, имеет довольно внушительный функционал.
Я недолго думая, собрал железо. Скачал дистрибутив, на момент написания статьи последняя версия была 7.2 И принялся её устанавливать.
Тогда я еще не подозревал какой квест ждет меня впереди.
Установка прошла быстро и с ней вряд ли у кого-то возникнут вопросы.
Я принялся создавать вмку, сразу пробросил "PCI устройство" в виде видеокарты и установил windows 10.
GPU была обнаружена системой и я скачал, установил драйвера с оф. сайта Nvidia.
Но после установки увидел сообщение:
Естественно, я пошел "гуглить". Как правильно нужно сделать проброс видеокарты. Перепробовав много решений из статей. Но ничего не выходило.
Спустя несколько часов, я наткнулся на зарубежный сайт. Где было описано, почему такое происходит.
Дело в том, что компания производитель видеокарты (Nvidia). Таким способом борется с использованием домашней версии видеокарты в виртуализации на уровне прошивки. Что бы покупали корпоративные версии карт, такие как Quadro и Titan. И даже на некоторое время я разочаровался и думал, что уже ничего не сделаешь.
Но вдруг вспомнил, что в proxmox есть возможность указать файл с прошивкой.
Решение
Так как же можно решить эту проблему?
Для начала я решил сдампить текущую прошивку видеокарты. Для этого есть инструмент от производителя видеокарты под названием nvflash. Дистрибутив утилиты есть под разные ОС. Мне нужна была под linux. Я скачал её, зашел на хост и сделал дамп командой:
./nvflash --save название.bin
После, нам нужно внести изменения. Что бы снять ограничения с видеокарты.
Берем любой HEX-редактор и открываем этот дамп прошивки.
Далее делаем поиск по ANSI string со словом "Video":
Теперь берем все, что до символа "U" или "US" на этой же строке. Выделяем это и до самого начала файла. И просто удаляем.
И сохраняем по пути /usr/share/kvm/vbios.bin
Прошивка готова! Но прошивать видеокарту сомнительное удовольствие.
По этому, мы просто укажем файл для нашего устройства самой вм.
Нужно пройти в каталог /etc/pve/qemu-server/, там хранятся все конфигурации созданных вм.
Моя имела айди 100, по этому я открываю редактором файл 100.conf
И дописываю ,romfile=vbios.bin в строку с hostpci0.
hostpci0: 0000:01:00,pcie=1,romfile=vbios.bin,x-vga=1
Сохраняем изменения и запускаем нашу виртуальную машину.
Но не забудьте, если вы используете в качестве гостевой ОС - Windows. То консоль proxmox не сможет зацепиться к вм. Нужно использовать RDP для подключения. Т.к. видеокарта будет "занята" вм.
Результат
После запуска, если вы сделали все правильно. То увидите следующее:
Ну и конечно в диспетчере задач
Видеокарта теперь работает так, как будто она находится подключенной к вашему ПК. А не внутри виртуализации. Т.е. вм работает с ней напрямую.
Цель достигнута, хоть и было затрачено мной много времени на её решение.
Собственно по этому я и пишу эту статью. Что бы вам сэкономить время и поделиться опытом.