Note
Caso você queira utilizar o WSLg puro, você pode tentar o novo tutorial com o WSLg (Xwayland) ou o tutorial com o WSLg (Wayland).
Nesse tutorial, iremos configurar a interface gráfica no WSL2, e acessá-la utilizando o 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 perfeitamente).
Os componentes-chave que precisamos instalar são o metapackage do desktop que você desejar (GNOME, KDE, Xfce, Budgie, etc) e o tigervnc-standalone-server
.
Para essa configuração irei utilizar Ubuntu (20.04, 22.04 e 24.04 funcionam), 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 exemplo para exemplos.
Então vamos lá. Primeiro, precisamos do WSL2 instalado e funcionando.
Warning
O WSLg pode não funcionar da maneira esperada, uma vez que os seus sockets Wayland serão desabilitados para todos, e nem todo aplicativo consegue funcionar corretamente dessa maneira.
Antes de colocar a mão na massa, vamos nos certificar de que tudo está atualizado.
sudo apt update
sudo apt upgrade
Você também precisa verificar se o arquivo /etc/wsl.conf
tem as seguintes linhas:
[boot]
systemd=true
Caso não tenha, crie/edite este arquivo, adicione essas linhas e reinicie o WSL (por exemplo, usando wsl.exe --shutdown
, e reabrindo o terminal da sua distribuição).
Agora sim, estamos prontos para começar.
-
Primeiro você seleciona o metapackage do seu ambiente desktop favorito. Aqui está uma lista dos metapackages mais comuns:
Distribuição Ambiente Desktop Metapackage Ubuntu Budgie ubuntu-budgie-desktop
GNOME ubuntu-desktop
KDE kubuntu-desktop
Kylin ubuntukylin-desktop
LXDE lubuntu-desktop
MATE ubuntu-mate-desktop
Studio ubuntustudio-desktop
Unity ubuntu-unity-desktop
Xfce xubuntu-desktop
Ubuntu/Debian Cinnamon task-cinnamon-desktop
GNOME task-gnome-desktop
GNOME Flashback task-gnome-flashback-desktop
KDE Plasma task-kde-desktop
LXDE task-lxde-desktop
LXQt task-lxqt-desktop
MATE task-mate-desktop
Xfce task-xfce-desktop
-
Uma vez escolhido o metapackage, vamos instalá-lo. Por exemplo, se você escolheu o
ubuntu-desktop
, o comando será:sudo apt install \ `[ ! -z "$(apt-cache search ^acpi-support$)" ] && echo "acpi-support-"` \ tigervnc-standalone-server \ ubuntu-desktop
Isso irá instalar o
ubuntu-desktop
e otigervnc-standalone-server
, mas excluirá oacpi-support
, caso seja incluído como dependência. Isto porque caso seja instalado, irá praticamente inutilizar a sua distribuição (detalhes em microsoft/WSL#10059), então o comando faz o apt não instalar esse pacote.A instalação irá demorar um pouco, então seja paciente.
-
Caso esteja utilizando o Ubuntu, você deve querer instalar o
snap-store
. Mas se não precisa da loja de aplicativos, você pode pular esse passo:sudo snap install snap-store
Se você está utilizando o Debian, precisa configurar o locale (no Ubuntu isso não é necessário):
echo "LANG=en_US.UTF-8" | sudo tee -a /etc/default/locale
-
Agora que temos tudo instalado, precisamos ajustar o diretório
/tmp/.X11-unix/
, porque é montado como somente leitura por padrão. Criaremos uma nova unit do systemd:sudo systemctl edit --full --force wslg-fix.service
-
Cole o código abaixo no editor:
[Service] Type=oneshot ExecStart=-/usr/bin/umount /tmp/.X11-unix ExecStart=/usr/bin/rm -rf /tmp/.X11-unix ExecStart=/usr/bin/mkdir /tmp/.X11-unix ExecStart=/usr/bin/chmod 1777 /tmp/.X11-unix ExecStart=/usr/bin/ln -s /mnt/wslg/.X11-unix/X0 /tmp/.X11-unix/X0 [Install] WantedBy=multi-user.target
-
Saia do editor salvando as alterações do arquivo.
-
Vamos habilitar o
wslg-fix.service
:sudo systemctl enable wslg-fix.service
-
Também precisamos remover todas as referências ao Wayland, porque se não, alguns aplicativos (
gnome-terminal
, por exemplo) abrirão fora do desktop shell. Vamos editar o serviço[email protected]
:sudo systemctl edit [email protected]
-
Cole o código abaixo no editor:
[Service] ExecStartPost=-/usr/bin/rm -f /run/user/%i/wayland-0 /run/user/%i/wayland-0.lock
Warning
Atente às instruções que aparecem no editor sobre o local correto do cursor no texto antes de colar. Se você colar o código no local errado, o código será descartado.
- Reinicie o WSL usando
wsl.exe --shutdown
, e então reabra o terminal da sua distribuição novamente.
Important
No Debian, o usuário do GDM é Debian-gdm
, então você precisa substituir gdm
por Debian-gdm
nos comandos abaixo.
-
Em algumas distribuições, o diretório
/var/lib/gdm3/
tem um owner incorreto, então vamos corrigir isso antes de definir as senhas do VNC Server:sudo chown gdm:gdm /var/lib/gdm3/
-
Nessa configuração, cada usuário tem uma senha do VNC diferente. Então você precisa configurar ao menos três senhas, uma para o usuário atual, uma para o root e uma para o GDM, que irá apresentar a tela de login. Se você não configurar a senha, não será capaz de acessar a tela de login, ou o desktop do usuário. Primeiro, vamos configurar a senha do VNC para o usuário atual:
vncpasswd
-
Agora, vamos configurar a senha do VNC do root (necessária se você utilizar o LightDM ao invés do GDM):
sudo -H vncpasswd
-
Finalmente, vamos configurar a senha do VNC para o GDM (pule esse passo se você não usa o GDM):
sudo -H -u gdm vncpasswd
Você pode repetir o processo para outros usuários existentes.
Por padrão, o display manager pode chamar várias instâncias do Xorg
, uma para cada sessão de usuário, incluindo a tela de login, exibida pelo GDM. Então iremos substituir o script Xorg
por uma nova versão que chama o Xvnc
ao invés do Xorg
clássico. Éssa é a verdadeira mágica que estamos tentando fazer.
-
Primeiro, vamos fazer um backup do script
Xorg
original.sudo mv /usr/bin/Xorg /usr/bin/Xorg.original
-
Agora, criamos um novo script
Xorg
.sudo nano /usr/bin/Xorg.Xvnc
-
Cole o código abaixo no editor:
#!/bin/bash for arg do shift case $arg in # Xvnc nao suporta o argumento vtxx, entao vamos converter para ttyxx vt*) set -- "$@" "${arg//vt/tty}" ;; # -keeptty nao e suportado pelo Xvnc -keeptty) ;; # -novtswitch nao e suportado pelo Xvnc -novtswitch) ;; # outros argumentos permanecem intactos *) set -- "$@" "$arg" ;; esac done # Encontrar um numero de display disponivel for displayNumber in $(seq 1 100) do [ ! -e /tmp/.X11-unix/X$displayNumber ] && break done # Aqui voce pode adequar ou adicionar as opcoes de acordo com as suas necessidades command=("/usr/bin/Xvnc" ":${displayNumber}" "-geometry" "1024x768" "-rfbport" "$((5900 + $displayNumber))" "-rfbauth" "${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 modificá-la para outra que satisfaça suas necessidades (1366x768, 1920x1080, etc). Você também pode alterar a opção
-rfbauth
para apontar para um local fixo ao invés da home do usuário atual, para não precisar ter uma senha para cada usuário. -
Finalmente, definimos as permissões corretas para o arquivo e criamos um um link para ele:
sudo chmod 0755 /usr/bin/Xorg.Xvnc sudo ln -sf Xorg.Xvnc /usr/bin/Xorg
Warning
Às vezes, atualizações do sistema substituem o link Xorg
com a versão original. Basta repetir esse passo se isso ocorrer, e o Xvnc
voltará a funcionar como substituição do Xorg
.
Agora você tem tudo pronto para começar. Primeiro finalize o WSL:
wsl.exe --shutdown
Então reabra o terminal da sua distribuição.
Fazer isso é como dar boot no Linux novamente, e o GDM irá inicializar automaticamente, e irá criar uma instância de Xorg
para mostrar a interface de login. Mudamos esse processo para fazê-lo criar instâncias de Xvnc
, então podemos acessá-las. A primeira instância abrirá a porta 5901, a segunda instância abrirá a porta 5902, e assim por diante.
Depois de um tempo (geralmente alguns segundos, mas pode demorar mais se você não tiver um SSD), você pode testar se está funcionando corretamente. Use seu VNC Viewer favorito para conectar no localhost porta 5901 (localhost:5901
). Use a senha do VNC definida para o usuário gdm
(ou Debian-gdm
, se está utilizando o Debian). A tela de login deve aparecer.
Depois de fazer o login, a tela ficará em branco e eventualmente fechará automaticamente. Isso é porque uma nova instância do Xvnc
foi criada para o desktop do usuário, abrindo a porta 5902. Conecte-se a essa porta agora. O desktop do usuário logado deve aparecer. Quando você deslogar, a tela da porta 5901 mostrará a interface de login novamente. Isso se aplica ao GDM (que é o caso se você instalou o Ubuntu Desktop). Você pode mudar esse comportamento alterando o arquivo de configuração dessa forma:
-
sudo nano /etc/gdm3/custom.conf
-
Descomente e edite as seguintes linhas:
AutomaticLoginEnable=true AutomaticLogin=[seu username sem os colchetes]
Se você está utilizando o LightDM, a tela de desktop aparecerá na porta 5901, então não há necessidade de conectar na porta 5902.
Uma coisa importante é: uma vez que você inicializa sua instância de WSL, você não pode simplesmente desligá-la do nada. Você deve realizar um desligamento padrão do Linux. Você pode utilizar uma das alternativas abaixo:
- Opção de Desligar no menu da interface gráfica
sudo poweroff
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 tenha cuidado.
- 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).
-
Caso não funcione de primeira, tente checar os logs do
journalctl
:journalctl -b -t /usr/lib/gdm3/gdm-x-session -t /usr/bin/Xorg --no-pager
Se você está utilizando o Debian, então o comando é:
journalctl -b -t /usr/libexec/gdm-x-session -t /usr/bin/Xorg --no-pager
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. -
Você deve verificar se o script customizado
Xorg
não foi substituído pela versão padrão dele. Se foi o caso, basta repetir os passos da seção Substituindo o Xorg padrão pelo Xvnc. -
Verifique se o
Xorg
é seu display server padrão, nãoXephyr
ouWayland
. Caso não seja, você precisa mudar o display server padrão para oXorg
. -
Se você está utilizando o LightDM, você também precisa verificar os logs em
/var/log/lightdm
(você vai precisar utilizar osudo
para ler os arquivos nesse diretório). A saída doXvnc
estará no arquivo/var/log/lightdm/x-0.log
. -
Se você pode se conectar às portas 590XX, mas aparece um erro como
Authentication failure: No password configured for VNC Auth
, está faltando o arquivo$HOME/.vnc/passwd
está faltando para aquele usuário em particular (na porta 5901, o usuário égdm
). Tente repetir os passos descritos na seção Criando as senhas do VNC Server e tente se conectar novamente. -
Caso ainda não funcione, você pode tentar reiniciar o WSL com
wsl.exe --shutdown
(não se esqueça de salvar tudo o que não foi salvo antes, porque o WSL será desligado completamente), e então reabra o terminal da sua distribuição e repita os passos da seção Acessando a tela do VNC.
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
- hdhnl
- MrRendroc
Olá, @thiagozucarini. Essa é a mensagem para você criar uma segunda senha para o VNC, e quem utilizá-la conseguirá apenas ver a tela, não conseguirá mexer em nada. A segunda senha é opcional, você pode escolher tê-la ou não. No contexto do WSL, creio que não faz sentido você ter essa segunda senha. No meu setup, eu escolho N.