LINUX.ORG.RU

iGPU + dGPU passthrough: чёрный экран после завершения работы в гостевой ос

 , , , ,


1

2

Всем привет!

Пытаюсь добиться возможности играть на винде в игрушки (на госте), при этом иметь возможность максимально прозрачно пользоваться линуксом на хосте

Имеется IOMMU/VT-d совместимое оборудование: RX580 видяха и интеловский проц

Имеется два моника: один воткнут по DVI-D в видяху, второй по VGA в мат. плату

В настройках биоса включена загрузка с IDG (через iGPU)

Дистрибутив: arch, 5.16.4-zen1-1-zen

Пробрасываю видяху с помощью qemu

Содержимое модулей /etc/mkinitcpio.conf

MODULES=(btrfs radeon vfio vfio_iommu_type1 vfio_pci vfio_virqfd vendor-reset)

vendor-reset нужен для rx580, известный амдушный баг, когда видяха блекскринит после завершения гостя и не оживает никаким способом, кроме рестарта хоста

Содержимое /etc/default/grub.cfg

GRUB_CMDLINE_LINUX_DEFAULT=«loglevel=3 intel_iommu=on kvm.ignore_msrs=1 vfio-pci.ids=8086:1901»

ids относится к dGPU, именно поэтому в биосе выставлен iGPU, иначе система застревает на Running early hooks (или как-то так, я прям дословно не помню

При запуске вм всё происходит отлично: dGPU моник отрубается, через несколько секунд подрубается снова и я вижу видну.

Мышь и клава шарится (через Barrier) и поэтому получается одновременно пользоваться и виндой и линуксом, как будто они единая система

И всё идеально, но...

Когда я завершаю работу гостевой системы, то моник на dGPU показывает чёрный экран

И решается это исключительно рестартом иксов (выход из сессии и запуск сессии заново)

Изначально даже этого не было (пришлось повозиться с vendor-reset, так как на 5.15+ ядрах он без бубна не захотел работать), но осталось дожать прям самую малость.

Как и почему и каким образом и что происходит в этих самых иксах, что заставляет второй моник подрубаться без перезагрузки хоста?

Докину дополнительной информации:

IOMMU groups - https://gist.github.com/Aquinary/5a0de919459f2fe45b48a880fc183d69

dmesg | grep «amd» - https://gist.github.com/Aquinary/f964646c90f32bf6f45fcddf5c396c64

journalctl -a (перед запуском вм предварительно очистил журнал и сделал сброс в файл сразу после завершения гостевой системы) - https://gist.github.com/Aquinary/3cb257040ae246d5b40aa48ed860afa3

lspci -vv (после завершения работы с гостевой ос) - https://gist.github.com/Aquinary/9c9a528384a72a157463c16b52a36419

xrandr до запуска вм - https://gist.github.com/Aquinary/77f4916b6dc6fbe0079b358891dafa3a

xrandr после завершения работы с вм - https://gist.github.com/Aquinary/0fbe0718b6784946445ce99f12c27612

/etc/libvirt/hooks/qemu- https://gist.github.com/Aquinary/657f1052edc870a34b0dd6e4e568cb9a

/etc/libvirt/hooks/qemu.d/win10/prepare/begin/start.sh - https://gist.github.com/Aquinary/00cc138324f22426dacc097dc959f785

/etc/libvirt/hooks/qemu.d/win10/release/end/revert.sh - https://gist.github.com/Aquinary/df9eceb9b3fd42c123d34dc99a951aa4

Хуки брал с какого-то гайда по пробросу, слегка подправил под себя, но до конца не уверен, что они правильные.

Так же точно такого же поведения с чёрным экраном я могу добиться без запуска вм путём следующих команд:

virsh nodedev-detach pci_0000_01_00_0
virsh nodedev-reattach pci_0000_01_00_0
sudo sh -c 'echo 0000:01:00.0 > /sys/module/amdgpu/drivers/pci:amdgpu/unbind'

Буду рад любой помощи, любым подсказкам (в том числе и альтернативным способам решения моей задачи), всё и так работает очень и очень хорошо, но вдруг есть какой-то способ сделать это лучше

Серьёзный подход, гитхаб пока лежит, добавь ещё конфиг иксов и их лог, нвидия позволяет держать пустой девайс на случай подключения внешней видеокарты через ThunderBolt, возможно похожий манёвр можно провернуть и с amdgpu

sparks ★★★★
()

в скриптах много лишнего, но да ладно.

непонятно, в чем проблема, - черный экран на пробрасываемой видяхе после хавершения ВМ. А что там должно быть, если не он?

ЗЫ Иксы на лету не умеют подхватывать видяху.

anonymous
()
Ответ на: комментарий от sparks

Конфиги пустые. Там лежат файлики, вроде 10-intel или 20-amdgpu, но они абсолютно пустые /etc/X11/xorg.conf тоже нет

Всё делается через .xprofile - позиционируются моники и т.д.

Не особо понимаю вот эту часть и как она работает: стартует sddm, а из него уже запускаю сессию

Xorg.0.log - https://gist.github.com/Aquinary/08259f5a94f18a5f59bd8f81bb4624de

xrandr - https://gist.github.com/Aquinary/1b750fd40d215fa62133419536e3db3b

В логах иксов напрягает вот эта строка:

[ 322.217] (II) Failed to load module «modesetting» (already loaded, 0)

Она как раз фигурирует в xrandr для видеокарты Видимо, после того, как qemu отдаёт устройство обратно в систему, драйвер amdgpu её успешно подхватывает, но иксы - нет

Я всё это время пробовал найти закономерности, как оно вообще и с чем работает.

  1. Нужно linux-zen или linux-vfio, с дефолтным ядром арча не работает

  2. Изолировать через vfio-pci.ids совершенно противопоказано для задачи, которую я пытаюсь сделать

  3. Амдушные драйвера надо снести. Надо чтобы подтягивались KMS, иначе при попытке сбросить видюху в dmesg сыпет ошибками

  4. Я всё ещё не уверен, что смогу повторить результат уровня «гпу оживает после того, как перезапускается сессия». До этого момента было сделано много всяких телодвижений и конкретно последовательность действий уже не вспомнить

Я пробовал повторить результат на manjaro (выбрал как arch совместимый и как быстро накатываемый, так как проверяя каждую свою «идею» сносил систему, дабы ничего не мешало), но там полно палок в колёса: чтобы собрать то же zen ядро, нужно ждать невозможно долго и я не знаю, что это за ерунда, во всех местах скорость нормальная, торренты, прямые ссылки, всё летает, и один гитхаб гитклонит на 10-20 кб. Класс!

  1. Такое работает только с вм awesome Если использовать тот же гном, то при завершении вм amdgpu назад не подцепляются. Т.е. до запуска вм

Kernel driver in use: amdgpu Kernel modules: amdgpu

Во время запуска

Kernel driver in use: vfio-pci Kernel modules: amdgpu

И, если, в осоме после завершения вм вывод точно такой же, как и до запуска, то в гноме kernel driver in use просто пропадает (собственно, как и всегда пропадает, если поставить амдушный драйвер или использовать не то ядро)

  1. Таки удалось во время тестов на манджаро сделать так, чтобы после завершения вм подрубилась видюха. Но это выглядит очень странно, вряд ли это рабочее решение, но это дало мне понять, что какой-то способ получить изображение на моник есть. Видео: https://www.youtube.com/watch?v=MeZzBEYSPNI

Мобила говна, поэтому качество очень плохое. Словами:

  1. Запускаю комп, захожу в сессию
  2. Запускаю вм, появляется изображение
  3. Отрубаю вм, второй моник молчит
  4. Перезапускаю сессию, моник молчит
  5. Запускаю вм снова, появляется картинка
  6. Завершаю вм, ВНЕЗАПНО второй моник начинает показывать
  7. Запускаю вм снова, изображение глохнет, выбивает в tty
Aquinary
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.