Note
Caso você queira utilizar o WSLg de uma forma mais simples, você pode tentar o tutorial com o WSLg (Wayland).
Nesse tutorial, iremos configurar a interface gráfica no WSL2. Nenhum software adicional fora do WSL é necessário (como o VcXsrv ou GWSL). Você vai achar esse tutorial muito parecido com o que substitui o Xorg pelo Xvnc. De fato, é praticamente o mesmo, com algumas poucas mudanças.
Os componentes-chave que precisamos instalar são o metapackage do desktop que você desejar (GNOME, KDE, Xfce, Budgie, etc) e o xwayland
, e depois disso, substituiremos o Xorg padrão por um script que chama o Xwayland em seu lugar.
Para essa configuração irei utilizar Ubuntu 24.04, e irei instalar o GNOME Desktop. Infelizmente versões mais antigas do Ubuntu não possuem algumas coisas fundamentais, então infelizmente não conseguimos reproduzir essa configuração em versões mais antigas (ou pelo menos não totalmente). 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. Porém se você precisa utilizar aplicativos do Wayland nativamente, você pode utilizar o comando export XDG_RUNTIME_DIR=$HOME/runtime-dir
, e então iniciar seu aplicativo WSLg.
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
(atualmente bastante bugado, não recomendo a instalação)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 ubuntu-desktop xwayland
Isso irá instalar o
ubuntu-desktop
e oxwayland
(caso já não seja instalado como dependência do metapackage que você escolheu). 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 ExecStart=/usr/bin/chmod 0777 /mnt/wslg/runtime-dir ExecStart=/usr/bin/chmod 0666 /mnt/wslg/runtime-dir/wayland-0.lock [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.
-
Saia do editor salvando as alterações do arquivo.
-
Agora vamos alterar o target padrão de inicialização, porque se não fizermos isso, a janela gráfica do shell vai aparecer sempre que você inicializar sua distribuição (por exemplo, ao abrir um Terminal da sua distribuição no Windows).
sudo systemctl set-default multi-user.target
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 (caso esteja utilizando o GDM como seu display manager, claro). Então iremos substituir o script Xorg
por uma nova versão que chama o Xwayland
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.Xwayland
-
Cole o código abaixo no editor:
#!/bin/bash for arg do shift case $arg in # Xwayland nao suporta o argumento vtxx, entao vamos converter para ttyxx vt*) set -- "$@" "${arg//vt/tty}" ;; # -keeptty nao e suportado pelo Xwayland -keeptty) ;; # -novtswitch nao e suportado pelo Xwayland -novtswitch) ;; # outros argumentos permanecem intactos *) set -- "$@" "$arg" ;; esac done # Checa se o runtime dir está presente, e cria caso contrário if [ ! -d $HOME/runtime-dir ] then mkdir $HOME/runtime-dir ln -s /mnt/wslg/runtime-dir/wayland-0 /mnt/wslg/runtime-dir/wayland-0.lock $HOME/runtime-dir/ fi # Aponta a variavel XDG_RUNTIME_DIR variable para $HOME/runtime-dir export XDG_RUNTIME_DIR=$HOME/runtime-dir # 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/Xwayland" ":${displayNumber}" "-geometry" "1920x1080" "-fullscreen" "$@") systemd-cat -t /usr/bin/Xorg echo "Starting Xwayland:" "${command[@]}" exec "${command[@]}"
Note a resolução da tela virtual. Você pode modificá-la para outra que satisfaça suas necessidades (1366x768, 3840x2160, etc).
-
Saia do editor salvando as alterações do arquivo.
-
Finalmente, definimos as permissões corretas para o arquivo e criamos um um link para ele:
sudo chmod 0755 /usr/bin/Xorg.Xwayland sudo ln -sf Xorg.Xwayland /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 Xwayland
voltará a funcionar como substituição do Xorg
.
Atualmente, uma coisa bem irritante é a resolução do Xwayland. Mesmo com a opção -geometry
, o GDM e o GNOME não respeitam ela. Felizmente, esse comportamento pode ser alterado criando-se um arquivo monitors.xml
.
-
Primeiro, criamos o arquivo no diretório do usuário atual:
mkdir ~/.config/ nano ~/.config/monitors.xml
-
Cole o código abaixo no editor (aqui ele está configurado para a resolução 1920x1080, então caso necessário, mude para refletir a sua resolução):
<monitors version="2"> <configuration> <logicalmonitor> <x>0</x> <y>0</y> <scale>1</scale> <primary>yes</primary> <monitor> <monitorspec> <connector>XWAYLAND0</connector> <vendor>unknown</vendor> <product>unknown</product> <serial>unknown</serial> </monitorspec> <mode> <width>1920</width> <height>1080</height> <rate>59.963</rate> </mode> </monitor> </logicalmonitor> </configuration> </monitors>
-
Saia do editor salvando as alterações do arquivo.
-
Agora vamos copiar esse arquivo para o diretório home do GDM:
sudo mkdir /var/lib/gdm3/.config/ sudo cp ~/.config/monitors.xml /var/lib/gdm3/.config/
-
Por fim, vamos corrigir as permissões do arquivo monitors.xml do usuário GDM:
sudo chown gdm:gdm /var/lib/gdm3/.config/monitors.xml
-
Reinicie o WSL usando
wsl.exe --shutdown
, e então reabra o terminal da sua distribuição novamente.
Agora você tem tudo pronto para começar. Execute o seguinte comando:
sudo systemctl start graphical.target
Depois de um tempo (geralmente alguns segundos, mas pode demorar mais se você não tiver um SSD), a tela de login deve aparecer.
Depois de fazer o login, o desktop do usuário logado deve aparecer. Quando você deslogar, a tela 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]
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.
-
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
Xwayland
, 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 Xwayland. -
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
. -
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 Executando sua distribuição com interface gráfica habilitada.
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).
Salve! Melhor tutorial que encontrei até agora, e em pt-br!
Senti falta de sincronia do clipboard, a super key ser reconhecida pela GUI e o reconhecimento de múltiplos monitores.