Проброс видеокарты в ноутбуке. Laptop GPU Passthrough

в 12:53, , рубрики: Debian, gpu passthrough, kvm, laptop, laptop gpu passthrough, linux, proxmox, Видеокарты, виртуализация, Настройка Linux, ноутбук для работы, Ноутбуки, ноутбуки для игр, проброс видеокарты, сделай сам, системное администрирование
Проброс видеокарты в ноутбуке. Laptop GPU Passthrough - 1

… или как из игрового ноутбука средствами виртуализации сохранить игровую систему!
Если Вы рассматриваете ноутбук/ПК не только как игровую станцию, а еще и как хост для виртуальных машин, но при этом иногда нужно поиграть/поработать с 3d, то это возможно!

Добро пожаловать под cut.

Введение

Настоящая статья задумана как инструкция и развитие моей предыдущей статьи (Как из домашнего ПК средствами виртуализации сохранить игровую систему) по настройке хоста под виртуализацию с пробросом видеокарты игровой серий, не профессиональной. О пробросе интегрированной видеокарты будет сказано в конце статьи отдельно.

Ограничения метода

Для проброса именно дискретной видеокарты ноутбука/PCI-Express порт с установленной видеокартой необходимо выполнение следующих условий:

  1. Процессор и материнская плата должны поддерживать VT-x, VT-d от Интел или AMD-Vi, IOMMU от АМД, а так же эти технологии необходимо активировать в BIOS.
  2. После включения технологии IOMMU, о чем будет сказано ниже, необходимо в консоли прописать команду # dmesg | grep ecap, если в полученных строчках ответа последний символ 8, 9, a, b, c, d, e, или f, то поддерживается технология переназначение прерываний, а значит проброс получится, иначе нет.
    Например «ecap 10207f» сигнализирует о том, что результат будет успешным, а «ecap 1000» сигнализирует о том, что можно предаваться унынию.
после активации IOMMU в файле grub

производим экспресс проверку на возможность проброса, прописываем команды и анализируем отклик:

root@proxmox:~# dmesg | grep ecap
[ 0.145822] DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap 1c0000c40660462 ecap 19e2ff0505e
[ 0.145831] DMAR: dmar1: reg_base_addr fed91000 ver 1:0 cap d2008c40660462 ecap f050da

Переназначение прерываний работает, т.к. ecap оканчивается на A и E!

root@proxmox:~# lspci
00:00.0 Host bridge: Intel Corporation 8th Gen Core Processor Host Bridge/DRAM Registers (rev 07)
00:01.0 PCI bridge: Intel Corporation 6th-10th Gen Core Processor PCIe Controller (x16) (rev 07)
00:02.0 VGA compatible controller: Intel Corporation CometLake-S GT2 [UHD Graphics 630]
00:12.0 Signal processing controller: Intel Corporation Cannon Lake PCH Thermal Controller (rev 10)
00:14.0 USB controller: Intel Corporation Cannon Lake PCH USB 3.1 xHCI Host Controller (rev 10)
00:14.2 RAM memory: Intel Corporation Cannon Lake PCH Shared SRAM (rev 10)
00:14.3 Network controller: Intel Corporation Wireless-AC 9560 [Jefferson Peak] (rev 10)
00:15.0 Serial bus controller [0c80]: Intel Corporation Cannon Lake PCH Serial IO I2C Controller #0 (rev 10)
00:16.0 Communication controller: Intel Corporation Cannon Lake PCH HECI Controller (rev 10)
00:17.0 SATA controller: Intel Corporation Cannon Lake PCH SATA AHCI Controller (rev 10)
00:1b.0 PCI bridge: Intel Corporation Cannon Lake PCH PCI Express Root Port #21 (rev f0)
00:1c.0 PCI bridge: Intel Corporation Cannon Lake PCH PCI Express Root Port #5 (rev f0)
00:1c.5 PCI bridge: Intel Corporation Cannon Lake PCH PCI Express Root Port #6 (rev f0)
00:1c.6 PCI bridge: Intel Corporation Cannon Lake PCH PCI Express Root Port #7 (rev f0)
00:1f.0 ISA bridge: Intel Corporation H370 Chipset LPC/eSPI Controller (rev 10)
00:1f.3 Audio device: Intel Corporation Cannon Lake PCH cAVS (rev 10)
00:1f.4 SMBus: Intel Corporation Cannon Lake PCH SMBus Controller (rev 10)
00:1f.5 Serial bus controller [0c80]: Intel Corporation Cannon Lake PCH SPI Controller (rev 10)
01:00.0 VGA compatible controller: NVIDIA Corporation TU116M [GeForce GTX 1660 Ti Mobile] (rev a1)
01:00.1 Audio device: NVIDIA Corporation TU116 High Definition Audio Controller (rev a1)
01:00.2 USB controller: NVIDIA Corporation TU116 USB 3.1 Host Controller (rev a1)
01:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU116 USB Type-C UCSI Controller (rev a1)
06:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981/PM983
07:00.0 Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. RTL8411B PCI Express Card Reader (rev 01)
07:00.1 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 12)

root@proxmox:~# find /sys/kernel/iommu_groups/ -type l
/sys/kernel/iommu_groups/7/devices/0000:00:16.0
/sys/kernel/iommu_groups/15/devices/0000:07:00.0
/sys/kernel/iommu_groups/15/devices/0000:07:00.1
/sys/kernel/iommu_groups/5/devices/0000:00:14.3
/sys/kernel/iommu_groups/13/devices/0000:00:1f.0
/sys/kernel/iommu_groups/13/devices/0000:00:1f.5
/sys/kernel/iommu_groups/13/devices/0000:00:1f.3
/sys/kernel/iommu_groups/13/devices/0000:00:1f.4
/sys/kernel/iommu_groups/3/devices/0000:00:12.0
/sys/kernel/iommu_groups/11/devices/0000:00:1c.5
/sys/kernel/iommu_groups/1/devices/0000:00:01.0
/sys/kernel/iommu_groups/1/devices/0000:01:00.1
/sys/kernel/iommu_groups/1/devices/0000:01:00.3
/sys/kernel/iommu_groups/1/devices/0000:01:00.2
/sys/kernel/iommu_groups/1/devices/0000:01:00.0
/sys/kernel/iommu_groups/8/devices/0000:00:17.0
/sys/kernel/iommu_groups/6/devices/0000:00:15.0
/sys/kernel/iommu_groups/14/devices/0000:06:00.0
/sys/kernel/iommu_groups/4/devices/0000:00:14.2
/sys/kernel/iommu_groups/4/devices/0000:00:14.0
/sys/kernel/iommu_groups/12/devices/0000:00:1c.6
/sys/kernel/iommu_groups/2/devices/0000:00:02.0
/sys/kernel/iommu_groups/10/devices/0000:00:1c.0
/sys/kernel/iommu_groups/0/devices/0000:00:00.0
/sys/kernel/iommu_groups/9/devices/0000:00:1b.0

Здесь нас из первого линстинга интересует адрес видеокарты и сопутствующих устройств, видно, что помимо видеокарты в одном блоке идет аудио-контроллер, а так же USB type-C контроллер, а в следующем листинге мы видим что устройства входят сообща в одну и ту же IOMMU-группу и при пробросе физически другим устройствам мешать не будут, следовательно проброс в теории возможен! Дальше только практика.

Что нам потребуется для установки и настройки

  1. ПК Ноутбук с дискретной игровой видеокартой у которого схема подключения к дисплею/монитору типа MUXedimage
  2. Роутер с доступом в интернет (Для настройки и последующего использования я бы рекомендовал подключаться кабелем к роутеру)
  3. Физически выделенный жесткий диск SSD под хост и виртуальные машины объёмом от 250Гб
  4. Загрузочная USB флешка с ProxMox'ом (надстройка над Debian Linux + KVM)
  5. Последняя версия VirtIO драверов
  6. Дополнительный внешний монитор, подключённый к Вашему ноутбуку кабелем в видео-разъем управляемым напрямую дискретной видеокартой (кроме случаев, если у Вас дисплей ноутбука напрямую подключен к дискретной видеокарте)
  7. Дополнительную мышь и клавиатуру для гостевой системы, по крайней мере для первоначальной настройки
  8. Для удобства — второй ПК/ноутбук в сети на время установки и настройки софта, категорически для Вашего удобства, но это не является необходимым условием работы и дальнейшей эксплуатации такого ноутбука.

Установка ProxMox и настройка хоста

Настоящая настройка софта, нюансы и описание метода будет происходить на примере моего ноутбука от Clevo N957TC (aka Hasee ZX7-ct5da), о котором я уже писал на Хабрахабре статью. Такого рода ноутбуки сейчас продают в России под брендом Dream Machines
Intel Core i7-8700, GTX 1660Ti, 16 Гб ОЗУ, 500Гб SSD, 15,6 дюйма

0-й этап. Проверяем что бы в BIOS'е были включены нужные параметры виртуализации, указанные в требованиях к железу выше в этой статьи.

1-й этап. Устанавливаем ProxMox. Здесь все просто, самое главное аккуратнее с IP, т.к. теперь Ваше устройство по Вами выбранному протоколу (LAN/WiFi) будет работать на статике и именно через него виртуальные машины будут получать интернет. Не всегда это удобно, хотя потом можно будет перенастроить или даже обойти, например пробросив виртуалку напрямую порт с USB — 4G модемом.
После установки на ПК ноутбуке будет доступна только консоль, но в локальной сети ProxMox будет доступен через WEB-интерфейс по адресам:
https://"указанный_вами_при_установке_IP:8006
https://127.0.0.1:8006
Login: root
Password: тот_что_вы_указали_при_установке_Proxmox

В случае если нет второго ПК, то перед дальнейшей настройкой необходимо установить графический интерфейс для Linux. Для этого в консоли прописываете поочередно команды обновления репозитория:

# apt-get update
# apt-get dist-upgrade

после чего ставим выбранный GUI Linux (xfce4, gnome, kde, ...) на выбор, только ставить нужно полное окружение, иначе может не завестись сеть через браузер

# apt-get install kde-full

Перед тем как перезагрузится нужно создать юзера с обычными правами в системе:

# adduser новое_имя_пользователя

либо, настроить возможность логина в графическое окружение пользователю root, чего я не рекомендую делать, но вдруг!?

После перезагрузки логинимся под тем юзером, кто нам ближе, открываем браузер, вводим в строке адреса сайта адрес WEB-интерфейса ProxMox (см. чуть выше по тексту), прописываем логин и пароль пользователя root и попадаем в меню настроек хоста гипервизора.

image

2-й этап. Настраиваем хост. Открываем консоль хоста под root'ом. Для этого в браузере выбираем слева название Вашего ProxMox сервера, данное Вами при установке, и кликнув на нем правой кнопкой мыши, выбираем меню Shell. В новом окне будем проделывать все настройки, либо можно запустить из графического окружения терминал и прописывать команды добавляя sudo:

# nano /etc/default/grub

и редактируем строку, заменив в ней значения на следующие:

GRUB_CMDLINE_LINUX_DEFAULT=«quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction nofb nomodeset»

Если у Вас Процессор от AMD, то в строке выше intel_iommu=on меняете на amd_iommu=on. В сети есть свидетельства, что некоторым помогают дополнительные параметры в конце этой строки как video=vesafb:off,efifb:off, но при этом параметре после загрузки экран ноутбука погаснет.

После этой манипуляции необходимо сохранить файл и дать команду, с последующей перезагрузкой хоста:

# update-grub

После чего прописываем следующие команды в консоли

# echo «options vfio_iommu_type1 allow_unsafe_interrupts=1» > /etc/modprobe.d/iommu_unsafe_interrupts.conf
# echo «options kvm ignore_msrs=1» > /etc/modprobe.d/kvm.conf

# echo «softdep nouveau pre: vfio-pci» » /etc/modprobe.d/nvidia.conf
# echo «softdep nvidia pre: vfio-pci» » /etc/modprobe.d/nvidia.conf
# echo «softdep nvidia* pre: vfio-pci» » /etc/modprobe.d/nvidia.conf

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

Прописываем в файле конфигурации # nano /etc/modules загрузку необходимых драйверов:

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

Сохраняем файл и выходим. Затем запрещаем ProxMox'у использовать следующие драйвера видеокарт на хосте:

# echo «blacklist radeon» >> /etc/modprobe.d/blacklist.conf
# echo «blacklist nouveau» >> /etc/modprobe.d/blacklist.conf
# echo «blacklist nvidia» >> /etc/modprobe.d/blacklist.conf

Прописываем следующую команду (здесь 01:00 блок адресов дискретной ВК)

# lspci -n -s 01:00

на что получаем ответ

01:00.0 0300: 10de:2191 (rev a1)
01:00.1 0403: 10de:1aeb (rev a1)
01:00.2 0c03: 10de:1aec (rev a1)
01:00.3 0c80: 10de:1aed (rev a1)

Запоминаем эти значения, после чего открываем для редактирования файл настроек # nano /etc/modprobe.d/vfio.conf и аккуратно прописываем

options vfio-pci ids=10de:2191,10de:1aeb,10de:1aec,10de:1aed disable_vga=1

На этом настройка самого ProxMox у нас закончена, необходимо дать следующие команды

# update-initramfs -u
# reset

и перезагрузить хост. Теперь у нас все готово к тому, что бы приступить к настройке виртуальных машин.

3-й этап. Настраиваем виртуальную машину. Теперь создаем через веб интерфейс шаблон настроек и правим через консоль файл настроек виртуальной машины. Для этого в консоли необходимо ввести # nano /etc/pve/qemu-server/номер_виртуальной_машины_из_WEB-интерфейса.conf, после чего необходимо внести следующие дополнительные строки

args: -cpu 'host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=NV43FIX,kvm=off'

bios: ovmf

cpu: host,hidden=1,flags=+pcid

machine: pc-q35-3.1

hostpci0: 01:00.0,pcie=1,x-vga=on

Пример файла настроек Виртуальной машины

args: -cpu 'host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=NV43FIX,kvm=off'
bios: ovmf
boot: order=ide2;sata0;net0
cores: 4
cpu: host,hidden=1,flags=+pcid
efidisk0: local-lvm:vm-100-disk-0,size=4M
hostpci0: 01:00.0,pcie=1,x-vga=on
ide2: none,media=cdrom
machine: pc-q35-3.1
memory: 8196
name: Windows10
net0: virtio=BE:AB:28:39:99:70,bridge=vmbr0,firewall=1
numa: 0
ostype: win10
sata0: local-lvm:vm-100-disk-1,size=100G
scsihw: virtio-scsi-pci
smbios1: uuid=669a38fe-c0f1-481a-aae4-f2444fc2625f
sockets: 1
usb0: host=1-3,usb3=1
vga: none
vmgenid: f2576d2f-629e-4b4e-b9eb-59735c6e3050

Здесь нужно сказать следующее: несмотря на то что в виртуальную машину можно добавить программный видео-адаптер, я бы не рекомендовал это делать, т.к. сейчас важно определить работоспособность видеовывода. Если Ваше железо приняло все текущие настройки на ура, то при старте виртуальной машины с подключенным в правильный порт монитором вы увидите картинку с логотипом ProxMox на заставке. Дальше следуют 3 пути развития событий:

  1. Идеальный — весь процесс установки ОС вы будете наблюдать на внешнем мониторе. Тогда тормозим систему, пробрасываем USB мышь и временно USB клавиатуру. После чего вновь стартуем виртуальную машину и проводим установку до конца.
  2. Дальше логотипа ProxMox ситуация не сдвинется с места, не смотря на то, что если все-таки подключить софтовую видеокарту и подключится к виртуальной машине через видео-консоль, то процессом установки ОС можно будет управлять дальше. Здесь нужно остановиться и воспользоваться поиском, связанным с дополнительными параметрами в настройках файла grub или самого ProxMox. Т.к. если видеосигнал пошел. то и проброс возможен. Здесь нужно понять и определится в чем именно ошибка или нехватка каких-либо параметров.
  3. Черный дисплей и отсутствие видеосигнала на внешнем мониторе. Скорее всего вы потерпели фиаско и, если проблема не в отсутствии контакта, забытом переключателе питания или канале видео вывода на мониторе, то — увы!

Я рекомендую начать установку в виртуальную машину Линукс. Потому что у линуксовых драйверов меньше проблем с ошибкой 43, для чего рекомендую живой образ Garuda Linux, основанный на Arch Linux, если у Вас Live DVD стартовал с включенным видеодрайвером — поздравляю. В Windows Успех гарантирован на 99%. В самой Windows могут быть проблемы, а именно нам потребуется последний видеодрайвер под Вашу видеокарту. Почему-то стандартный видеодрайвер от производителя ноутбука у меня в виртуальной машине не завелся, выдав широко известную ошибку в узких кругах под номером 43. Прежде чем нам удастся скачать их необходимо виртуальной машине с Windows подсунуть диск с драйверами VirtIO и произвести установку. После того как Вы с качаете свежий драйвер пак необходимо будет распаковать драйвера и вручную подсунуть драйвер видеокарты. При этом будьте внимательны, а именно: моя ВК на нативном железе в Windows определяется как GTX1660ti, но на нее драйвер мобильной видеокарты без ошибок не встает, встает только GTX1660ti max-q, т.к. теплопакет у меня 80Вт на ВК.

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

Всем Добра! Берегите себя и Ваши гаджеты! =)

Автор: Денис

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js