Intel GVT-g: compartilhando a GPU Intel com convidados QEMU/KVM

O artigo tem como objetivo explicar e orientar a respeito da tecnologia Intel GVT-g (iGVT-g), que permite passar a GPU Intel para vários convidados KVM e Xen enquanto mantendo-a disponível para o hospedeiro. O foco está em configurar convidados KVM, os quais eu configurei e uso com sucesso. É descrito o que é a tecnologia iGVT-g e seus possíveis usos, é dada uma explicação das configurações necessárias no hospedeiro para obter um bom desempenho e manter o sistema estável, é explicado como configurar convidados Linux, com foco no Xubuntu 18.04, e Windows 10. Por fim, há resultados de benchmarks comparando o hospedeiro e o convidado usando iGVT-g.

[ Hits: 12.665 ]

Por: FurretUber em 24/07/2018


Preparando o convidado Linux sem dma-buf



Com o hospedeiro preparado e o QEMU construído, pode-se começar a preparação do convidado. A instalação do convidado é feita utilizando uma VGA virtual do QEMU, como QXL, Cirrus or STD. Uma vez com o sistema instalado e configurado, pode-se remover a VGA virtual e utilizar apenas a GPU Intel, acessando o convidado usando SSH, VNC ou RDP. Usar a VGA virtual e a GPU Intel ao mesmo pode causar sérios problemas de estabilidade, inclusive no hospedeiro. Por isso, é melhor utilizar a VGA virtual apenas para instalar o sistema.

Essas etapas ainda ocorrem no hospedeiro

Inicialmente, é preciso criar a GPU virtual que será utilizada por esse convidado. Para isso, deve-se usar um comando echo com o nome que se deseja dar para a GPU virtual. A Intel, no seu guia, usa o comando uuid para gerar os nomes para as GPUs virtuais e, por isso, uuid também é utilizado nesse exemplo. Pode ser necessário instalar o pacote uuid, disponível no Ubuntu 18.04 usando:

sudo apt install uuid

Por exemplo:

uuid
334b65fc-731c-11e8-8325-1ffce6ac7959

Com esse uuid, pode-se criar a GPU virtual usando o seguinte comando, lembrando-se que o endereço PCI pode ser diferente e que o diretório do modo também pode ser diferente, dependendo da opção escolhida:

sudo sh -c 'echo 334b65fc-731c-11e8-8325-1ffce6ac7959 > /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_8/create'

O modo da i915-GVTg_V5_8 cria uma GPU virtual com 64 MB de memória com resolução máxima de 1024x768 nesse exemplo.

Para criar a imagem do HD, pode-se utilizar o seguinte comando:

qemu-img create -f qcow2 bionic.qcow2 10G

create: criar; -f qcow2: formato da imagem QCOW2; o nome da imagem; o tamanho da imagem (nesse caso, 10 GB).

Uma vez com a GPU virtual criada e com o a imagem do HD criada, pode-se iniciar a máquina virtual com QEMU. Um exemplo de comando pode ser visto a seguir (altere o caminho para o QEMU 2.12 que foi construído anteriormente, adaptações serão necessárias para versões anteriores à 2.12):

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/334b65fc-731c-11e8-8325-1ffce6ac7959,rombar=0,x-igd-opregion=on,display=off,x-vga=off
-monitor vc -display gtk -vga std -serial stdio -hda bionic.qcow2
-cdrom "xubuntu-18.04-core-amd64.iso"
-bios /usr/share/ovmf/OVMF.fd -netdev user,id=net0,hostfwd=::59000-:5900 -device e1000,netdev=net0


Explicação da linha de comando:

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=off, ou seja, sem dma-buf. A falta da opção igd-opregion=on pode gerar graves problemas de estabilidade no hospedeiro, mas com versões mais antigas do kernel (de 4.15 para baixo) ela não funciona, sendo necessário removê-la. 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, a VGA virtual foi escolhida como a STD, a porta serial está no stdio (no terminal se aberto por ele).

Uma imagem QCOW2 foi escolhida como HD (pode ser criado com qemu-img), uma ISO é usada como CD-ROM e o firmware UEFI do OVMF foi escolhida como o firmware da máquina virtual.

A rede escolhida é do tipo usuário, com o id net0, em que a porta 59000 do hospedeiro é passada para a 5900 do convidado. Ou seja, ao se conectar na porta 59000 do hospedeiro, a conexão ocorre, na verdade, na porta 5900 do convidado. O controlador Ethernet virtual é um 82540EM Gigabit Ethernet Controller, que usa a netdev com o id net0.

ESSAS ETAPAS DEVEM SER FEITAS NO(S) SISTEMA(S) CONVIDADO(S)

Com aquele comando do QEMU, o convidado é iniciado e é aberta uma janela GTK, onde deve aparecer por alguns segundos o logo do TianoCore e o terminal de onde o comando foi executado deve ficar vazio. Na janela deve aparecer o GRUB2 com as opções para testar sem instalar/instalar o Xubuntu 18.04. Então pode-se instalar o Xubuntu 18.04 normalmente, nesse estágio não há configurações especiais a se fazer.

Quando a instalação terminar, reinicie o convidado e acesse sua conta recém criada. A primeira configuração a se fazer é no GRUB2. Edite o arquivo /etc/default/grub usando:

sudo nano /etc/default/grub

E remova a opção splash da linha. A corrupção na tela usando a VGA virtual e a GPU Intel simultaneamente enquanto o convidado inicializa deixa de existir. Aplique a nova configuração do GRUB2 usando o comando:

sudo update-grub

Para ser possível usar o convidado sem dma-buf e sem a VGA virtual é necessário configurar algum protocolo remoto, como o SSH ou o VNC. Nesse exemplo será utilizado o VNC.

Inicialmente, o pacote x11vnc precisa ser instalado. No Ubuntu 18.04, pode-se utilizar o seguinte comando para instalá-lo:

sudo apt install x11vnc

Então é necessário criar um serviço do systemd que vai permitir que o convidado seja acessado através do protocolo VNC já na tela de login. Na página de ajuda do Ubuntu há uma explicação muito clara de como criá-lo e configurá-lo, as únicas alterações feitas foram desativar a senha e escolher o modo de autenticação do LightDM (o convidado é Xubuntu 18.04, que usa LightDM).

Para iniciar a edição do serviço, use o seguinte comando:

sudo nano /lib/systemd/system/x11vnc.service

Esse é o conteúdo que precisa ser inserido no arquivo:

[Unit]
Description=Start x11vnc at startup.
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth /var/run/lightdm/root/:0 -forever -loop -noxdamage -repeat -rfbport 5900 -shared

[Install]
WantedBy=multi-user.target

Após isso, o systemd precisa ser recarregado, o serviço ativado e iniciado para poder testar o acesso:

sudo systemctl daemon-reload
$ sudo systemctl enable x11vnc.service
$ sudo systemctl start x11vnc.service


Na próxima inicialização, o serviço x11vnc.service iniciará automaticamente já na tela de login. Tente acessar o convidado através de um visualizador VNC e veja se funcionou. TESTE ANTES DE REMOVER A VGA VIRTUAL. Caso não seja possível conectar ao servidor VNC, investigue as causas:

1) Não tenho acesso à porta 5900 do convidado!

Isso pode acontecer quando opções a respeito da rede não são escolhidas no QEMU. Uma alternativa é redirecionar uma porta do hospedeiro para o convidado. Um exemplo de opções que fazem isso é:

-netdev user,id=net0,hostfwd=::59000-:5900 -device e1000,netdev=net0

Existem alternativas mais avançadas de configuração da rede, mas que fogem do escopo do artigo.

2) Adicionei a opção para passar a porta para o convidado mas ainda não tenho acesso!

Se o firewall foi ativado, pode ser que o acesso esteja sendo negado. Libere as portas necessárias no convidado.

3) A porta funciona, mas o servidor VNC não!

O serviço do systemd foi testado com o LightDM. Outros gerenciadores de login precisam de configurações um pouco diferentes.

Uma vez com o servidor VNC funcionando, é necessário trocar o driver de "modesetting" para "intel" também. Em primeiro lugar, veja se o driver intel está instalado. Para instalá-lo no Ubuntu 18.04, use:

sudo apt install xserver-xorg-video-intel

Então crie/edite o arquivo /etc/X11/xorg.conf no convidado também:

sudo nano /etc/X11/xorg.conf

O conteúdo é o mesmo utilizado no hospedeiro, pois é a mesma GPU:

Section "Device"
   Identifier  "Intel Graphics"
   Driver      "intel"
   Option      "DRI"    "3"
EndSection

Enquanto usar o driver intel não é NECESSÁRIO, é EXTREMAMENTE RECOMENDÁVEL. Sem ele, prepare-se para travamentos no hospedeiro durante a inicialização do convidado e mensagens no dmesg do hospedeiro como:

