Меню

Проброс видеокарты в виртуальную машину vmware



Проброс видеокарты в виртуальную машину vmware

  • Материнская плата Gigabyte GA-Q67M-D2H-B3
    Прошивка BIOS — F5
    Setup: CPU->Intel Virtualization Technology=ON
    Setup: Chipset->North Bridge->VT-d=ON
  • Процессор Intel Core i5 2500 3.3 GHz
  • Память 16 GB
  • ATI Radeon HD 3470 в первом слоте PCIe, используется гипервизором
  • ATI Radeon HD 3450 во втором слоте PCIe, отдается гостевой ОС
  • Сетевой адаптер Intel в слоте PCI
  • XCP (Xen Cloud Platform) 1.0 (XenServer build 42052c)
  • Citrix XenCenter для управления
  • Windows 7 64 bit в качестве гостевой ОС, ATI Catalyst 12.1

Поначалу я долго экспериментировал с VMware vSphere 5.0. Собственно, аппаратная конфигурация подбиралась именно под нее. По дороге открылся ряд интересных подробностей: например, VT-d должен поддерживаться и процессором (пишут, что процессоры с индексом K не годятся), и чипсетом и материнской платой. С видеокартами вообще беда: известно, что с большинством этот фокус не проходит, с некоторыми (довольно короткий список) у одних получается, у других нет. Долгое и содержательное (хотя не слишком радостное) обсуждение было тут:
VMware Communities: VMDirectPath and ATI Radeon. Radeon 3450 ходил, пожалуй, в фаворитах как одна из самых пробрасываемых карт.
Я перебрал приличное количество разнообразных комбинаций железа. В конкурсе участвовали две материнские платы, три видеокарты плюс интегрированное видео SandyBridge (IGD), три сетевых адаптера и один процессор. Несколько раз я бросал эти бесплодные попытки на неделю-другую, потом придумывались какие-то варианты. По дороге был один момент, когда почти получилось: виртуалка правильно определила монитор, но дальше дело не пошло. Уперся в то, что карта вроде бы нормально пробрасывалась в виртуалку, и в девайс менеджере показывалась ровно, но Каталист упорно отказывался иметь с ней дело. Карта как живая, но не работает.

Можно было попробовать много чего еще: Windows XP и Linux в качестве гостевых систем (ставил Windows 7 в 32 и 64-разрядном исполнении), добыть очередную видеокарту… В конце концов плюнул и решил зайти с другого конца, попробовав другой гипервизор. Не мудрствуя, взял то, что на виду: Xen в составе Xen Cloud Platform(XCP).
XCP поставился без сучка без задоринки.

На некоторое время поставил в тупик вопрос: как этой системой рулить? В смысле, должна же быть какая-нибудь консоль управления, желательно под винды? Поковырявшись полдня с условно-штатным OpenXenManager я пришел к мысли, что то ли лыжи не едут, то ли эта кроссплатформенная тулза на винде не живет. Один или два раза она сконнектилась с сервером, но померла где-то в процессе работы, остальные разы глухо висла при коннекте, сливая неудежимый поток исключений в консоль Питона.
К счастью, более широкий взгляд в окружающий интернет открыл мне, что Citrix XenCenterпрекрасно может рулить opensource-ным Xen-ом, а сам вполне бесплатен. Правда, при коннекте кричит, что через N дней у вашего сервера истечет Evaluation period, но знающие люди пишут, что это он просто не в курсе насчет opensource редакции сервера, а на самом деле все будет работать.
XenCenter позволяет создавать-включать-гасить виртуалки, а проброс устройств надо настраивать из sysadmin-friendly интерфейса командной строки.

Против ожиданий, проблем тут не случилось. Сделал все по мануалу, и хватило его одного.

NVIDIA GRID K1 и K2 — в основе готового решения VDI

Вот народ жалуется, что по Xen-у документации мало. Так другой раз и хорошо, что мало, если этого хватает. Сколько я по vSphere прочел, и все без толку… Впрочем, не хочу говорить дурных слов про vSphere. Под ней зато так железо настроилось, что Xen пролетел прямо со свистом.
Итак, с помощью XenCenter я организовал виртуалку о двух ядрах и 4 ГБ памяти, накатил туда седьмую 64-битную винду и пошел пробрасывать.

В соответстви с руководством правим , вставляя строку после каждого вхождения
Выполняем .
Шаги, связанные с модулем , пропускаем — пишут, что в шестерке он уже вкомпилирован в ядро.
Делаем xe vm-list и находим uuid нашей виртуалки, у меня
Выполняем команду и находим в выводе нашу карту, например 02:00.0 VGA compatible …, 02:00.1 Audio… (двойка удивительным образом соответствует номеру слота, куда воткнута карта).
Записываем однострочный скрипт вида

У меня на карте, помимо видеоадаптера, еще звук — поэтому, помня грабли, на которые наступал в vSphere, добавляю оба устройства: 0/0000:02:00.0, 0/0000:02:00.1.
Выполняем скрипт.

