dma-buf é como se fosse uma tela virtual, onde o convidado pode exibir a imagem como se ele estivesse conectado a um monitor físico. O uso é bem simples: exibir a tela do convidado em uma janela no hospedeiro.
É importante saber que não é necessário utilizar o dma-buf para os convidados. Isso é opcional. No entanto, sem o dma-buf, para poder visualizar a tela do convidado será preciso usar algum protocolo como o VNC ou RDP, que podem não ser suficientes dependendo do tipo de uso que será feito do sistema convidado.
Exemplos: caso o convidado será um servidor sem interface gráfica para codificação de mídia, SSH é o suficiente. Caso ele tenha uma interface gráfica mas os vídeos não são intensos e a latência não é crítica, VNC ou RDP podem ser suficientes. Caso o convidado seja utilizado para CAD ou para jogos, onde as ineficiências dos protocolos remotos podem causar perda de produtividade ou de partidas, dma-buf é a melhor opção.
Há mais de uma interface pela qual é possível utilizar o dma-buf:
- Spice - Utiliza o protocolo Spice para exibir a tela;
- GTK - Cria uma janela GTK, padrão do QEMU;
- VNC - Utiliza o protocolo VNC para exibir a tela;
- Libvirt - Utiliza o Spice também, mas pode ser gerenciado através do virt-manager.
Não há recomendações específicas, mas como as demais opções são protocolos remotos, a interface GTK foi a que se mostrou mais rápida, sendo limitada pelo gerenciador de janelas do hospedeiro: percebeu-se significativa redução no desempenho do convidado ao desativar a composição de tela no hospedeiro (xfwm4). Há vantagens interessantes ao utilizar Spice, como copiar e colar e arrastar e soltar (dependentes de drivers) que podem fazer o Spice ser a melhor opção. O melhor é testar cada uma.
QEMU
Caso se tenha chegado à conclusão de que será necessário utilizar o dma-buf, será preciso construir o QEMU do código fonte. Isso acontece porque o QEMU disponibilizado no Ubuntu 18.04 não possui as configurações necessárias para acelerar o vídeo, nem usando Spice, VNC ou GTK. Nesse caso, só seria possível criar convidados que não utilizam o dma-buf.
Para construir o QEMU capaz de usar dma-buf, é preciso baixar o código fonte e configurá-lo. A partir da versão 2.10 estável já deve ser possível construir o QEMU com as opções necessárias, para os corajosos há o Git, mas é melhor usar a versão 2.12 por ser a versão estável mais recente. Há várias dependências que precisam ser instaladas. No caso de uma instalação limpa do Xubuntu 18.04, as dependências podem ser instaladas através do seguinte comando:
sudo apt install gcc pkg-config zlib1g-dev libgtk-3-dev libgtk-3-dev libsdl2-dev libjpeg-turbo8-dev libbluetooth-dev libsasl2-dev libepoxy-dev libdrm-dev libgbm-dev libspice-server-dev libusb-dev libusb-1.0-0-dev libusbredirhost-dev
São muitos pacotes mesmo. Um exemplo para construir a versão 2.12 do QEMU com as opções necessárias é:
wget -c -t 0 https://download.qemu.org/qemu-2.12.0.tar.xz
$ tar xf qemu-2.12.0.tar.xz
$ cd qemu-2.12.0
$ ./configure --target-list=x86_64-softmmu --audio-drv-list=pa,alsa,sdl
--prefix=$HOME/qemu-2.12-build --enable-opengl --enable-gtk
--enable-sdl --enable-libusb --enable-bluez --enable-kvm --enable-spice
--enable-vnc --enable-vnc-png --enable-vnc-jpeg --enable-vnc-sasl
--enable-membarrier --enable-vhost-net --enable-usb-redir
$ make -j `nproc`
$ make install
Provavelmente será necessário trocar o local de instalação. A opção --enable-membarrier não existe nas versões anteriores à 2.12. Pode ser que o configure falhe por determinadas bibliotecas de desenvolvimentos não estarem instaladas, o componente faltante é especificado na mensagem de erro. Instale a(s) biblioteca(s) faltante(s) e repita o uso do configure.
Uma vez com o QEMU pronto, pode-se configurar o convidado.