Пара слов про VFIO и EFI

Опубликовано 7 Ноября, 2014 под тегами Gentoo, kernel, kvm, qemu, vfio, vga passthrough, Windows, Gentoo, kernel, patch

В предыдущем посте на тему я довольно пространно описывал, как решить проблемы арбитрации 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