Nesse tutorial, iremos configurar a interface gráfica no WSL2 e acessá-la utilizando VNC. Nenhum software adicional fora do WSL é necessário (como o VcXsrv), exceto, claro, um VNC Viewer (RealVNC, TightVNC, TigerVNC, UVNC, etc, todos devem funcionar sem problemas).
Os componentes-chave que precisamos instalar são: tigervnc-standalone-server
e systemd-genie
.
Para essa configuração, irei utilizar o Ubuntu 20.04 LTS (Focal Fossa) e irei instalar o GNOME Desktop. Uma vez que os componentes-chave não são diretamente relacionados ou dependentes do Ubuntu ou do GNOME, você pode utilizar sua distribuição favorita e interface gráfica. Dê uma olhada na seção Telas de exempo para exemplos.
Então vamos lá. Primeiro precisamos ter o WSL2 instalado e funcionando.
Antes de colocar a mão na massa, temos que garantir que tudo esteja atualizado.
sudo apt update
sudo apt upgrade
Se você está utilizando Debian, você também precisa do comando abaixo:
sudo apt install curl wget
Agora sim, estamos prontos para começar.
-
O Ubuntu tem um excelente instalador chamado
tasksel
, porém ele não vem instalado por padrão. Então vamos instalá-lo.sudo apt install tasksel
-
Agora que instalamos, vamos executá-lo.
sudo tasksel
-
Na lista de pacotes, selecione sua interface gráfica favorita. Eu selecionei Ubuntu Desktop. A instalação vai demorar um pouco, então seja paciente.
Muito simples, um comando e pronto.
sudo apt install tigervnc-standalone-server
O systemd-genie é dependente do dotnet-runtime, ele só pode ser instalado manualmente. Siga as instruções de instalação. Os comandos para instalar o dotnet-runtime-5.0 no Ubuntu 20.04 LTS (Focal Fossa) são:
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt update
sudo apt install dotnet-runtime-5.0
Agora podemos instalar o systemd-genie, que é o responsável por transformar o WSL minimalista em uma instância de Linux bem mais completa, com systemd e outras coisas. Isso é necessário para executar o GDM (GNOME Display Manager) e o LightDM adequadamente, e permitindo ao usuário ter uma experiência gráfica completa, com login e tudo mais. Aqui estão as instruções de instalação. Em meados de 06/04/2021, os passos necessários para instalá-lo são (e só posso garantir que irão funcionar no Ubuntu. Para outras distribuições, você deve seguir as instruções de instalação para obter o pacote apropriado para o seu sistema):
sudo apt install apt-transport-https
sudo wget -O /etc/apt/trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-transdebian/apt/wsl-transdebian.gpg
sudo chmod a+r /etc/apt/trusted.gpg.d/wsl-transdebian.gpg
source /etc/os-release
cat << EOF | sudo tee /etc/apt/sources.list.d/wsl-transdebian.list
deb https://arkane-systems.github.io/wsl-transdebian/apt/ $VERSION_CODENAME main
deb-src https://arkane-systems.github.io/wsl-transdebian/apt/ $VERSION_CODENAME main
EOF
sudo apt update
sudo apt install systemd-genie
O processo de instalação finalmente está completo.
-
Nessa configuração, cada usuário tem uma senha de VNC diferente. Então, precisamos configurar pelo menos três senhas: uma para o usuário atual, uma para o usuário root, e uma para o usuário gdm, que é o que irá apresentar a tela de login. Se as senhas não forem configuradas, não será possível acessar a tela de login, ou a área de trabalho do usuário. Então vamos configurar a senha de VNC para o usuário atual:
vncpasswd
-
Agora, vamos configurar a senha de VNC para o usuário root (necessária para o caso de você utilizar o LightDM no lugar do GDM):
sudo -H vncpasswd
-
Por fim, vamos configurar a senha de VNC para o usuário do GDM:
sudo -H -u gdm vncpasswd
Dica: no Debian, o usuário é do GDM é Debian-gdm.
Você pode repetir esse passo para outros usuários existentes.
Por padrão, o display manager cria múltiplas instâncias do XServer, uma para cada sessão de usuário, incluindo a tela de login, que é a sessão do usuário gdm. Portanto, vamos substituir o script Xorg por uma nova versão que chama o Xvnc ao invés do XServer. Esta É a "mágica" que estamos tentando fazer de fato.
-
Primeiro, faremos um backup do script Xorg original.
sudo mv /usr/bin/Xorg /usr/bin/Xorg_old
-
Agora, criamos um novo script Xorg.
sudo nano /usr/bin/Xorg_new
-
Cole o código abaixo no editor (lembre-se, o shell do WSL utiliza CTRL + SHIFT + V para colar, ao invés do tradicional CTRL + V):
#!/bin/bash for arg do shift case $arg in # O Xvnc nao suporta o argumento vtxx. Entao vamos converte-lo para ttyxx vt*) set -- "$@" "${arg//vt/tty}" ;; # -keeptty nao e suportado pelo Xvnc -keeptty) ;; # -novtswitch nao e suportado pelo Xvnc -novtswitch) ;; # outros argumentos ficam intocados *) set -- "$@" "$arg" ;; esac done # Aqui voce pode adicionar ou alterar as opcoes conforme for necessario command=("/usr/bin/Xvnc" "-geometry" "1024x768" "-PasswordFile" "${HOME:-/root}/.vnc/passwd" "$@") systemd-cat -t /usr/bin/Xorg echo "Starting Xvnc:" "${command[@]}" exec "${command[@]}"
Note a resolução da tela virtual. Você pode alterá-la para o que julgar adequado (1366x768, 1920x1080, etc). Você também pode alterar a opção
-PasswordFile
para um caminho fixo ao invés da home do usuário atual, tornando desnecessário ter uma senha de VNC para cada usuário. -
Finalmente, ajustamos as permissões do script.
sudo chmod 0755 /usr/bin/Xorg_new sudo ln -sf Xorg_new /usr/bin/Xorg
Atenção: quando ocorrem atualizações do sistema, o script Xorg pode acabar sendo substituído pela sua versão original. Caso isso ocorra, basta repetir os comandos acima.
Finalmente chegou a hora de fazer tudo funcionar.
genie -s
Fazer isso é como dar boot no Linux novamente, dessa vez com o systemd. Por causa do systemd, o serviço gdm será iniciado automaticamente, e irá criar uma instância do XServer para mostrar a interface de login. Nós mudamos isso para fazê-lo criar instâncias de Xvnc, portanto podemos acessá-las. A primeira instância vai estar disponível na porta 5900, a segunda estará disponível na porta 5901, e assim por diante.
Atenção: caso queira evitar os erros que aparecem durante a inicialização do genie, ou para fazê-lo iniciar mais rápido, dê uma olhada nesta página.
Depois de um tempo (geralmente, cerca de 30 segundos, mas se você não tiver um SSD pode demorar 1 a 2 minutos), podemos testar se está tudo funcionando corretamente. Use seu VNC Viewer favorito para conectar-se ao seu localhost na porta 5900 (localhost:5900). Use a senha de VNC definida para o usuário gdm. A tela de login deve aparecer.
Depois de fazer login, a tela ficará em branco. Isso acontece porque uma nova instância do Xvnc foi criada para para a área de trabalho do usuário, acessível pela porta 5901. Conecte-se a esta tela agora. A área de trabalho do usuário logado deve aparecer. Quando você se deslogar, a tela da porta 5900 deverá mostrar a interface de login novamente. Porém isso se aplica ao GDM (que é o que é instalado junto com o Ubuntu Desktop). Você pode alterar esse comportamento através dos passos abaixo:
-
sudo nano /etc/gdm3/custom.conf
-
Descomente e edite as seguintes linhas:
AutomaticLoginEnable=true AutomaticLogin=[seu username sem os colchetes]
Se você instalou o LightDM, a tela de área de trabalho vai aparecer também na tela da porta 5900, portanto não há necessidade de se conectar à porta 5901.
Uma coisa muito importante é: uma vez que você iniciou os serviços do systemd, você não pode simplesmente parar sua instância de Linux abruptamente. Você deve fazer um desligamento normal de Linux. Você pode utilizar uma das alternativas abaixo:
- Opção Desligar no menu da interface gráfica
sudo init 0
, caso esteja dentro da instância do geniegenie -u
, caso esteja fora da instância do genie
Depois disso, você pode parar a sua instância de WSL com segurança, através do comando wsl --terminate
ou wsl --shutdown
. Não realizar o processo de desligamento poderá corromper sua instância de WSL, portanto seja cuidadoso.
-
O VNC é um protocolo bastante adaptativo, e por padrão utiliza a maior taxa de compressão possível, para otimizar a utilização da rede. Mas no nosso caso, isso apenas desperdiça processamento, uma vez que você está se conectando ao próprio computador (largura de banda "infinita" e ping praticamente zero). Para não utilizar nenhum algoritmo de compressão e assim reduzir o delay, o ideal é forçar seu VNC Viewer a conectar-se utilizando a codificação RAW. O ganho de performance é perceptível, especialmente ao reproduzir vídeos (apesar de a performance não ser grande coisa nesse caso específico).
-
Se você está utilizando Debian, vai precisar executar o seguinte comando para alguns aplicativos funcionarem:
echo "LANG=en_US.UTF-8" | sudo tee -a /etc/default/locale
-
Se não funcionar logo de cara, tente ver os logs do journalctl:
journalctl -t /usr/lib/gdm3/gdm-x-session -t /usr/bin/Xorg
Na saída gerada, você deve conseguir encontrar qual linha de comando foi gerada para o Xvnc, e quais mensagens de erro aparecem. E claro, mesmo que tudo funcione corretamente, ainda assim você pode checar os logs para ver o que está acontecendo, ou para fazer debug.
-
Se você estiver utilizando o LightDM, também precisa checar os logs do diretório /var/log/lightdm (para conseguir usar o comando cat nos arquivos desse diretório, utilize sudo). A saída de log do Xvnc deve ser encontrada no arquivo /var/log/lightdm/x-0.log.
-
Se você consegue se conectar nas portas 59XX, mas recebe uma mensagem de erro do tipo
Authentication failure: No password configured for VNC Auth
, está faltando o arquivo $HOME/.vnc/passwd para o usuário da tela correspondente (na tela da porta 5900, o usuário é o gdm). Tente repetir os passos da seção Criando as senhas do VNC e tente se conectar novamente. -
Se ainda não funciona, tente reiniciar o WSL. Abra um prompt de comando do Windows PowerShell, e execute o seguinte comando (mas antes, não se esqueça de salvar tudo o que estiver aberto no WSL, porque ele será finalizado completamente sem aviso prévio):
PS > wsl --terminate <nome da sua distribuição>
Depois disso, abra o shell da sua distribuição e repita os passos da seção Executando o systemd-genie.
Meu muito obrigado às pessoas abaixo, cujo feedback fez esse tutorial atingir o nível atual de qualidade e completitude (e ficará cada vez mais completo conforme mais feedback for sendo dado).
- nselimis
- rkzdota
- WSL_subreddit_mod
- ptflp
- ROBYER1
- vdevan
- Greasy-Monkey
- siegLoesch
- adamgranthendry
- cerebrate - Criador do
systemd-genie