Добрый день!
Возникло желание сделать себе виртуальную машину с пробросом видеокарты (qemu + kvm).
Ориентирвался в основном на этот гайд:
https://davidyat.es/2016/09/08/gpu-passthrough/
Имеется:
Железо
- cpu: Intel(R) Core(TM) i5-3470S CPU @ 2.90GHz
- одна (!) дискретная видеокарта: GeForce GTX 650 Ti
- материнская плата: Gigabyte Z77-D3H
Софт
- Хост ОС: xubuntu 17.04 (такая же картина была на 16.04)
- В dual-boot'е (grub) - Windows 7
- Qemu 2.8.0
- virsh 2.5.0
- virt-manager 1.3.2
Как готовится хост
Для проброса меняю 4 файла:
/etc/modprobe.d/blacklist.conf: (закоменчиваю / раскоменчиваю строки добавленные в конец файла)
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
/etc/modules: (закоменчиваю / раскоменчиваю строки добавленные в конец файла)
vfio
vfio_iommu_type1
vfio_pci
vhost-net
/etc/initramfs-tools/modules: (закоменчиваю / раскоменчиваю строки добавленные в конец файла)
pci-stub
/etc/default/grub: (меняется параметр GRUB_CMDLINE_LINUX_DEFAULT)
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on pci-stub.ids=10de:11c6,10de:0e0b"
После изменений:
update-initramfs -u
update-grub
и reboot
Система загружается, экран черный (после GRUB'а) доступна по SSH.
Вывод
dmesg | grep pci-stub:
dmesg | grep pci-stub
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.10.0-32-generic root=UUID=584687ef-ebd7-4208-9e79-5ab3dfcf7266 ro quiet splash intel_iommu=on pci-stub.ids=10de:11c6,10de:0e0b vt.handoff=7
[ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-4.10.0-32-generic root=UUID=584687ef-ebd7-4208-9e79-5ab3dfcf7266 ro quiet splash intel_iommu=on pci-stub.ids=10de:11c6,10de:0e0b vt.handoff=7
[ 1.640890] pci-stub: add 10DE:11C6 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[ 1.640901] pci-stub 0000:01:00.0: claimed by stub
[ 1.640908] pci-stub: add 10DE:0E0B sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[ 1.640912] pci-stub 0000:01:00.1: claimed by stub
что в силу наличия "claimed by stub" - вселяет надежду на то, что от хостовой системы карта отвязывается успешно.
Подготовка виртуалки
Виртуалку создавал через virt-manager (gui), из настроек:
- UEFI;
- Проброс PCI устройств 01:00.0 и 01:00.1 также через GUI;
- chipset: i440FX
Помимо этого через
virsh edit было добавлено:
<features>
...
<hyperv>
<vendor_id state='on' value='whatever'/>
</hyperv>
<kvm>
<hidden state='on'/>
</kvm>
</features>
В итоге после перезагрузки, захожу по SSH (нет второго монитора и второй дискретной карты :( ) на хост, запускаю там виртуалку через
virsh start <name>
, что приводит (насколько я могу судить) к crash'у системы (ssh в терминале перестает подавать признаки жизни, хост не пингуется, на хосте есть файлик /var/crash/_usr_bin_qemu-system-x86_64.64055.crash (в котором не могу увидеть причину проблемы)).
Кто может подсказать, что не так? Какие детали я упускаю? Где может быть лог с причиной фейла (и как ее понять из этого лога)?
UPDATE:
На момент написания вопроса еще не занимался встроенным GPU. (Он не завелся из коробки) В итоге после установки интеловских драйверов смог подключить монитор к встроенной видеокарте. Но возник ньюанс: с проброшенной дескретной видеокартой (когда строки раскоменчены) не работает встроенная. Методом тыка определил, что это связанно /etc/modprobe.d/blacklist.conf, если оставить его в первоначаальном виде - то встроенный GPU работает, но в
dmesg | grep pci-stub
остается только 01:00.1 (что я так понимаю звуковая в дискретной видеокарте).
Проброс в виртуалку все также не работает. При чем в этом случае когда я попытался запустить виртуалку я увидел как все сломалось: после ввода команды (virsh start), система повисла (откликался только курсор) - таким образом это несет не так много информации (учитывая, что конфигурация несколько отличается). Быть может не все нужные драйвера в черном списке?