Como Redimensionar o Guest à Janela no KVM com Virt-Manager

Esse artigo trata da configuração do Guest ao utilizar o KVM com virtualizador, para que seja possível redimensionar automaticamente o Guest à janela na qual está sendo exibido.

[ Hits: 8.633 ]

Por: Marcio Starke em 12/08/2019


Configuração



Configurando o Debian com Xfce e o Slackware com KDE, para redimensionar à janela utilizando o KVM.

Quando se utiliza um virtualizador em uma estação de trabalho, é desejável que o Guest, ao executar em modo gráfico, adapte sua resolução à janela que ele está sendo visualizado. Ao utilizar o KVM como virtualizador, geralmente se usa em conjunto com a "libvirt" e o Virt-Manager, gerenciador gráfico das máquinas virtuais.

O Virt-Manager possui um visualizador embutido capaz de utilizar o SPICE para apresentar o console gráfico. SPICE é o acrônimo para Simple Protocol for Independent Computing Environments e é um sistema construído para ambientes virtuais que permite ao usuário interagir graficamente com desktop virtual, incluindo o compartilhamento da Área de Transferência e de arquivos.

Primeiramente, para o redimensionamento funcionar com o Virt-Manager, é necessário utilizar o driver de vídeo QXL, ter o dispositivos e o canal do SPICE configurados no hardware da máquina virtual, ter o spice-vdagent executando no Guest e marcar a opção "Redimensionar automaticamente a VM com a Janel"a no Menu "Ver" durante a execução do Guest.

As instruções aqui foram realizadas utilizando o Xfce no Debian Buster (10) e o KDE/Xfce no Slackware.

No Debian Buster (10), instale o spice-vdagent no Guest com o seguinte comando:

# apt install spice-vdagent

O driver QXL exige que cada gerenciador de janelas aplique suas novas resoluções quando a janela é redimensionada[1]. No GNOME (testado no Ubuntu) e no KDE (testado no openSUSE) esse redimensionamento acontece sem problemas. Mas no Xfce, não.

O driver informa o Guest da modificação por meio de um evento no dispositivo de vídeo, que pode ser verificado pelo comando:

udevadm monitor

O spice-vdagent é necessário para iniciar completamente o driver [2].

Assim sendo, é possível utilizar o "udev" para redimensionar à janela, se utilizarmos algum comando que execute essa função. Mas antes, é necessário perceber que o "udev" não pode executar comandos longos (no tempo), pois há um bloqueio que ocorre (um pouco mais complicado que isso) [3], sendo que nem todos os eventos serão tratados caso o script demore.

Para evitar isso, será utilizado o utilitário "at" para lançar o comando de redimensionamento.

Assim, cria-se um arquivo de nome "/etc/udev/rules.d/20-monitor.rules" com o seguinte conteúdo:

ACTION=="change", SUBSYSTEM=="drm", ENV{DEVNAME}=="/dev/dri/card0", RUN+="/etc/udev/monitors.sh"

Obs.: note o uso do "+" logo após o RUN, significando um append.

Com isso, agora é necessário criar o "/etc/udev/monitors.sh" com o seguinte conteúdo:

#!/bin/bash
echo /etc/udev/monitors-run.sh | at now

Note o uso do "at", logo, é necessário instalá-lo. Para diminuir as dependências, instale-o utilizando a diretiva "--no-install-recommends":

# apt install --no-install-recommends at

Deve-se, por fim, criar o arquivo em "/etc/udev/monitors-run.sh", com o seguinte conteúdo:

#!/bin/bash
set +e
export DISPLAY=":0.0"
USER=$(loginctl --no-legend --no-pager list-users | head -1 | awk '{ print $2}')
export XAUTHORITY="/home/${USER}/.Xauthority"
sleep 1
if [ $USER ]; then
     xrandr --output Virtual-0 --auto
fi
set -e
exit 0

O comando utilizado para o redimensionamento é o:

# xrandr --output Virtual-0 --auto

... mas somente é executado se houver algum usuário logado para evitar erros durante o início e a finalização do Guest. Também é necessário um usuário logado para se obter as credenciais do servidor X.

Também é necessário alterar as permissões dos scripts para executável:

# chmod 755 /etc/udev/monitors*.sh

Com tudo isso ajustado, faz-se o recarregamento das regras do "udev" com o comando:

# udevadm control --reload-rules

Para testar, basta redimensionar a janela e verificar o funcionamento. Note que esse script pode não ser executado no primeiro redimensionamento, no caso do Xfce.

Também fiz o mesmo experimento no Slackware (current) com o KDE (sabe-se lá porque não funcionou aqui) e com o Xfce, nos quais o redimensionamento não funcionou logo na instalação. Colocarei aqui os passos para fazê-lo funcionar, mas sem maiores explicações.

Fazer o download do sbotools a partir do site do SlackBuilds. Utilizei o sbotools para facilitar a instalação das dependências.

Instalar o sbotools:

tar xfv sbotools.tar.gz
mv sbotools-2.7.tar.gz sbotools
cd sbotools
sudo ./sbotools.SlackBuild

Atualizar a base de dados do sbotools:

# sbosnap fetch
# sbosnap update

Instalar o QXL e o spice-vdagent (não é preciso configurações adicionais):

# sboinstall spice-vdagent
# sboinstall xf86-video-qxl

Comentar no "/etc/lilo.conf" as entradas do vga e executar o lilo. Alguma erro impede o sistema de iniciar se essa entrada estiver presente no "lilo.conf" e se utiliza o drive QXL.

Seguir os mesmos passos do Debian com o Xfce, somente comentando no "script monitors-run.sh" a linha que iniciar com "USER=" e adicionar uma outra em seu lugar com o seguinte conteúdo:

USER=nomedousuario

... substituindo o "nomedousuario" pelo seu usuário. O Slackware não possui esse comando por fazer parte do systemd.

Referências


E por hoje é só, pessoal!

   

Páginas do artigo
   1. Configuração
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

HOWTO - Usando PSP no Gentoo Linux

Configurando Nocat + Radius modo passive

coLinux - Linux dentro do Windows

Configurando o CACIC (parte 4)

Slackpkg, uma ótima ferramenta para Slackware

  
Comentários
[1] Comentário enviado por Bequimao.de em 04/09/2019 - 04:19h

O QXL não é o driver único que funciona no Virt-Manager. Prefiro o Virtio e sempre escolho a opção "Aceleração 3D".

Nunca precisei configurar units do systemd ou udev. É suficiente no KDE Plasma configurar a resolução em System Settings -> Configuração da Tela e Monitor para ter a resolução persistente.

Bequimão

[2] Comentário enviado por mcnd2 em 19/09/2019 - 19:53h

Boa!!!

Funcionou aqui perfeitamente no Guest Debian Buster após a instalação do mesmo.

Parabéns pelo artigo e em poder ajudar a comunidade!

Tmj...

__________________
Linux User #606334 -- Open your mind!

[3] Comentário enviado por mrstarke em 11/02/2022 - 15:27h

Para o Debian 11 alterei a linha 'xrandr --output Virtual-0 --auto' para essas duas linhas abaixo:
DEVICE=$(xrandr | awk '/ connected / {print $1}')
xrandr --output $DEVICE --auto


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts