Проброс видеокарты NVIDIA GTX в виртуальную машину с Ubuntu для ESXi

Данная статья написана нашим читателем Lord_Alfred и выложена к нам чуть измененной копией с его блога.

Немного предыстории: я, Lord_Alfred, очень далек от администрирования серверов и работы с “железом”. Привык использовать готовые решения и стараюсь применять принцип: “работает — не трогай, не работает — погугли и попытайся исправить”. Но недавно я увлекся темой Deep Learning и почувствовал острую необходимость в покупке мощной видеокарты, которая смогла бы избавить мой домашний сервер с двумя Xeon X5660 от постоянной нагрузки на ЦП. В итоге у меня появилась “MSI GeForce GTX 1080 Ti GAMING X TRIO 11 GB OC Enthusiast” (к сожалению, с большим трудом и затратами из-за любителей криптовалют…). Естественно, захотелось сразу сделать всё “хорошо” и “правильно” (читай: поставить Ubuntu и не пытаться завести *nix’овые библиотеки на винде). Но в нашей жизни, к сожалению, не всё так гладко как хотелось бы: из-за того, что множество моих наработок по другим сферам уже были написаны под Windows, то никакого желания их переписывать у меня не было. Соответственно, начались поиски и думы о том, чтоб использовать какой-нибудь гипервизор, где будет возможность пробросить видеокарту в одну из ОС (ubuntu) и не потерять нажитое непосильным трудом (windows). Мой выбор пал на VMware vSphere ESXi, поэтому предупрежу сразу — опыта по его администрированию у меня нет, поэтому не принимайте близко к сердцу, если в статье я где-то ошибусь в терминологии или дам неправильное описание (надеюсь, что создатели vmind поправят совсем уж грубые ошибки).

Вся эта статья целиком и полностью описывает мой многострадальческий опыт в попытках (в итоге, к счастью, успешный) пробросить видеокарту в убунту и установить там драйверы nvidia и cuda toolkit. Я потратил несколько дней и несчетное количество переустановок ubuntu, пока набросал для себя некоторый “план” по установке с описанием и ссылками откуда была взята информация. Специально для тех, кто решит сделать тоже самое (или просто захочет поставить драйвера для gtx на убунте) — я переписал всё в читаемый вид и опубликовал эту статью, чтобы вы смогли потратить не 3 дня на это, а всего лишь несколько часов. Для удобства — ссылки на источники отмечены квадратными скобками, поэтому если у вас что-то пойдет “не так”, то вы сможете посмотреть откуда я взял ту или иную команду.

Предварительная настройка vSphere ESXi 6.5

  1. Для начала необходимо включить доступ по SSH в веб-интерфейсе ESXi: кликаем правой кнопкой мыши по пункту Host в навигаторе слева, выбираем ServicesEnable Secure Shell (SSH).
  2. Заходим под своим логином/паролем по SSH и меняем режим проброса nVidia устройств [1] с bridge на link:
    # vi /etc/vmware/passthru.map
    находим там следующее значение и меняем на link:
    # NVIDIA
    10de ffff bridge false
  3. Делаем проброс устройства в хост: заходим в веб-интерфейсе ESXi в ManageHardwarePCI Devices и выбираем видеокарту, жмём сверху «Toggle passthrough».
  4. Выполняем перезагрузку (reboot) хоста vSphere ESXi.

Установка Ubuntu Desktop 16.04 и настройка проброса видеокарты

  1. Создаем новую VM в ESXi, но не устанавливаем туда операционную систему.
  2. Заходим в расширенные настройки VM: кликаем правой кнопкой мыши, выбираем Edit settings и далее переходим в таб VM Options, а там выбираем пункт Advanced, затем нажимаем кнопку Edit Configuration и добавляем следующую настройку [1, 2]:
    firmware = efi
    Если сделать это уже на установленной системе, то велика вероятность, что в итоге она затем не загрузится. Скорее всего у меня это было связано с настройками биоса на самом сервере. Я не пытался разобраться почему всё именно так, но пришел к выводу, что лучше сделать этот пункт до установки убунты.
  3. Далее устанавливаем убунту 16.04 (во время установки я не ставил никакие проприетарные драйвера, т.е. не отмечал 2 галочки во время установки), выключаем её.
  4. Снова заходим в расширенные настройки VM и там прописываем (как это делали в шаге 2):
    pciPassthru.use64bitMMIO = TRUE
    vmci.msix = FALSE
    hypervisor.cpuid.v0 = FALSE
    Первые две настройки отвечают за то, чтоб была корректная работа с памятью и адресным пространством в PCI-устройства [2], а последний нужен для того, чтоб NVIDIA-драйвера не знали, что у нас операционка в виртуальной машине — подробнее об этом в [1].
  5. Далее запускаем нашу виртуальную машину (заметьте: проброс самого PCI-устройства в неё мы ещё не делали), подключаемся по VMware Remote Console (VMRC) и скачиваем CUDA тулкит отсюда:
    https://developer.nvidia.com/cuda-downloads
    Я советую качать инсталлер runfile:
    Operating System → Linux
    Architecture → x86_64
    Distribution → Ubuntu
    Version → 16.04
    Installer Type → runfile (local)

    Замечу, что качаем сразу toolkit и патчи (на момент написания статьи было 3 патча). Драйвера для видеокарты (не последней доступной версии) находятся в cuda toolkit. Ставить ли отдельно самую последнюю версию драйверов? Я не могу сказать, скорее всего лучше не рисковать и поставить те, которые идут вместе с тулкитом (но если вы будете ставить их раздельно, то есть пропускать установку драйверов при установке cuda toolkit, то учтите, что там будет другая опция для отмены OpenGL библиотек — об этом будет написано далее).
  6. Выходим (logout, не poweroff) из юзера, нажимаем ALT+CTRL+F1 (для VMRC из под macOS: FN+Control+Option+F1), вводим логин и пароль в консоли.
  7. Далее нам нужно заблокировать загрузку nouveau [3] (подробнее об этом и вообще о подготовке операционки в официальном Installation Guide для CUDA — [4]):
    # sudo vi /etc/modprobe.d/blacklist-nouveau.conf
    Вставляем туда:
    blacklist nouveau
    options nouveau modeset=0
  8. Устанавливаем необходимые для samples (примеров) библиотеки [5], [6]. Отдельно замечу, что устанавливаем не все из списка, а только те, на которые у меня ругался инсталлятор (лишнего нам не нужно, да и нужны они грубо говоря только для примеров — не факт, что в настоящих задачах они вам понадобятся).
    # sudo apt-get install freeglut3-dev libxmu-dev libxi-dev
  9. Далее нужно установить модули ядра (?) и его исходный код версии 4.4, т.к. только эта версия поддерживается на данный момент в CUDA Toolkit (подробнее об этом: [7], [8], [9]).
    # sudo apt-get install linux-image-extra-virtual
    # sudo apt-get install linux-headers-generic
  10. Причем текущие модули ядра (?) нужно будет удалить [11], так как даже если указывать путь к исходному коду ядра для версии 4.4 через параметр «—kernel-source-path», то всё равно при установке nVidia драйверов видеокарты будет вылетать ошибка. На момент написания статьи последней версией ядра было 4.13 (узнать текущую версию можно через команду uname -r).
    # sudo apt-get purge linux-image-4.13*
    # sudo apt-get purge linux-headers-4.13*
  11. Далее нужно обновить образ initramfs, чтобы при загрузке Ubuntu использовалось ядро версии 4.4:
    # sudo update-initramfs -u
  12. Следующим шагом нужно выключить ОС командой:
    # sudo poweroff
  13. Заходим в настройки VM в веб-интерфейсе vSphere ESXi 6.5 и добавляем туда видеокарту: Add other devicePCI device. Отдельно замечу, что я добавлял только саму видеокарту, а звуковой контроллер (HDMI Audio Controller) — не добавлял.
  14. После добавления видеокарты при попытке сохранить настройки ESXi будет ругаться на резервацию памяти (подробнее — [12]), поэтому необходимо будет открыть выше настройки оперативной памяти (Memory) и поставить галочку напротив: ReservationReserve all guest memory (All locked).

Установка CUDA Toolkit 9.1 (вместе с драйвером nVidia) на Ubuntu 16.04

Конечно, частично этот раздел должен включать в себя и некоторые действия из предыдущего, но для упрощения и уменьшения количества шагов — все написано так, как написано 🙂

  1. Включаем виртуальную машину, подключаемся по VMRC, не входим в пользователя и нажимаем ALT+CTRL+F1. Вводим логин/пароль в консоли.
  2. Ставим все обновления:
    # sudo apt-get update
    # sudo apt-get upgrade
  3. Выключаем дисплейный менеджер Иксов:
    # sudo service lightdm stop
  4. Проверяем текущую версию ядра (должно быть 4.4.0-X-generic, подробнее снова в [4]):
    # uname -r
  5. Переходим в директорию, куда мы ранее скачали CUDA Toolkit вместе с патчами (или директорию, где у нас находится драйвер для видеокарты, но повторю что он идет вместе с тулкитом, и если вы не хотите ставить его отдельно, то нет необходимости его качать).
    # cd Загрузки
  6. Запускаем установку тулкита (обратите особое внимание на передаваемый параметр для отключения OpenGL — [13]):
    # sudo sh cuda_9.1.85_387.26_linux.run —no-opengl-libs
    Как и обещал выше — сразу же здесь предупрежу, что опция для отключения OpenGL библиотек при установке отдельно драйвера для видеокарты — отличается. Для установки драйвера видеокарты команда для установки будет следующей:
    # sudo sh NVIDIA-Linux-x86_64-390.48.run —no-opengl-files
  7. Перед установкой тулкита нам зададут несколько вопросов, на которые я отвечал следующим образом (тут вопросы в сокращенном виде!):
    EULA: accept
    install driver: y
    run nvidia-xconfig: n (важно! если поставите y, то скорее всего не сможете зайти в пользователя — [13], [14])
    install toolkit: y
    toolkit location: (ничего не менял, оставил по дефолту — просто Enter)
    symbolic link: y
    install samples: y
    samples location: (ничего не менял, оставил по дефолту — просто Enter)
  8. В итоге у нас должны установиться: nvidia driver, cuda toolkit и cuda samples и не должно вывалиться никаких ошибок (если вывалились — гуглите… я пока тестировал это всё и писал для себя короткие заметки с командами — переустанавливал убунту раз 5, чтобы попробовать заново).
  9. Далее нужно прописать пути к CUDA и библиотекам в переменных окружения, я сделал это следующим образом (пути отобразились в сообщении об успешной установке выше — именно оттуда я их и взял):
    # echo «export PATH=/usr/local/cuda-9.1/bin:$PATH» >> ~/.bashrc
    # echo «export LD_LIBRARY_PATH=/usr/local/cuda-9.1/lib64:$LD_LIBRARY_PATH» >> ~/.bashrc
  10. Затем нужно установить все патчи для CUDA Toolkit:
    # sudo sh cuda_9.1.85.1_linux.run
    # sudo sh cuda_9.1.85.2_linux.run
    # sudo sh cuda_9.1.85.3_linux.run
  11. После этого не делать ребут (важно — [14]), а запустить дисплейный менеджер Иксов:
    # sudo service lightdm restart
  12. Появится экран входа в пользователя — ввести логин/пароль и уже из убунты выполнить перезагрузку (reboot).

Проверка корректности установки драйвера и CUDA Toolkit

После перезагрузки и входа в пользователя необходимо проверить корректность установки драйверов и тулкита, т.к. если где-то что-то пошло не так и вы этого не заметили (или это каким-либо образом не отобразилось) — всё насмарку.

Открываем терминал и выполняем следующие шаги [15]:

  1. Проверяем видно ли видеокарту и её параметры (GPU FAN, GPU Temp, RAM и тд):
    # nvidia-smi
  2. Проверяем версию CUDA компилятора:
    # nvcc -V
  3. Проверяем видит ли CUDA Toolkit видеокарту и отображает ли он её параметры через запуск одного из примеров (samples), а также в конце вывода последней команды должно быть Result = PASS:
    # cd ~/NVIDIA_CUDA-9.1_Samples/1_Utilities/deviceQuery
    # sudo make
    # ./deviceQuery

Если в результате всё прошло без ошибок — можно считать, что всё успешно установлено и вам далее можно пользоваться этой виртуальной машиной с видеокартой как душе угодно 🙂 Но есть пару тонких моментов, которые я решил выделить в несколько отдельных разделов.

Изменение разрешения экрана в Ubuntu для ESXi 6.5

Естественно, работать через VMRC с разрешением (screen resolution) 800х600 крайне некомфортно, а в настройке экранов в убунту (Параметры системыНастройка экрановРазрешение) максимальное возможное значение всего 1360×768, что тоже по нынешним меркам очень мало.

Для того, чтобы поставить другое разрешение в гостевой ОС Ubuntu для хоста VMware vSphere ESXi 6.5 нужно проделать следующие действия:

  1. Зайти в убунту, открыть терминал и установить Open VMWare Tools [16]:
    # sudo apt-get install open-vm-tools open-vm-tools-desktop
  2. Выключить виртуальную машину, зайти в её настройки и для Video Card (не GPU, которое мы пробрасывали!) поставить Total video memory, например, 16 MB (можно и больше, я ставил 32 MB) — [17].

После включения виртуальной машины в настройках экрана можно будет выбрать разрешение больше, чем до этого было возможно. Данный способ подойдет и просто для OS Ubuntu, которая установлена виртуальной машиной в ESXi — не обязательно пробрасывать видеокарту (хотя вся инструкция же об этом).

Для моего iMac 27 дюймов с разрешением в macOS в 4K — комфортнее всего ставить в убунту разрешение экрана равное 1600х1200 (4:3) для сеанса работы через VMRC.

PS: если использовать подключение через VNC — это тоже важно, там тоже будет то разрешение, которое установлено в ОС (а не автоматическое изменение в момент входа как это работает в RDP в Windows — и это очень грустно, что нет аналогичной функции или я просто о ней не знаю).

Вывод изображения с GPU на монитор из Ubuntu для хоста ESXi 6.5

Рядом с моим сервером стоит старенький монитор с VGA каналом, но ради интереса мне захотелось проверить как GTX будет работать непосредственно при выводе изображения на монитор. В видеокарте GTX 1080Ti нет VGA-разъема, поэтому пришлось покупать ЦАП HDMI→VGA (я тестировал на этом: https://www.citilink.ru/catalog/computers_and_notebooks/cables/907388/ ).

К слову, я не уверен, но скорее всего для запуска бенчмарков для проверки FPS и просто замера мощности карты — скорее всего нужно тоже делать хак, описанный в этом разделе, т.к., например, ранее в Windows Server 2012R2 (когда она стояла просто на сервере, без ESXi) после подключения видеокарты и установки на неё драйверов — FurMark и ещё какой-то бенчмарк отказались работать, сказав, что «не могут найти устройство» (подключение к винде было через RDP). Не знаю что они имели ввиду: видеокарту или монитор — скорее всего второе, т.к. другой софт вроде GPU-Z отлично видел видеокарту и показывал по ней все параметры.

Возвращаясь опять к вопросу вывода экрана с GPU на монитор в убунте [18] — нужно произвести некоторые шаги:

  1. Подключить HDMI разъем монитора к GPU (без разницы через переходник или нет).
  2. Посмотреть следующие параметры видеокарты (GPU #0) и монитора (Display Device 0): PCI BusID, EDID Name, Minimum HorizSync, Maximum HorizSync, Minimum VertRefresh, Maximum VertRefresh с помощью команды:
    # sudo nvidia-xconfig —query-gpu-info
  3. Запустить создание/изменение конфигурации графической оболочки для Иксов через nvidia:
    # sudo nvidia-xconfig
    Тут важно отметить, что если у вас до этого был файл /etc/X11/xorg.conf , то лучше его забекапить ))
  4. Поменять настройки GPU в конфигурации графической оболочки:
    # vi /etc/X11/xorg.conf
  5. Находим:
    Section «Device»
    и прописываем там найденный в шаге №2 BusID (пример оформления в [18]).
  6. Находим:
    Section «Monitor»
    и меняем там следующие параметры (полученные в шаге №2):
    ModelName = EDID Name
    HorizSync = Minimum HorizSync — Maximum HorizSync
    VertRefresh = Minimum VertRefresh — Maximum VertRefresh
    Но будьте аккуратны и посмотрите пример оформления в [18], чтобы потом всё запустилось (в последних двух примерах нужно писать только цифры).
  7. После этого перезагружаем Ubuntu и любуемся на изображении в мониторе.

Но! Здесь, в конце, следует предостеречь вас от одной досадной оплошности. При использовании вывода изображения через видео-карту на монитор — VMRC и простая консоль в ESXi не будут работать — то есть теперь там не будет изображения с гостевой ОС (будет просто черный экран).

К тому же, взаимодействие с ОС будет происходить через мышь и клавиатуру, через которые вы работаете в VMRC, поэтому скорее всего предварительно — нужно позаботиться о том, чтоб прокинуть во внутрь Ubuntu клавиатуру и мышь, которые подключены непосредственно к серверу с ESXi.

Выводы

Установить драйвера nvidia для видеокарты под Ubuntu, да и ещё если она является виртуалкой — не тривиальная задача. К счастью, большинство вопросов уже были на стековерфлоу и форуме разработчиков nvidia, поэтому гугл спас всю затею. Конечно, если бы я в итоге отказался от использования гипервизора (и просто поставил бы хостом Ubuntu, а из неё бы гостем грузил Windows), то попал бы в такую же западню, но чуть проще. Не знаю почему большинство моментов не учтено в самом инсталляторе, т.к. даже если просто ставить драйвера прямиком из GUI убунты, то можно словить “login loop” (когда падают Иксы и не дают залогиниться в систему — у меня было такое в одну из первых попыток).

Большинство вещей описано в “nVidia CUDA Installation Guide for Linux” [4], но кто в наше время читает 50 страничные мануалы перед установкой? 🙂 Но даже если его прочитать “от корки до корки”, то некоторые моменты вызовут сомнения и захочется попробовать установить тулкит без удаления свежего ядра и установки старого.

P.S.

Большое спасибо читателям за внимание, а авторам vmind — за предоставленную возможность опубликовать это здесь! Я оставлю ссылку на мою первоначальную статью ( https://vk.com/@lord.alfred-nvidia-passthrough-to-ubuntu-in-vmware-esxi ) , которую я адаптировал для этого блога, т.к. если вдруг со временем что-то изменится (например, скоро появится Ubuntu 18.04 LTS) — то я смогу исправить это только у себя в блоге.

Источники

  1. http://vmind.ru/2016/08/08/probros-videokarty-nvidia-v-vmware-esxi-6-0/
  2. https://kb.vmware.com/s/article/2142307
  3. https://askubuntu.com/a/951892
  4. https://developer.download.nvidia.com/compute/cuda/9.1/Prod/docs/sidebar/CUDA_Installation_Guide_Linux.pdf
  5. http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#install-libraries
  6. https://devtalk.nvidia.com/default/topic/993862/cuda-8-0-missing-required-libraries-on-ubuntu-16-04/
  7. https://www.linkedin.com/pulse/installing-nvidia-cuda-80-ubuntu-1604-linux-gpu-new-victor
  8. https://askubuntu.com/a/537608
  9. https://github.com/BVLC/caffe/wiki/Caffe-on-EC2-Ubuntu-14.04-Cuda-7
  10. https://devtalk.nvidia.com/default/topic/1028566/cuda-setup-and-installation/cuda-9-1-install-fail-with-ubuntu-16-04-kernel-version-4-13-0-26/post/5232909/#5232909
  11. https://devtalk.nvidia.com/default/topic/1028566/cuda-setup-and-installation/cuda-9-1-install-fail-with-ubuntu-16-04-kernel-version-4-13-0-26/post/5232909/#5232909
  12. https://serverfault.com/questions/837369/esxi-6-5-server-no-vsphere-sched-mem-min-error-related-to-pci-passthrough
  13. https://devtalk.nvidia.com/default/topic/878117/cuda-setup-and-installation/-solved-titan-x-for-cuda-7-5-login-loop-error-ubuntu-14-04-/
  14. https://askubuntu.com/a/884574
  15. https://kislayabhi.github.io/Installing_CUDA_with_Ubuntu/
  16. https://kb.vmware.com/s/article/2073803
  17. https://askubuntu.com/questions/803648/16-04-on-esxi-6-screen-resolution
  18. https://devtalk.nvidia.com/default/topic/769851/multi-nvidia-gpus-and-xorg-conf-how-to-account-for-pci-bus-busid-change-/
Запись опубликована в рубрике 6.5, VMware, vSphere, Статьи. Добавьте в закладки постоянную ссылку.

Один комментарий на «Проброс видеокарты NVIDIA GTX в виртуальную машину с Ubuntu для ESXi»

  1. ilyasan говорит:

    Третью неделю бьюсь с этим мануалом ( все версии софта соответствуют инструкции. Карта Gt1030, ESXI 6.5, Ubuntu 16.4 )
    Всегда одно и то же — в логе инстала nvidia лезет такая гадость
    ( хотя CUDA при инстале ошибок не выкидывает — все ОК )

    340.252028] nvidia: loading out-of-tree module taints kernel.
    [ 340.252037] nvidia: module license ‘NVIDIA’ taints kernel.
    [ 340.252038] Disabling lock debugging due to kernel taint
    [ 340.263258] nvidia: module verification failed: signature and/or required key missing — tainting kernel
    ……
    [ 340.283001] [drm] [nvidia-drm] [GPU ID 0x00000b00] Loading driver
    [ 340.284999] [drm] [nvidia-drm] [GPU ID 0x00000b00] Unloading driver
    [ 340.305204] nvidia-modeset: Unloading
    [ 340.316871] nvidia-uvm: Unloaded the UVM driver in 8 mode
    [ 340.328584] nvidia-nvlink: Unregistered the Nvlink Core, major device number 247
    -> Installing both new and classic TLS OpenGL libraries.
    …..
    и естественно nvidia-smi ябедничеает что дивайс не найден.

    Причем: GT 208 встала на Ubuntu 16.4 и Win7. GT1030 с пинка встала на Win 7 но упирается ставится на Ubuntu 16.4
    Ставил CUDA 9.0 9.1 и 9.2.( это от безисходности)
    Ставил просто дрова. Аналогично.
    Понижал и повышал ядро, поставил и снес штук 50 виртуалок, порвал два дедовских бубна и мозги на немецкий крест.
    В сети по ошибке «nvidia-smi No devices were found» добрался до края гугла ( там за краем только реклама казино под ссылками бурлит и пахнет )
    Хельп !

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *