Проброс видеокарты в виртуальную машину
Подборка гайдов и личный опыт
Недавно, раздобыв вторую клавиатуру, снова поэкспериментировал с пробросом видеокарты из под Linux в виртуальную машину с Windows 10. Пригодились следующие руководства:
Setting up KVM with GPU passthrough in Debian Buster от nephest
GPU passthrough tutorial от bryansteiner
Complete Single GPU Passthrough от QaidVoid
Performance optimizations for gaming on virtual machines
В этот раз всё заработало как надо, было полное ощущение реального компьютера! Однако, когда провёл benchmarks, результаты оказались весьма противоречивыми. Unigine Valley (с 8x сглаживанием) и SpeedTest от BrowserBench дали почти такие же результаты, как и при обычной работе под Linux (и под Windows и под Linux тесты вёл в броузере Edge). А вот MotionMark от того же BrowserMark показал результаты в разы хуже, да и визуально было видно, как периодически происходит «замерзание» картинки на одном кадре (впрочем, у SpeedTest тоже наблюдалось подобное, но не в таком масштабе).
После того, как я применил советы по переключению governor и CPU pinning из последнего руководства, ситуация несколько улучшилась, но всё равно результаты различались в разы (600-800 fps под виртуалкой и 3200-3600 на хосте).
Также обнаружилась ещё несколько неприятных особенностей, из-за которых я потратил огромное количество времени напрасно. Во-первых, повторный запуск виртуальной машины возможен только после инициализации видеокарты заново. То есть нужно сделать virsh nodedev-reattach, потом снова virsh nodedev-detach. Иначе машина запускается, загружает процессор на 100%, показывает пустой экран, и ничего не происходит, даже на клавиатуру не реагирует. Во-вторых, после virsh nodedev-detach должно пройти несколько секунд, иначе будет тот же пустой экран. Ну и последнее: при загрузке с параметром iommu=on компьютер периодически начинает тормозить, вплоть до того, что еле двигается курсор мыши. Особенно часто это заметно во время запуска игр через wine.
В итоге сделал для запуска такой shell-скрипт:
VIRSH_GPU_VIDEO=pci_0000_03_00_0
sudo modprobe vfio_pci
sudo virsh nodedev-detach $VIRSH_GPU_VIDEO
for file in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do echo $file | sudo tee "performance"; done
sudo chown libvirt-qemu /dev/vfio/16
sleep 5 # без этого ничего не работает
virsh --connect qemu:///system start win10-2
# sudo virsh nodedev-reattach $VIRSH_GPU_VIDEO # это должно делаться после завершения виртуальной машины
Но поэкспериментировав ещё, пришёл к выводу, что при пробросе видеокарты неудобств получается даже больше, чем при dual boot: и основная видеокарта большую часть времени простаивает, а работает только тогда, когда запущена виртуалка, и RAM для игр доступно меньше, и есть необходимость переключать HDMI-кабель из одной видеокарты в другую и обратно, и описанное подтормаживание. В итоге решил, что в большинстве случаев всё же лучше запускать игры через wine/Proton/Lutris (как я и делал раньше), поскольку даже цепочки типа «запустить Steam, из под него запустить Battle.Net, из под него запустить Starcraft» на фоне всего описанного выше кажутся более простым решением.
Кроме того, постепенно осознаю, что на обычном desktop вместо qemu проще использовать Virtualbox. Под него и образы готовые чаще встречаются, и в управлении он легче. Возможно, когда-нибудь сделаю benhcmarking, чтобы понять, есть ли разница в производительности.
Ребята, давайте жить спокойно!
У вас нет прав для отправки сообщений в эту тему.
