Играем на NVIDIA P106-100 в Linux на виртуалке

В этой небольшой заметке описан очередной, в меру извращенный способ играть и запускать графические приложения на NVIDIA P106-100 (Это майнинг-версия NVIDIA GTX1060, которую можно добыть у китайцев меньше чем за 100$). Только играть мы будем в Linux’е, который крутится в виртуальной машине в линуксе. Такая вот рекурсия. Ну не мог я остаться в стороне от той движухи, которая началась, когда кто-то догадался “поиграть” на этих видяхах.

Итак, что за хайп с этими P106-100?

TL; DR: Для тех, кому нужен быстро мануал – пропустите эту и следующую секции.

Где-то в конце 2018 поползли слухи, что китайцы запатчили драйвера nvidia, чтобы можно было играться на майнинг-картах в играх. На видеокартах “для майнинга” стоит тот же кремний, что и на игровых, да только нет видео выходов и драйверам запрещено давать пользователю возможность запускать графические приложения. Звучало очень аппетитно, так как из-за падения биткоина эти P106-100 можно было добыть за 499 юаней с таобао. Сто грамм пыли с полуподвальной китайской крипто-фермы в подарок! Сейчас цены подросли и крутятся в районе 70-100$ за карточку.

Хак был достаточно простой:

  • Втыкаем нашу P106-100 в комп с интегрированной графикой интела, причем достаточно свежей.
  • Правим руками в блокнотике .inf файлики из драйверочков, убеждая систему, что это 1060
  • Отключаем подписывание дров
  • Загружаем поправленный драйвер
  • Говорим приложениям юзать P106-100 для рендеринга тяжелых приложений, а для вывода картинки используем интегрированную графику. Как на ноутбуках с Optimus!
  • PROFIT

Это даже описал в деталях Linus, но не который Торвальдс, а который с Linus Tech Tips. У него же на форуме смелый и рукастый человек DoctorVGA пересадил микросхему GPU с P106-100 на плату от GTЧ1060. Была небольшая надежда, что прокатит тот же трюк, что и с прошлым поколением видеокарт, где дешевую geforce можно было превратить в дорогую квадру перепайкой пары резисторов. Трюк не вышел.

Потом подоспел простой хак в реестре винды который давал те же результаты, но с меньшими телодвижениями. И не надо было выключать подписывание драйверов.

И, разумеется, еще большее извращение – настоящая 1060 в связке с P106-100 хаком, который врубает SLI и дает где-то 160% fps в играх или около того. В общем, движуха пошла, да с линуксом никто не экспериментировал.

Ну а так как я люблю мощный кремний по дешманским ценам, в стороне я остаться не мог.

Попробуем это под proxmox (ошибка 43)!

Итак, мне приехала в меру пыльная P106-100 и я решил попробовать. Так как действовать по инструкции от китайцев мне особо хотелось, я рискнул сделать это сразу в виртуалке. В идеале я хотел это запихнуть в свой домашний сервер, который вообще живет без мониторов и пробрасывать в виртуальные машины по мере надобности. А NVidia, как мы знаем, в отличие от AMD этого не любит. Для тех кто не в курсе, нвидия запрещает драйверам запускаться в виртуальной машине, потому стоит это попытаться сделать, и мы получаем синие экраны и страшную ошибку 43. Разработчики qemu это знают, и в каждом новом релизе добавляют новые фичи для того, чтобы прятать от драйвера тот факт, что он работает в виртуальной машине. Разработчики из nvidia же пожимают плечами и делают противоположное, добавляя новые способы обнаружения, что драйвер запущен в виртуалке. На эту тему можно прочитать много драмы на форуме proxmox, reddit и даже в arch wiki.

Добро пожаловать в цирк, наши клоуны немного того!

Вообще, как гипервизор я использую проксмокс. Для тех, кто не в курсе, это такой дистрибутив на основе Debian, который идет с удобным веб-интерфейсом и ориентирован на управление виртуальными машинами и lxc контейнерами. Я на него перешел не так давно и активно использую дома.

Виртуализированная железка очень здорово отличается от ‘настоящей’. И в виртуалке у нас ‘интегрированной’ видеокарты в прямом смысле слова. Обычно это Spice QXL видеокарта и нужные для работы Optimus фичи она не поддерживает.

Тем не менее я попробовал, и вот что узнал в ходе экспериментов с виртуалкой на windows 10:

  • NVIDIA драйвера отлично работают с P106-100 до того самого момента, как мы применяем патчи для работы графики. В этом месте срабатывает ошибка 43 и нужны пляски с бубном. Так что для майнинга проброс PCI разрешен таки в драйверах!
  • Даже если мы наложим все необходимые патчи на qemu и таки избавимся от ошибки 43, драйвера виртуальной видеокарты не поддерживают фичи, необходимые для работы Optimus. Поиграться не выгорит.
  • Я выбрал первую попавшуюся криптовалюту, у которой был майнер “в один клик”. (Это был верткоин Vertcoin) и попробовал майнить. Получил 18.7 Mh/s после того, как карта разогрелась.

Ладно, теперь пойдем в Линукс

С виндой счастья не вышло, потому я выкинул ту виртуалку, создал новую, накатил Debian Buster и пошел искать счастья в консоли. И нашел! Нижеследующее было проверено в Debian Buster, но с мелкими дополнениями будет работать в других дистрибутивах.

Сначала я потыкал палочкой bumblebee/primus. Оно не заработало и отказалось считать qxl интегрированной видеокартой. В деталях я не стал разбираться.

План Б. Мы можем запустить X11 на P106-100? По ходу можем! Сначала не вышло, но как только указал PCI Bus ID для карты, магия заработало и все запустилось!

С этого момента моя история превращается в самый обычный туториал.

Сначала включаем contrib и non-free репозитории для debian. Правим /etc/apt/sources.list чтобы было похоже на вот это:


deb http://deb.debian.org/debian/ buster main contrib non-free
deb-src http://deb.debian.org/debian/ buster main contrib non-free

deb http://security.debian.org/debian-security buster/updates main
deb-src http://security.debian.org/debian-security buster/updates main

# buster-updates, previously known as 'volatile'
deb http://deb.debian.org/debian/ buster-updates main
deb-src http://deb.debian.org/debian/ buster-updates main

Дальше вбиваем sudo apt update и sudo apt install nvidia-driver и если интернет не быстрый, то идем перекусить. Дальше нам потребуется правильный xorg.conf.

Мой /etc/X11/xorg.conf (Создать его, если не существует!) представлен ниже:


Section "ServerLayout"
    Identifier     "Default Layout"
    Screen         "Default Screen" 0 0
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
EndSection


Section "Device"
    Identifier "XSPICE"
    Driver "qxl"
EndSection


Section "InputDevice"
    Identifier "Mouse0"
    Driver     "xspice pointer"
EndSection

Section "InputDevice"
    Identifier "Keyboard0"
    Driver     "xspice keyboard"
EndSection

Section "Device"
    Identifier     "NV0"
    Driver         "nvidia"
    BusID          "PCI:01:00:0"
EndSection


Section "Monitor"
    Identifier    "Monitor0"
EndSection

Section "Screen"
    Identifier     "Default Screen"
    Device         "NV0"
    Option         "ProbeAllGpus" "False"
    Monitor        "Monitor0"
    Option         "NoLogo" "True"
    SubSection     "Display"
        Virtual 1920 1080
        Depth 24
    EndSubSection
EndSection

Его необходимо доработать напильником, а именно использовать команду lspci и на ее основе заполнить строку BusID “PCI:01:00:0”. Это адрес видеокарты на PCI express шине в виртуальной машине. А еще обязательно должна быть строчка Virtual 1920 1080. Она нужна, чтобы было нормальное разрешение, так как “монитора нам не завезли”. В принципе, все связанное со spice и qxl можно выкинуть, это остатки моих экспериментов.

После всех правок перезапускаем менеджер дисплея (например gdm, sddm, etc). Я использую KDE, который теперь идет с sddm.

sudo systemctl restart sddm.service

Запустилось? Проверяем следующей командой:

necromant@testblade:~$ ps aux|grep X
root       679  4.5  0.5 241572 92112 tty7     Ssl+ 15:36  16:50 /usr/lib/xorg/Xorg -nolisten tcp -auth /var/run/sddm/{6682c6e4-de26-4451-8e7e-30b28df65bd7} -background none -noreset -displayfd 17 -seat seat0 vt7
necroma+  5297  0.0  0.0   6076   888 pts/3    S+   21:49   0:00 grep X

Проверяем /var/log/Xorg.0.log. grep’ом удобно сразу фильтровать по слову NVIDIA. В моем случае вылезло следующее:

[    13.823] (**) |   |-->Device "NV0"
[    13.823] (**) |   |-->GPUDevice "NV0"
[    14.790] (II) Module nvidia: vendor="NVIDIA Corporation"
[    14.806] (II) NVIDIA dlloader X Driver  418.74  Wed May  1 11:26:02 CDT 2019
[    14.806] (II) NVIDIA Unified Driver for all Supported NVIDIA GPUs
[    14.932] (==) NVIDIA(0): Depth 24, (==) framebuffer bpp 32
[    14.932] (==) NVIDIA(0): RGB weight 888
[    14.932] (==) NVIDIA(0): Default visual is TrueColor
[    14.932] (==) NVIDIA(0): Using gamma correction (1.0, 1.0, 1.0)
[    14.932] (**) NVIDIA(0): Option "ProbeAllGpus" "False"
[    14.933] (**) NVIDIA(0): Enabling 2D acceleration
[    15.303] (II) Module glxserver_nvidia: vendor="NVIDIA Corporation"
[    15.304] (II) NVIDIA GLX Module  418.74  Wed May  1 11:24:49 CDT 2019
[    15.339] (II) NVIDIA(0): NVIDIA GPU P106-100 (GP106-A) at PCI:1:0:0 (GPU-0)
[    15.339] (--) NVIDIA(0): Memory: 6291456 kBytes
[    15.339] (--) NVIDIA(0): VideoBIOS: 86.06.58.00.1c
[    15.339] (II) NVIDIA(0): Detected PCI Express Link width: 16X
[    15.339] (II) NVIDIA(0): Validated MetaModes:
[    15.339] (II) NVIDIA(0):     "NULL"
[    15.339] (**) NVIDIA(0): Virtual screen size configured to be 1920 x 1080
[    15.339] (WW) NVIDIA(0): Unable to get display device for DPI computation.
[    15.339] (==) NVIDIA(0): DPI set to (75, 75); computed from built-in default
[    15.340] (II) NVIDIA: Using 24576.00 MB of virtual memory for indirect memory
[    15.341] (II) NVIDIA:     access.
[    15.349] (II) NVIDIA(0): ACPI: failed to connect to the ACPI event daemon; the daemon
[    15.349] (II) NVIDIA(0):     may not be running or the "AcpidSocketPath" X
[    15.349] (II) NVIDIA(0):     configuration option may not be set correctly.  When the
[    15.349] (II) NVIDIA(0):     ACPI event daemon is available, the NVIDIA X driver will
[    15.349] (II) NVIDIA(0):     try to use it to receive ACPI event notifications.  For
[    15.349] (II) NVIDIA(0):     details, please see the "ConnectToAcpid" and
[    15.349] (II) NVIDIA(0):     "AcpidSocketPath" X configuration options in Appendix B: X
[    15.349] (II) NVIDIA(0):     Config Options in the README.
[    15.395] (II) NVIDIA(0): Setting mode "NULL"
[    15.424] (==) NVIDIA(0): Disabling shared memory pixmaps
[    15.424] (==) NVIDIA(0): Backing store enabled
[    15.424] (==) NVIDIA(0): Silken mouse enabled
[    15.425] (==) NVIDIA(0): DPMS enabled
[    15.435] (WW) NVIDIA(0): Option "NoLogo" is not used
[    15.436] (II) NVIDIA(0): [DRI2] Setup complete
[    15.436] (II) NVIDIA(0): [DRI2]   VDPAU driver: nvidia
[    15.438] (II) Initializing extension NV-GLX
[    15.438] (II) Initializing extension NV-CONTROL

Сервер пашет, GLX загружен и готов. Но дисплей спайса пуст. Что делать дальше?

Дальше в ход идет x11vnc. Устанавливаем пакет (sudo apt install x11vnc) и наконец-то можем подключиться к дисплею. Для этого нам надо его только еще правильно запустить. Для этого нам надо узнать путь к файлу авторизации X11. Выделен жирным.

necromant@testblade:~$ ps aux|grep Xorg
root 679 4.3 0.5 241572 92112 tty7 Ssl+ 15:36 16:51 /usr/lib/xorg/Xorg -nolisten tcp -auth /var/run/sddm/{6682c6e4-de26-4451-8e7e-30b28df65bd7} -background none -noreset -displayfd 17 -seat seat0 vt7

Копируем этот путь и указываем для x11vnc

 necromant@testblade:~$ x11vnc -ncache 10 -clip 1920x1080+0+0 -display :0 -auth /var/run/sddm/{6682c6e4-de26-4451-8e7e-30b28df65bd7} 

Это файл авторизации, он каждый раз разный и должен совпадать у Xorg и x11vnc. На этом месте можно запустить любимый vncviewer и наслаждаться удаленным десктопом с полной поддержкой OpenGL на том, что его не должно уметь в принципе (как нам сказали). Самое время установить steam и пару игр, после чего можно играться и стримить картинку на другой компьютер. VNC для этого не особенно подходит, но steam in-home streaming/remote play делает дело на ура.

Единственное, что осталось, это запуск и перезапуск x11vnc сервера автоматом. Потому я создал вот такую вот обертку и положил ее по пути /usr/local/startvnc

#!/bin/bash
auth=`ls /var/run/sddm`
x11vnc  -ncache 10 -clip 1920x1080+0+0 -display :0 -auth /var/run/sddm/$auth

И создал тупой, как пробка юнит для systemd в каталоге /etc/systemd/system/x11vnc.service

[Unit]
Description=VNC
After=sddm.service

[Service]
ExecStart=/usr/local/bin/startvnc
User=root
Group=root
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Не особенно безопасно, так как тут VNC для всех, но так как оно работает только в домашней сети – покатит. Параноикам рекомендуется курить x11vnc документацию до просветления.

Итак, что вышло?

  • CUDA/Майнинг в линуксовой виртуалке быстрее, чем в Windows. 21.9Mh/s в линуксе против 18.7Mh/s в windows. Windows версия еще, кстати, течет.
  • OpenGL/игры работают практически без бубна. Прятать виртуалку от драйвера не надо. Нужно только немного пошаманить с x11vnc чтобы установить steam.
  • NvENC/VDPAU не пашут вообще (vdpauinfo показывает ошибку GPU at BusId 0x1 doesn’t have a supported video decoder. Есть подозрение, что для того, чтобы заработало надо патчить драйвер). Так что для стриминга в стиме нужен хороший процессор.
  • SLI на двух P106-100 не заработал из коробки, что меня немного опечалило. Дальше я не пока разбирался.

Пользуясь случаем, передаю привет аборигенам с linux.org.ru, которые подсказали трюк с x11vnc

2 thoughts on “Играем на NVIDIA P106-100 в Linux на виртуалке

  1. Классная статья, интересно было, будто бы сам установил подобное! Не все понятно конечно, ибо знания по Линукс не так глубоки, но автору респект!

  2. Очень полезная информация, спасибо. Я думал ещё попробовать поделить видеокарту vgpu хаком и запустить внутри виртуалок x2go.

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.