Для контроля — действительно
Останавливаем и снова запускаем виртуалку (пишут, что именно так, а не ребутом — не стану проверять лишний раз).
При первой попытке карта у меня в первом слоте PCIe (01:00.0, 01:00.1) и по умолчанию используется гипервизором. После перезапуска виртуалки монитор гаснет.
В XenCenter (с ноутбука) заходим в консоль виртуалки и после логина в винду видим, что она просит ребута. Признак того, что она нашла новое устройство. Не будем ей отказывать. Ребут. Действительно, в Device Manager появился новый видеоадаптер Radeon 3450 с драйвером Microsoft WDDM 1.1. Из предыдущего опыта известно, что драйвер нужен родной. Качаю и ставлю свежий ATI Catalist 12.1, тот после установки, как обычно просит ребута. Ребут… опаньки. Первая попытка накрывается медным тазом: падает гипервизор. Да… vSphere в такой ситуации одерживала убедительную победу над виртуалкой, устраивая ей BSOD.
Перепускаем хост и, по рекомендации лучших собаководов, смотрим, что пишет нам команда
. Пишет она, помимо прочего, такое:

Похоже, что передача карты на горячую нам не светит. Ладно. Дадим гипервизору свой VGA адаптер, благо видеокарт мне теперь хватает. Переставляем Radeon 3450 во второй слот, в первый ставим валяющийся рядом 3470. К каждой карте прицепляем по монитору. Включаем хост, запускаем виртуалку. Винда просит перезагрузки после изменения конфигурации. Ребут. Логинимся…

Читайте также:  Видеокарта работает gpu нет

В консоли XenCenter заставка зависает, и я не сразу соображаю, что правый монитор светится синим


Оно все-таки произошло.
Итого, на Xen срослось за 3 дня (после того, как 3 месяца упражнялся на VMware).

Картинка на мониторе самая обыкновенная, без особенностей. Разрешение 1920х120 держит. Не тупит (хотя тестов не гонял). Видео с YouTube проигрывается нормально.

На этой радостной ноте завершу свой правдивый отчет, а сам займусь пробросом клавиатуры, мыши и прочей периферии.

Источник

Проброс (passthrough) видеокарты nVIDIA в виртуалку Ubuntu 16.04 для хоста VMWare vSphere ESXi 6.5

Как уже писал ранее — недавно в мой домашний сервер была куплена видеокарта MSI GeForce GTX 1080 Ti GAMING X TRIO 11 GB OC Enthusiast для погружения в тему Deep Learning. Но из-за сложившейся ранее ситуации — мне необходимо было иметь ОС Windows Server, а с видюхой я планировал работать в Ubuntu. Вначале была мысль поставить Ubuntu (хвостовой ОС), а оттуда грузить через VirtualBox уже Windows (гостевой ОС), но были огромные вопросы по производительности, да и мы же не ищем легких путей:) Поэтому по советам товарищей с форума я решился попробовать гипервизор VMWare vSphere ESXi 6.5, который позволяет пробрасывать PCI-устройство в одну из гостевых операционных систем (виртуальных машин).

Естественно, всё оказалось не так просто и радужно как хотелось бы, но гугл и несколько дней тестов привели меня к полноценной инструкции (пошаговому руководству) как лучше всего сделать PCI-passthrough (проброс видюхи GTX 1080 Ti) в Ubuntu Desktop 16.04.4 и использовать там CUDA Toolkit 9.1. Об этом я и расскажу далее, но прежде чем пошагово начинать настройку — советую бегло прочитать статью и пометить у себя в голове важные моменты (ведь я не знаю вашу конфигурацию и описываю свой опыт), т.к. у вас могут появиться дополнительные вопросы или действия, которые необходимо сделать отличным от моего образом.

Все ссылки на источники я оставил и пометил «публикационным» способом. Так будет удобнее и проще, если вдруг захотите найти источник и углубиться (если вдруг возникнет какая-то проблема).

Предварительная настройка гипервизора 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 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 на 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

  • Затем нужно установить все патчи для 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).
  • Проверка корректности установки NVIDIA-драйверов и 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 16.04 для 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 на монитор в гостевой OS Ubuntu 16.04 для хоста 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.

    Резюмируя всё вышенаписанное

    Для меня был удивительным тот факт, что установка CUDA Toolkit и nVidia drivers в убунту — это такой геморрой. Я 3 дня фулл-тайм занимался тем, что тестировал различные ответы со стековерфолу и форума разработчиков nvdia. Очень спасали меня, конечно, снепшоты в ESXi, чтобы не устанавливать Ubuntu каждый раз с нуля. Но по итогу всё равно я несколько раз её переставлял, особенно когда в середине пути вскрылся косяк с efi.

    Если бы в тот момент я нашел такую же пошаговую инструкцию, где всё описано от и до — то это спасло бы кучу моих нервов и времени. Именно поэтому я записывал каждый сделанный шаг и в итоге решил написать это пошаговое руководство по пробросу видеокарты в ESXi. Да, конечно, лучше было бы описать всё на английском (in english), т.к. больше всего вопросов и ответов именно на этом языке, но как смог — так и сделал. Надеюсь, что зарубежные братья, кто столкнется с этим вопросом смогут воспользоваться google translate, чтобы не мучаться и сделать всё так, как я описал выше.

    Мне будет очень приятно, если вы поделитесь этой публикацией где-то на форуме (в момент, когда кто-то столкнется с такой же проблемой) или в каком-то чате, где у кого-нибудь возникнет этот же вопрос. Я потратил целый день, чтобы написать статью и разложить всё по полочкам, т.к. у меня всё было скомкано просто в текстовом файле в виде команд и ссылок откуда я взял эту информацию.

    Спасибо за внимание и да прибудет сила Deep Learning вместе с GPU!

    Источник