Данная статья написана нашим читателем 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
- Для начала необходимо включить доступ по SSH в веб-интерфейсе ESXi: кликаем правой кнопкой мыши по пункту Host в навигаторе слева, выбираем Services → Enable Secure Shell (SSH).
- Заходим под своим логином/паролем по SSH и меняем режим проброса nVidia устройств [1] с bridge на link:
# vi /etc/vmware/passthru.map
находим там следующее значение и меняем на link:
# NVIDIA
10de ffff bridge false - Делаем проброс устройства в хост: заходим в веб-интерфейсе ESXi в Manage → Hardware → PCI Devices и выбираем видеокарту, жмём сверху «Toggle passthrough».
- Выполняем перезагрузку (reboot) хоста vSphere ESXi.
Установка Ubuntu Desktop 16.04 и настройка проброса видеокарты
- Создаем новую VM в ESXi, но не устанавливаем туда операционную систему.
- Заходим в расширенные настройки VM: кликаем правой кнопкой мыши, выбираем Edit settings и далее переходим в таб VM Options, а там выбираем пункт Advanced, затем нажимаем кнопку Edit Configuration и добавляем следующую настройку [1, 2]:
firmware = efi
Если сделать это уже на установленной системе, то велика вероятность, что в итоге она затем не загрузится. Скорее всего у меня это было связано с настройками биоса на самом сервере. Я не пытался разобраться почему всё именно так, но пришел к выводу, что лучше сделать этот пункт до установки убунты. - Далее устанавливаем убунту 16.04 (во время установки я не ставил никакие проприетарные драйвера, т.е. не отмечал 2 галочки во время установки), выключаем её.
- Снова заходим в расширенные настройки VM и там прописываем (как это делали в шаге 2):
pciPassthru.use64bitMMIO = TRUE
vmci.msix = FALSE
hypervisor.cpuid.v0 = FALSE
Первые две настройки отвечают за то, чтоб была корректная работа с памятью и адресным пространством в PCI-устройства [2], а последний нужен для того, чтоб NVIDIA-драйвера не знали, что у нас операционка в виртуальной машине — подробнее об этом в [1]. - Далее запускаем нашу виртуальную машину (заметьте: проброс самого 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 библиотек — об этом будет написано далее). - Выходим (logout, не poweroff) из юзера, нажимаем ALT+CTRL+F1 (для VMRC из под macOS: FN+Control+Option+F1), вводим логин и пароль в консоли.
- Далее нам нужно заблокировать загрузку nouveau [3] (подробнее об этом и вообще о подготовке операционки в официальном Installation Guide для CUDA — [4]):
# sudo vi /etc/modprobe.d/blacklist-nouveau.conf
Вставляем туда:
blacklist nouveau
options nouveau modeset=0 - Устанавливаем необходимые для samples (примеров) библиотеки [5], [6]. Отдельно замечу, что устанавливаем не все из списка, а только те, на которые у меня ругался инсталлятор (лишнего нам не нужно, да и нужны они грубо говоря только для примеров — не факт, что в настоящих задачах они вам понадобятся).
# sudo apt-get install freeglut3-dev libxmu-dev libxi-dev - Далее нужно установить модули ядра (?) и его исходный код версии 4.4, т.к. только эта версия поддерживается на данный момент в CUDA Toolkit (подробнее об этом: [7], [8], [9]).
# sudo apt-get install linux-image-extra-virtual
# sudo apt-get install linux-headers-generic - Причем текущие модули ядра (?) нужно будет удалить [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* - Далее нужно обновить образ initramfs, чтобы при загрузке Ubuntu использовалось ядро версии 4.4:
# sudo update-initramfs -u - Следующим шагом нужно выключить ОС командой:
# sudo poweroff - Заходим в настройки VM в веб-интерфейсе vSphere ESXi 6.5 и добавляем туда видеокарту: Add other device → PCI device. Отдельно замечу, что я добавлял только саму видеокарту, а звуковой контроллер (HDMI Audio Controller) — не добавлял.
- После добавления видеокарты при попытке сохранить настройки ESXi будет ругаться на резервацию памяти (подробнее — [12]), поэтому необходимо будет открыть выше настройки оперативной памяти (Memory) и поставить галочку напротив: Reservation → Reserve all guest memory (All locked).
Установка CUDA Toolkit 9.1 (вместе с драйвером nVidia) на Ubuntu 16.04
Конечно, частично этот раздел должен включать в себя и некоторые действия из предыдущего, но для упрощения и уменьшения количества шагов — все написано так, как написано 🙂
- Включаем виртуальную машину, подключаемся по VMRC, не входим в пользователя и нажимаем ALT+CTRL+F1. Вводим логин/пароль в консоли.
- Ставим все обновления:
# sudo apt-get update
# sudo apt-get upgrade - Выключаем дисплейный менеджер Иксов:
# sudo service lightdm stop - Проверяем текущую версию ядра (должно быть 4.4.0-X-generic, подробнее снова в [4]):
# uname -r - Переходим в директорию, куда мы ранее скачали CUDA Toolkit вместе с патчами (или директорию, где у нас находится драйвер для видеокарты, но повторю что он идет вместе с тулкитом, и если вы не хотите ставить его отдельно, то нет необходимости его качать).
# cd Загрузки - Запускаем установку тулкита (обратите особое внимание на передаваемый параметр для отключения 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 - Перед установкой тулкита нам зададут несколько вопросов, на которые я отвечал следующим образом (тут вопросы в сокращенном виде!):
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) - В итоге у нас должны установиться: nvidia driver, cuda toolkit и cuda samples и не должно вывалиться никаких ошибок (если вывалились — гуглите… я пока тестировал это всё и писал для себя короткие заметки с командами — переустанавливал убунту раз 5, чтобы попробовать заново).
- Далее нужно прописать пути к 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 - Затем нужно установить все патчи для 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 - После этого не делать ребут (важно — [14]), а запустить дисплейный менеджер Иксов:
# sudo service lightdm restart - Появится экран входа в пользователя — ввести логин/пароль и уже из убунты выполнить перезагрузку (reboot).
Проверка корректности установки драйвера и CUDA Toolkit
После перезагрузки и входа в пользователя необходимо проверить корректность установки драйверов и тулкита, т.к. если где-то что-то пошло не так и вы этого не заметили (или это каким-либо образом не отобразилось) — всё насмарку.
Открываем терминал и выполняем следующие шаги [15]:
- Проверяем видно ли видеокарту и её параметры (GPU FAN, GPU Temp, RAM и тд):
# nvidia-smi
- Проверяем версию CUDA компилятора:
# nvcc -V
- Проверяем видит ли 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 нужно проделать следующие действия:
- Зайти в убунту, открыть терминал и установить Open VMWare Tools [16]:
# sudo apt-get install open-vm-tools open-vm-tools-desktop - Выключить виртуальную машину, зайти в её настройки и для 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] — нужно произвести некоторые шаги:
- Подключить HDMI разъем монитора к GPU (без разницы через переходник или нет).
- Посмотреть следующие параметры видеокарты (GPU #0) и монитора (Display Device 0): PCI BusID, EDID Name, Minimum HorizSync, Maximum HorizSync, Minimum VertRefresh, Maximum VertRefresh с помощью команды:
# sudo nvidia-xconfig –query-gpu-info - Запустить создание/изменение конфигурации графической оболочки для Иксов через nvidia:
# sudo nvidia-xconfig
Тут важно отметить, что если у вас до этого был файл /etc/X11/xorg.conf , то лучше его забекапить )) - Поменять настройки GPU в конфигурации графической оболочки:
# vi /etc/X11/xorg.conf - Находим:
Section “Device”
и прописываем там найденный в шаге №2 BusID (пример оформления в [18]). - Находим:
Section “Monitor”
и меняем там следующие параметры (полученные в шаге №2):
ModelName = EDID Name
HorizSync = Minimum HorizSync — Maximum HorizSync
VertRefresh = Minimum VertRefresh — Maximum VertRefresh
Но будьте аккуратны и посмотрите пример оформления в [18], чтобы потом всё запустилось (в последних двух примерах нужно писать только цифры). - После этого перезагружаем 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) – то я смогу исправить это только у себя в блоге.
Источники
- https://vmind.ru/2016/08/08/probros-videokarty-nvidia-v-vmware-esxi-6-0/
- https://kb.vmware.com/s/article/2142307
- https://askubuntu.com/a/951892
- https://developer.download.nvidia.com/compute/cuda/9.1/Prod/docs/sidebar/CUDA_Installation_Guide_Linux.pdf
- http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#install-libraries
- https://devtalk.nvidia.com/default/topic/993862/cuda-8-0-missing-required-libraries-on-ubuntu-16-04/
- https://www.linkedin.com/pulse/installing-nvidia-cuda-80-ubuntu-1604-linux-gpu-new-victor
- https://askubuntu.com/a/537608
- https://github.com/BVLC/caffe/wiki/Caffe-on-EC2-Ubuntu-14.04-Cuda-7
- 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
- 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
- https://serverfault.com/questions/837369/esxi-6-5-server-no-vsphere-sched-mem-min-error-related-to-pci-passthrough
- https://devtalk.nvidia.com/default/topic/878117/cuda-setup-and-installation/-solved-titan-x-for-cuda-7-5-login-loop-error-ubuntu-14-04-/
- https://askubuntu.com/a/884574
- https://kislayabhi.github.io/Installing_CUDA_with_Ubuntu/
- https://kb.vmware.com/s/article/2073803
- https://askubuntu.com/questions/803648/16-04-on-esxi-6-screen-resolution
- https://devtalk.nvidia.com/default/topic/769851/multi-nvidia-gpus-and-xorg-conf-how-to-account-for-pci-bus-busid-change-/
Третью неделю бьюсь с этим мануалом ( все версии софта соответствуют инструкции. Карта 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” добрался до края гугла ( там за краем только реклама казино под ссылками бурлит и пахнет )
Хельп !
Super! Great work.
Спустя 5 лет ситуация начинает меняться
https://nvidia.custhelp.com/app/answers/detail/a_id/5173/~/geforce-gpu-passthrough-for-windows-virtual-machine-(beta)