Para usar o
dma-buf, é necessário usar o kernel
Linux com a versão mínima 4.16. Com a versão 4.15 a tela não é carregada, impossibilitando visualizar o convidado.
Ainda no hospedeiro
Tendo a versão mínima do kernel Linux e o QEMU construído com GTK e OpenGL (explicado anteriormente), pode-se criar o convidado. Nesse exemplo é criada uma GPU virtual com 128 MB de memória e resolução máxima de 1920x1200 (é necessário ver se a GPU tem esse modo disponível):
uuid
d4253d2e-73d8-11e8-a4b7-cb5f65b15073
sudo sh -c 'echo d4253d2e-73d8-11e8-a4b7-cb5f65b15073 > /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/create'
Com a GPU virtual criada, pode-se iniciar o convidado usando um comando como (adapte conforme suas configurações e caminhos):
sudo qemu-system-x86_64 -m 1280 -enable-kvm -cpu host
-smp cores=2,threads=2 -device vfio-pci,sysfsdev=/sys/bus/pci/devices/0000:00:02.0/d4253d2e-73d8-11e8-a4b7-cb5f65b15073,x-igd-opregion=on,rombar=0,display=on,x-vga=off
-monitor vc -display gtk,gl=on -vga none -serial stdio -hda bionicdma.vdi
-cdrom "xubuntu-18.04-desktop-amd64.iso"
-bios /usr/share/ovmf/OVMF.fd -netdev user,id=net0 -device e1000,netdev=net0
Explicação do comando (não se surpreenda se algumas partes forem iguais à página anterior):
A máquina virtual tem 1280 MB de memória RAM. Usa KVM, a CPU é do mesmo modelo do hospedeiro, foram designadas dois núcleos da CPU, cada um deles com duas threads.
A GPU virtual foi designada com o display=on, ou seja, com dma-buf. A falta da opção igd-opregion=on pode gerar graves problemas de estabilidade no hospedeiro. O modo vga não funciona, então está desligado, rombar=0 porque não há nenhuma ROM a ser utilizada.
O terminal (ele é chamado de monitor, de onde se podem adicionar dispositivos USB ou enviar comandos ao convidado enquanto o convidado está em execução, por exemplo) do QEMU está em um console virtual que pode ser acessado da própria interface (depende da opção -display), foi escolhida a interface GTK para exibir a máquina virtual e a aceleração OpenGL será utilizada na janela GTK, não há uma VGA virtual pois não há necessidade e a porta serial está no stdio (no terminal se aberto por ele).
Uma imagem VDI foi escolhida como HD, uma ISO é usada como CD-ROM e o firmware UEFI do OVMF foi escolhido como o firmware da máquina virtual.
A rede escolhida é do tipo usuário, com o id net0. O controlador Ethernet virtual é um 82540EM Gigabit Ethernet Controller, que usa a netdev com o id net0. Não há a necessidade de redirecionar portas dessa vez, pois não há a necessidade de visualizar a tela com protocolos remotos.
Hospedeiro e convidado juntos, atenção
A inicialização da máquina virtual nesse modo é bastante peculiar. O GRUB2 aparece, mas não na janela da máquina virtual, e sim no terminal! Isso ocorre porque o framebuffer está sendo passado pela porta serial, e no comando do QEMU foi configurado que a porta serial fosse o stdio. Relevando esse fato, o GRUB2 funciona como o GRUB2, permitindo escolher as opções e editá-las.
Uma vez escolhida, a inicialização começa e as mesmas mensagens avisando sobre a inicialização em modo cego aparecem, mas então a janela GTK é inicializada. Devem aparecer algumas mensagens referente ao UEFI e pode surgir uma mensagem de erro da GPU virtual, acusando a ausência do firmware (devido a rombar=0 e x-vga=off), mas o convidado inicia normalmente. Instale o convidado como se fosse um convidado comum e reinicie quando a instalação terminar.
O convidado está pronto.
Não se assustem, é Xubuntu 18.04 mesmo.
Isso funciona com outras distribuições também, como com o openSUSE Tumbleweed:
Pode parecer inacreditável, mas é isso mesmo. Utilizando o dma-buf é mais complicado de deixar o hospedeiro pronto, mas a configuração necessária no convidado Linux é zero.
A configuração opcional no convidado é trocar o driver de vídeo de "modesetting" para "intel", como foi feito no hospedeiro e no convidado sem dma-buf. Inicialmente, deve-se ter certeza de que o driver intel está instalado. No Ubuntu 18.04, para instalá-lo pode se utilizar:
sudo apt install xserver-xorg-video-intel
Então criar/editar o arquivo
/etc/X11/xorg.conf:
sudo nano /etc/X11/xorg.conf
E deixá-lo com o seguinte conteúdo:
Section "Device"
Identifier "Intel Graphics"
Driver "intel"
Option "DRI" "3"
EndSection
Reiniciando a sessão do LightDM altera o modo:
sudo systemctl restart lightdm
Uma vez que foi concluído o uso do convidado, remova a GPU virtual:
sudo sh -c 'echo 1 > /sys/bus/pci/devices/0000:00:02.0/d4253d2e-73d8-11e8-a4b7-cb5f65b15073/remove'