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!