Пара слов про VFIO и EFI
В предыдущем посте на тему я довольно пространно описывал, как решить проблемы арбитрации VGA, патчил ядро и т.д. и т.п. Надо сказать, что при использовании Windows 8/8.1 (и возможно Windows Vista/7, если удастся поставить ее в режиме EFI – мне не удалось) эту проблему можно обойти. Смысл в том, что при загрузке в режиме EFI, интерфейс VGA вообще не используется. Как достичь такого эффекта? Довольно просто.
Во-первых, нужен EFI-образ загрузки для qemu (по привычке чуть не назвал его биосом). Взять готовую сборку можно, например, здесь (нужен edk2.git-ovmf-x64-*.noarch.rpm). Если берете сборку по ссылке, из rpm нужен только файл OVMF-pure-efi.fd – его надо распаковать в удобное место (например в /opt/ или /usr/local/lib или даже в /root). Получив вожделенный образ, его можно использовать вместо биоса, задавая опцию следующего вида:
-drive if=pflash,format=raw,readonly,file=/path/to/OVMF-pure-efi.fd
вместо опции -bios ...
. Здесь я злонамеренно опускаю подробности о сохранении настроек EFI – они есть, например, здесь – поскольку в типичном случае это попросту не нужно. Во-вторых, придется отказаться от нового q35 – он пока не особо дружит с OVMF-загрузчиком. Соответственно диски цепляются тоже “по-старинке”, одной опцией drive без подключения к шине контроллера. Графические (и любые другие PCI/PCIe устройства) пробрасываются без дополнительных опций в режиме vfio-pci (впрочем в случае карт NVidia может понадобиться x-vga=on) В результате конфиг может выглядеть примерно следующим образом:
qemu-system-x86_64 -enable-kvm -m 3000 -cpu host
-smp 6,sockets=1,cores=6,threads=1
-drive if=pflash,format=raw,readonly,file=/root/OVMF-pure-efi.fd
-drive file=/home/libvirt/Windows-kvm-efi.img,format=raw,media=disk
-drive file=/home/libvirt/Windows-2.img,format=raw,media=disk
-drive file=/home/dist/Windows8.1.iso,format=raw,media=cdrom
-device vfio-pci,host=01:00.0
-device vfio-pci,host=01:00.1
-net nic -net bridge,br=xenbr0
-spice port=5900,addr=127.0.0.1,disable-ticketing
-monitor telnet:127.0.0.1:12997,server,nowait,ipv4
-rtc base=localtime
Надо иметь ввиду, что беспроблемно пробрасываются только радеоны. В “зеленом лагере” (i.e. NVidia) новые драйвера (с 337.88) отключаются, если обнаруживают, что выполняются в виртуализованном окружении. Их, конечно, можно обмануть. Но это выходит за рамки заметки.
Ссылки по теме: VFIO tips and tricks: Primary graphics assignment without VGA VFIO tips and tricks: VFIO+VGA FAQ