Как из домашнего ПК средствами виртуализации сохранить игровую систему

  • Tutorial
Благодаря конкуренции и развитию НТП современные ПК позволяют выполнять множество простых и сложных задач одновременно, например играть и воспроизводить видео на ТВ, рендерить графику и читать новости в интернете, раздавая торренты параллельно, и т.д. и т.п. Многие идут дальше и используют несколько ПК для работы и развлечений. Однако при помощи технологий виртуализации можно с одной стороны расширить возможности своего ПК, а с другой сэкономить, т.к. по сути можно запустить несколько операционных систем на одном железе в одно и то же время.


Эта статья будет повещена настройки хоста именно для использования в «быту», т.е. разговор пойдет о GPU PASSTHROUGH.

Введение


Сперва несколько слов про виртуализацию в целом. Согласно Википедии:
Виртуализа́ция — предоставление набора вычислительных ресурсов или их логического объединения, абстрагированное от аппаратной реализации, и обеспечивающее при этом логическую изоляцию друг от друга вычислительных процессов, выполняемых на одном физическом ресурсе.
Достигается как при помощи приложений (например VirtualBox, VMware) так и на уровне систем, поддерживающих аппаратную виртуализацию (например KVM, ESXi, Hyper-V). В последнем случае потери производительности по сравнению с нативными системами минимальна.

Здесь и далее в статье будет описание настроек системы виртуализации с открытым исходным кодом Proxmox потому что она в меру дружелюбна, есть легкий доступ к консоли через веб форму, а так же базируется на связке Debian + kvm, по которым очень много гайдов и описаний в сети, т.е. документации в т.ч. и на русском языке.

Требования к железу


Нам потребуется:

— процессор и материнская плата с поддержкой VT-x, VT-d от Интел или AMD-Vi, IOMMU от АМД. Не поленитесь и уточните поддерживает ли именно Ваш экземпляр данные требования.

Что касается материнских плат. Категорически не рекомендую гнать железо при посредственной разводке на плате питания. По Z270 и Z390 игнорировать оранжевую зону или оставлять работать в стоке.

  • 2 видеокарты, одну игровую (в сети за меньшее количество проблем при пробросах в виртуальную машину хвалят красных, но лично у меня все получилось с видеокартой от зеленых), вторую для хоста. В моем случае это интегрированная в процессор.
  • 1-2 монитора и кабели к ним, для того чтобы
  • пара комплектов клавиатура + мышь, чтобы было удобно работать и настраивать системы
  • второй ПК или планшет подключенный к локальной сети, что бы сделать настройки через вебформу.

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


Мною было использована следующая игровая конфигурация:

— ПК для хоста конфиг был собран на далеко не лучшей материнской плате, но на англоязычных форумах очень часто хвалят эту фирму за то, что ее железо чаще всего подходит для таких вещей:
Процессор — i7 8700k
Мать — ASRock Z390M Pro4
Видеокарта — INNO3D GeForce GTX 1070 iChill X4
— второй ПК (Мини-ПК Morefine-M1s),
— 2 мыши,
— 1 клавиатуру на хосте, на остальных устройствах использовал софтварную,
— 3 подключения к монитору Dell U2713HM (VGA — для интегрированной видеокарты, HDMI — для GTX1070, на DVI находится Мини-ПК. Переключения между видеосигналами осуществлял через меню монитора)

0й этап — На материнской плате включаем VT-d:Enable, Intel Vitrualization Technology:Enable, Primary Graphx adapter:VGA, Above 4G Decoding:Enable. Если есть возможность обязательно выбираем основным графическим адаптером тот, на котором будет работать хост, т.е. более слабую видеокарту и переключаемся на нее.

1й этап — Устанавливаем Proxmox на хост. Для этого:

1.1. Скачиваем образ диска с официального сайта

1.2. Пишем образ на флешку при помощи специальных программ

1.3. Загружаемся с флешки, и производим инсталляцию с указанием на какой жесткий диск ставить, вводим пароль для будущего пользователя root, а так же настройки сети прописываем явно.

2й этап — Подключаемся по сети через веб интерфейс при помощи второго ПК или
планшета (в моем случае это был Мини-ПК) к хосту и настраиваем Proxmox по этому гайду через текстовую консоль.

image

Есть маленький нюанс, который возможно обходится программно, но я решил что поменять предыдущую материнскую плату будет проще, т.к. плата от Gigabyte этому требованию не соответствовала:
1) Run the «dmesg | grep ecap» command.

2) On the IOMMU lines, the hexadecimal value after «ecap» indicates whether interrupt remapping is supported. If the last character of this value is an 8, 9, a, b, c, d, e, or an f, interrupt remapping is supported. For example, «ecap 1000» indicates there is no interrupt remapping support. «ecap 10207f» indicates interrupt remapping support, as the last character is an «f».

Interrupt remapping will only be enabled if every IOMMU supports it.
Если условие выполняется — продолжаем.

Итак настройки:

Открываем файл командой из консоли (символ двойной решетки вводить не надо, так я буду разделять в тексте команды от того что необходимо внести в файл)

## nano /etc/default/grub

производим замену

GRUB_CMDLINE_LINUX_DEFAULT="quiet"

для процессоров Интел

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

для процессоров АМД

GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on"

следом даем команду

## update-grub

после чего перезагружаем хост через веб интерфейс

Файл grub для ПК в статье
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Proxmox Virtual Environment"
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
GRUB_CMDLINE_LINUX=""

# Disable os-prober, it might add menu entries for each guest
GRUB_DISABLE_OS_PROBER=true

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Disable generation of recovery mode menu entries
GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"


Добавляем в файл конфигурации загрузку необходимых драйверов

## nano /etc/modules

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

Прописываем в консоли

## lspci

На экран будет выведен список устройств доступных для проброса, находим интересующий нас блок с видеокартой, в моем случае это 2 устройства в группе видеокарта и звук по адрсам 01:00.0 и 01:00.1, поэтому я прописываю сразу группу.

## nano /etc/pve/qemu-server/vmid.conf

hostpci0: 01:00

Прописываем в консоли команду для того что бы определить модель и ее id

## lspci -n -s 01:00
01:00.0 0300: 10de:1b81 (rev a2)
01:00.1 0403: 10de:10f0 (rev a1)

Теперь правим файл под нашу видеокарту (в Вашем случае id будут иные)

## nano /etc/modprobe.d/vfio.conf

options vfio-pci ids=10de:1b81,10de:10f0

Заносим в черный лист драйвера

## nano /etc/modprobe.d/blacklist.conf

blacklist radeon
blacklist nouveau
blacklist nvidia

Теперь создаем через веб интерфейс и правим через консоль файл настроек виртуальной машины. Здесь строка «args:» решает, т.к. без нее драйвер видеокарты обнаружит виртуализацию, но путем подмены наименования оборудования, точнее hv_vendor_id=willitwork, мы снимаем проблему с ошибкой 43, которую может выдать видеодрайвер устройства. Здесь есть номер виртуальной машины в proxmox используемый в качестве имени.

## nano /etc/pve/qemu-server/<vmid>.conf

args: -cpu 'host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=willitwork,kvm=off'
.....
bios: ovmf
.....
hostpci0: 01:00.0,pcie=1
.....
machine: q35

Файл настроек виртуальной машины для ПК в статье
args: -cpu 'host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=willitwork,kvm=off'
bios: ovmf
boot: dcn
bootdisk: sata0
cores: 8
cpu: host
hostpci0: 01:00.0,pcie=1
ide2: local:iso/ru-en_windows_10_1803_x86-x64.iso,media$
machine: q35
memory: 16384
net0: e1000=EA:20:FA:6A:D6:A0,bridge=vmbr0
numa: 0
ostype: win10
sata0: local-lvm:vm-100-disk-0,size=120G
scsihw: virtio-scsi-pci
smbios1: uuid=751edeca-d249-4c0d-9ded-b59d929df0f1
sockets: 1
usb0: host=1-8.4
usb1: host=1-8.3
vmgenid: b75aeb27-3102-458d-8e23-18cd27796dc1


Теперь перезагружаем хост и запускаем виртуальную машину.

3й этап — Через Удаленную видеоконсоль установим Windows и драйвера. В моем случае Windows распознал сперва видео драйвер proxmox для работы через видеоконсоль, потом нашел драйвер для GTX1070, а после обновления через интернет (принудительный поиск драйверов в сети) скачал и установил нужный мне драйвер для игровой видеокарты.

4й этап — Перезапустим Виртуальную машину, переключаем отображение видеопотока на мониторе на разъем видеокарты и… в моем случае все заработало сразу, никаких ошибок 43… При этом рабочий стол определяется как №2.

я попробовал запустить видео Blue-ray — без проблем, задержек и фризов с видеорядом нет, запустил Warhammer online — он завелся и в PvP играть было комфортно, запустил GTA5 у мя выскочила сюжетка, вполне комфортно пострелял. Визуально потерь в производительности нет.

Если нам необходимо пробросить жесткий диск целиком, то в файле настроек виртуальной машины необходимо добавить строку:
ide0: volume=/dev/sda

или
sata0: volume=/dev/sda

Конкретно какой именно sda/sdb/sdc/и т.п. можно уточнить в веб интерфейсе.

image

P.S.

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

00:1f.0 ISA bridge: Intel Corporation Device a305 (rev 10)
00:1f.3 Audio device: Intel Corporation Device a348 (rev 10)
00:1f.4 SMBus: Intel Corporation Device a323 (rev 10)
00:1f.5 Serial bus controller [0c80]: Intel Corporation Device a324 (rev 10)
00:1f.6 Ethernet controller: Intel Corporation Device 15bc (rev 10)

Т.е. звук или через видеокабель на монитор или внешняя звуковая карта. Порты USB пробрасываюся без проблем. К сожалению на текущий момент нерешаемо. Есть вариант удаленного подключения с другого ПК к игровому, через RDP или SPICE. В этом случае все будет нормально

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

UPDATE1:
Несколько замечаний по переферии:
1. Как прокинуть в ВМ клавиатуру с порта PS/2:
сперва вводим комманду в консоли
## dmesg | grep input
Ищем в тексте запись навроде

input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input2

Запоминаем цифру 2 в конце, она может быть и другой. Потом в файл настроек ВМ в строку добавляем:
args: -object 'input-linux,id=kbd,evdev=/dev/input/event2,grab_all=on,repeat=on'
вставляя 2 в конец evdev=/dev/input/event2

Для мыши — аналогично.

2. По USB:
Что касается USB устройств там все проще, устройства прокидываются прямо из веб формы по ID или же целиком можно прокинуть порт. Однако есть нюанс — если Вы по каким-либо причинам не можете как и я прокинуть аудиоустройство в ВМ, т.к. оно содержится в группе с ключевыми контроллерами без которых хост не может полноценно работать, то проброс порта/устройства через USB решает эту проблему, но звук может начать отваливаться через некоторое время работы, шипить/гудеть и прочие… прочее, в то же время на нативной системе все будет замечательно. В этом случае необходимо пробрасывать не порт/устройство, а сам контроллер USB как PCIe устройство по методу указанному в статье. И все резко наладится. Но в то же время через хост после запуска ВМ с такими настройками пробросить другие устройства с этого контроллера больше не получится.

3. Жесткие диски можно пробрасывать как через проброс контроллера как PCIe устройство по методу указанному в статье (не рекомендую пробрасывать контроллер интегрированный в материнскую плату, только подключенные к PCIe), либо напрямую:
заходим в
## cd /dev/disk/by-id
через dir смотрим листинг…
копируем строки вида ata-WDC_WD40EFRX-68WT0N6_WD-WCC4E1АС9SХ9, в которой прописан интерфейс подключения, марка и номер серии жесткого диска. Затем открываем Файл конфигурации ВМ и пишем:
sata1: volume=/dev/disk/by-id/ata-WDC_WD40EFRX-68WT0N6_WD-WCC4E1АС9SХ9
и все работает, при этом учитывайте, что sata0-sata5, т.е. для одной ВМ число подключаемых таким образом дисков, включая виртуальных, не может превышать 6шт.
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 26

    0
    далеко не лучшей материнской плате
    Pro4 у асрока как раз одна из лучших линеек по соотношению цена/фичи. Восьмиядерники на ней, конечно, не поразгоняешь, но восьмиядерники это отдельная тема (как и попытки Intel любой ценой с оговорками вписать потребление восьмиядерника в привычные 95 ватт, чтобы формально не утратить совместимость с существующими платами).
      +1
      Речь шла про питание для топовых многоядерных процессоров, что касается цена/фичи — полностью согласен.
        0
        И судя по всему с IOMMU у asrock проблем по минимуму. А там может быть тупая проблема — видеокарта может быть в одной IOMMU-группе с половиной девайсов, а прокидывать можно только всю группу :)
        0
        никаких ошибок 43…
        А какая комбинация винды и драйверов?
        Меня 43 убила. Наповал. Совсем…
          0
          Windows 10 Pro (1803)
          Версия драйвера — 24.21.13.9924

          Обратите внимание на строку аргументов, без этой строки, честно говоря сам не помню где я взял, у меня тоже не все было гладко. Потом плюнул на видеоконсоль и подключился напрямую, совпало или нет, но заработало
          0
          Довольно интересное решение, сохраню себе. А хакинтоши так работают?

          А по практической части — есть какие-то причины, почему просто не поставить винду и под ней не виртуализировать линукс теми же Hyper-V или VMware? +в зависимости от задач может вообще WSL хватать.
            +2

            В hyper-v usb не пробросить нормальными путями. В гостевом хакинтоше под kvm мне не удалось поставить драйвера нвидии.

              0
              Вы неправы.
              PCI-E USB 3.0 adapter
              Hyper-V discrete device assignment:
              Can Discrete Device Assignment be used to pass a USB device into a VM?

              Although not officially supported, our customers have used Discrete Device Assignment to do this by passing the entire USB3 controller into a VM. As the whole controller is being passed in, each USB device plugged into that controller will also be accessible in the VM. Note that only some USB3 controllers may work, and USB2 controllers cannot be used with Discrete Device Assignment.
            0
            Честно говоря хакинтош еще не пробовал. Нужно тестировать.

            Можно, но у меня на hyper-v перестал устанавливаться линукс и в виртуалках с виндой некорректно работала java, точнее не получалось сконфигурировать связку xwiki+glassfish+oracle 11, возможно пора было сносить систему, но тут заодно решил игровой ПК превратить в дата-сервер, благо корпус позволяет от Fractal'а

              +1
              Будет интересно почитать, если протестируете и напишете.

              Про проблемы понял, сам просто не встречал их за все годы работы на такой конфигурации.
            • НЛО прилетело и опубликовало эту надпись здесь
                +1
                1) Всего оперативной памяти на ПК 64Гб.
                2) У меня корпус — Node Fractal Desine 804, на текущий момент в нем:
                — Samsung SSD 850 EVO 250GB -1шт. (Windows 1607, пока еще не переехал)
                — KINGSTON SA400S37480G -1шт. (Proxmox)
                — ATA WDC WD40EFRX-68W SCSI Disk Device — 4шт. (+ планирую миграцию еще 4х таких же с другого ПК, выполняющего роль мини-сервера)
                — На материнской плате 6 портов SATA + рейд-контроллер на PCIe на 8 портов SATA/SAS
                3) Например:
                — можно сконфигурировать несколько копий Windows для работы, для игр, для работы конкретного приложения, для тестирования работы своего приложения в другой ОС и т.п.
                — появляется возможность бэкапить систему на любую дату и откатываться к ней, конечно если их делать.
                — можно развернуть ресурсоемкое приложение и дать доступ родственнику по RDP для работы с ним, пока ты сам играешь в танчики, или ваяешь видео.
                — получается песочница для тестирования, делаешь копию виртуалки и ставишь туда софт, который может нарушить работу твоего ПК, или потенциально может быть опасен. После тестов — удаляешь файл виртуальной машины без последствий и принимаешь решение использовать его или нет.
                • НЛО прилетело и опубликовало эту надпись здесь
                    0
                    Пока да, потому что мне еще предстоит миграция. После нее удалю систему и наверное попробую продать с тем что бы купить большей емкости.
                0
                Развлекался аналогичными вещами еще в 14 году.
                Спеки были такими:
                CentOS, XenServer 6.2
                Intel Core i5-4570
                ASRock Z87 Pro3
                AMD Radeon R9 280X
                Ну и видосик со всем этим безобразием:
                youtu.be/8vCH-7AeNvg
                  –1
                  А что мешает или не работает используя связку Win10 pro + hyper-v.
                  Как по мне, этот вариант буханка хлеба => троллейбус
                    0
                    в моем случае 10ка почему-то не хочет устанавливать линукс… наверное стоит все снести и заново установить систему, но тут решил поэкспериментировать.
                      0

                      Спасибо за статью — интересно.
                      У меня было такое раньше (win 10 pro 1709) если используется доп виртуализация на virtualbox. После сноса VB (сетевых интересов)и апгрейда сборки win 10 проблема ушла.
                      Для тестов в win 10 pro появилась наконец Windows Sandbox начиная со сборки 18350.

                    0
                    Некоторое время назад баловался тем же на микросервер ген8 c «внешней» 1070 через райзер x16-x1 и отдельным БП. Под esxi стоял xpenology и обычная win10. Проброс видеокарты в винду работал нормально, игрушки игрались, pcie х1 в принципе не было особым бутылочным горлышком. Разве что в ГТА5 ощутимы были тормоза при загрузке текстур.
                      0
                      У меня все равно ошибка 43. (через vnc, но думаю и с физическим монитором будет тоже самое)
                      Читал что есть какой то патчер драйверов, но после танцев с бубнами и успешном патчинге в сейфмоде, все равно ошибка 43.
                      с ati была другая проблема, драйвера встали без проблем но любая попытка запустить что то использующее видеокарту — полное зависание системы.
                        0
                        Аналогичная картина у меня была с Gigabyte Z370m D3M, патчил драйвера, подгружал ROM — без шансов. Как только поменял мать — все завелось как по маслу.
                        На мой взгляд проблема с одной стороны в поддержке VT-x, не везде она есть, с другой стороны
                        1) Run the «dmesg | grep ecap» command.

                        2) On the IOMMU lines, the hexadecimal value after «ecap» indicates whether interrupt remapping is supported. If the last character of this value is an 8, 9, a, b, c, d, e, or an f, interrupt remapping is supported. For example, «ecap 1000» indicates there is no interrupt remapping support. «ecap 10207f» indicates interrupt remapping support, as the last character is an «f».

                        Interrupt remapping will only be enabled if every IOMMU supports it.


                        т.е. связка камень + мать. То что поддержка заявлена в камне еще не гарантирует что без матери это все заведется.
                        0
                        Был когда-то Citrix XenClient — клиентский гипервизор. Ставился на голое железо, имелся GUI.
                        Позволял запускать на ПК несколько виртуалок и синхронизировать виртуалки с корпоративным сервером (поработал дома на ноуте, принёс на работу, диск виртуалки засинхронился с корпорат. сервером, можно эту виртуалку уже на рабочем компе запускать).
                        Жалко, что в 2015 году проект прикрыли — не пользовался спросом у корпоративных пользователей. Хотя для домашних пользователей может быть и зашло бы.
                        Когда я его пробовал, были проблемы с пробросом видеокарты, поэтому не получилось использовать для домашнего компа. Хотя основной функционал нормально работал и без корпоративных функций.
                          0
                          Несколько виртуалок на одной видеокарте будут работать?
                            0
                            Пробросить одну и ту же видеокарту в разные виртуалки можно, но одновременно работать они не смогут, поочередно легко. Если интересует одновременная возможность работы в разных виртуалках на одной проброшенной видеокарте, то нужно брать профессиональную версию. В то же время если использоаать, как и в других системах виртуализации, виртуальную видеокарту, для дисплея, то тут нет проблем, но ее производительность для игр и 3d никакая
                              0
                              Спасибо за подробную инструкцию. Получилось пробросить карту в Win7, правда, сначала материнка не могла запуститься с картой, обновил BIOS — заработала.
                              Ну и, собственно, вопрос по сабжу: а не пробовали пробросить в Ubuntu? У меня экран с видеокарты показывает логотип Ubuntu, но потом гаснет. Т.е. переключается обратно на встроенную видимо. Погуглил — ничего не нашёл.
                                0
                                Не на чем. Рад что получилось )
                                Другие ОС пока не пробовал ставить, т.к. тестирую связку с виндой что бы переехать. Возможно поможет перезапуск proxmox'а после запуска виртуалки с windows, т.к. если запустить одну виртуалку с проброшенным оборудованием, то для хоста оно исчезнет до перезагрузки. Так же невозможна одновременное использование одного и того же проброшенного оборудования на разных одномоментно запущенных виртуальных машинах.

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое