… или как из игрового ноутбука средствами виртуализации сохранить игровую систему!
Если Вы рассматриваете ноутбук/ПК не только как игровую станцию, а еще и как хост для виртуальных машин, но при этом иногда нужно поиграть/поработать с 3d, то это возможно!
Добро пожаловать под cut.
Введение
Настоящая статья задумана как инструкция и развитие моей предыдущей статьи (Как из домашнего ПК средствами виртуализации сохранить игровую систему) по настройке хоста под виртуализацию с пробросом видеокарты игровой серий, не профессиональной. О пробросе интегрированной видеокарты будет сказано в конце статьи отдельно.
Ограничения метода
Для проброса именно дискретной видеокарты ноутбука/PCI-Express порт с установленной видеокартой необходимо выполнение следующих условий:
- Процессор и материнская плата должны поддерживать VT-x, VT-d от Интел или AMD-Vi, IOMMU от АМД, а так же эти технологии необходимо активировать в BIOS.
- После включения технологии IOMMU, о чем будет сказано ниже, необходимо в консоли прописать команду
# dmesg | grep ecap
, если в полученных строчках ответа последний символ 8, 9, a, b, c, d, e, или f, то поддерживается технология переназначение прерываний, а значит проброс получится, иначе нет.
Например «ecap 10207f» сигнализирует о том, что результат будет успешным, а «ecap 1000» сигнализирует о том, что можно предаваться унынию.
после активации IOMMU в файле grub
производим экспресс проверку на возможность проброса, прописываем команды и анализируем отклик:
root@proxmox:~# dmesg | grep ecapПереназначение прерываний работает, т.к. ecap оканчивается на A и E!
[ 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
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Здесь нас из первого линстинга интересует адрес видеокарты и сопутствующих устройств, видно, что помимо видеокарты в одном блоке идет аудио-контроллер, а так же USB type-C контроллер, а в следующем листинге мы видим что устройства входят сообща в одну и ту же IOMMU-группу и при пробросе физически другим устройствам мешать не будут, следовательно проброс в теории возможен! Дальше только практика.
/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
Что нам потребуется для установки и настройки
ПКНоутбук с дискретной игровой видеокартой у которого схема подключения к дисплею/монитору типа MUXed- Роутер с доступом в интернет (Для настройки и последующего использования я бы рекомендовал подключаться кабелем к роутеру)
- Физически выделенный жесткий диск SSD под хост и виртуальные машины объёмом от 250Гб
- Загрузочная USB флешка с ProxMox'ом (надстройка над Debian Linux + KVM)
- Последняя версия VirtIO драйверов
- Дополнительный внешний монитор, подключённый к Вашему ноутбуку кабелем в видео-разъем управляемым напрямую дискретной видеокартой (кроме случаев, если у Вас дисплей ноутбука напрямую подключен к дискретной видеокарте)
- Дополнительную мышь и клавиатуру для гостевой системы, по крайней мере для первоначальной настройки
- Для удобства — второй ПК/ноутбук в сети на время установки и настройки софта, категорически для Вашего удобства, но это не является необходимым условием работы и дальнейшей эксплуатации такого ноутбука.
Установка 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 модемом.
После установки на
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 и попадаем в меню настроек хоста гипервизора.
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 пути развития событий:
- Идеальный — весь процесс установки ОС вы будете наблюдать на внешнем мониторе. Тогда тормозим систему, пробрасываем USB мышь и временно USB клавиатуру. После чего вновь стартуем виртуальную машину и проводим установку до конца.
- Дальше логотипа ProxMox ситуация не сдвинется с места, не смотря на то, что если все-таки подключить софтовую видеокарту и подключится к виртуальной машине через видео-консоль, то процессом установки ОС можно будет управлять дальше. Здесь нужно остановиться и воспользоваться поиском, связанным с дополнительными параметрами в настройках файла grub или самого ProxMox. Т.к. если видеосигнал пошел. то и проброс возможен. Здесь нужно понять и определится в чем именно ошибка или нехватка каких-либо параметров.
- Черный дисплей и отсутствие видеосигнала на внешнем мониторе. Скорее всего вы потерпели фиаско и, если проблема не в отсутствии контакта, забытом переключателе питания или канале видео вывода на мониторе, то — увы!
Я рекомендую начать установку в виртуальную машину Линукс. Потому что у линуксовых драйверов меньше проблем с ошибкой 43, для чего рекомендую живой образ Garuda Linux, основанный на Arch Linux, если у Вас Live DVD стартовал с включенным видеодрайвером — поздравляю. В Windows Успех гарантирован на 99%. В самой Windows могут быть проблемы, а именно нам потребуется последний видеодрайвер под Вашу видеокарту. Почему-то стандартный видеодрайвер от производителя ноутбука у меня в виртуальной машине не завелся, выдав широко известную ошибку в узких кругах под номером 43. Прежде чем нам удастся скачать их необходимо виртуальной машине с Windows подсунуть диск с драйверами VirtIO и произвести установку. После того как Вы с качаете свежий драйвер пак необходимо будет распаковать драйвера и вручную подсунуть драйвер видеокарты. При этом будьте внимательны, а именно: моя ВК на нативном железе в Windows определяется как GTX1660ti, но на нее драйвер мобильной видеокарты без ошибок не встает, встает только GTX1660ti max-q, т.к. теплопакет у меня 80Вт на ВК.
ЗЫ. Т.к. настройка ноутбука окончательно не завершена, то статья будет дополнятся, в частности будут решаться проблемы о пробросе интегрированной видеокарты в виртуальную машину, пробросе клавиатуры ноутбука, тесты и сравнение нативного железа с виртуальным, а так же в планах снять видеоинструкцию о настройке системы.
Всем Добра! Берегите себя и Ваши гаджеты! =)