[75756.681054] i915 0000:00:02.0: Resetting rcs0 after gpu hang

Com essa configuração realizada, desligue o convidado, pois a linha de comando do QEMU precisa ser alterada para remover a VGA virtual.

Retornando ao hospedeiro

Uma vez com o servidor VNC configurado e funcionando, deve ser possível utilizar o convidado sem uma VGA virtual. Um exemplo de comando para ser usado no hospedeiro para iniciar o convidado pode ser visto a seguir:

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/334b65fc-731c-11e8-8325-1ffce6ac7959,rombar=0,x-igd-opregion=on,display=off,x-vga=off
-monitor vc -display none -vga none -serial stdio -hda bionic.qcow2
-bios /usr/share/ovmf/OVMF.fd -netdev user,id=net0,hostfwd=::59000-:5900 -device e1000,netdev=net0


As diferenças em relação ao comando anterior são:
  • Não há display;
  • Não há VGA virtual;
  • Não há CD-ROM.

Não vai abrir nenhuma janela e o terminal de onde o comando foi executado, dessa vez, exibirá algumas mensagens:

erro: nenhum modo de vídeo adequado encontrado.
erro: nenhum modo de vídeo adequado encontrado.
Iniciando no modo cego


Por que elas surgem? Porque nenhum modo VGA existe. Tenha paciência enquanto o convidado inicia, pois nada será visível durante a inicialização, exceto essas três mensagens.

Após esperar um tempo, use um visualizador VNC (vinagre, por exemplo). Para instalar no Ubuntu 18.04, use:

sudo apt install vinagre

Para iniciar, execute no terminal:

vinagre

Ou utilize outro visualizador de área de trabalho remota de sua escolha e conecte-se ao localhost na porta 59000 (conforme o exemplo). Se tudo deu certo, a tela de login do LightDM deve ter aparecido e o convidado está pronto.
Uma vez com o convidado desligado, talvez se queira criar uma GPU virtual com mais capacidade, mas a GPU virtual criada anteriormente ainda existe. Para removê-la, se utiliza o seguinte comando:

sudo sh -c 'echo 1 > /sys/bus/pci/devices/0000:00:02.0/334b65fc-731c-11e8-8325-1ffce6ac7959/remove'

Para facilitar a inicialização, pode-se criar um script onde a GPU virtual é adicionada e removida automaticamente, como por exemplo:

#!/bin/bash
sudo sh -c 'echo 334b65fc-731c-11e8-8325-1ffce6ac7959 > /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_8/create'
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/334b65fc-731c-11e8-8325-1ffce6ac7959,rombar=0,x-igd-opregion=on,display=off,x-vga=off
-monitor vc -display none -vga none -serial stdio -hda bionic.qcow2
-bios /usr/share/ovmf/OVMF.fd -netdev user,id=net0,hostfwd=::59000-:5900 -device e1000,netdev=net0
sudo sh -c 'echo 1 > /sys/bus/pci/devices/0000:00:02.0/334b65fc-731c-11e8-8325-1ffce6ac7959/remove'

Página anterior     Próxima página

Páginas do artigo
   1. O que é Intel GVT-g
   2. dma-buf e sua importância
   3. Preparando o convidado Linux sem dma-buf
   4. Preparando o convidado Linux com dma-buf
   5. Preparando o convidado Windows
   6. Observações adicionais, resultados obtidos e referências
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

PSSAV - Simulação de Escalonamento de Processos

Interação entre MLdonkey e Mozilla no Linux

Procurando software para gerenciar armazenamento... Pensou FreeNAS!

RealBasic 2005: Um Visual Basic multi-plataforma!

Qemu e Kqemu no Ubuntu Dapper Drake 6.06 LTS

  
Comentários
[1] Comentário enviado por betin93 em 07/08/2018 - 16:17h

Belo artigo, com um passo a passo fantastíco. Me lembrei da minha luta para compartilhar a minha placa de vídeo pelo KVM com o GPU Passtrough aheuaehaeu.

Evoluir significa enxergar além do horizonte.

[2] Comentário enviado por edps em 19/08/2018 - 11:10h

Também gostei muito deste artigo, a começar por ser bastante detalhado.

Notei também que o openSUSE Leap 15 é uma distribuição onde tudo está OK quanto aos passos iniciais propostos aqui, então, acho que bastará apenas adicionar as entradas sugeridas em /etc/default/grub e instalar o driver xf86-video-intel.

Muchas gracias.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts