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'