Skip to content

Instantly share code, notes, and snippets.

@tdcosta100
Last active September 3, 2024 14:09
Show Gist options
  • Save tdcosta100/2698ee402c600efe8d4d19f1721d8a64 to your computer and use it in GitHub Desktop.
Save tdcosta100/2698ee402c600efe8d4d19f1721d8a64 to your computer and use it in GitHub Desktop.
Tutorial para utilizar interface gráfica no WSL2/WSLg, substituindo o Xorg pelo Xwayland, permitindo ao WSL trabalhar como se fosse Linux nativo, incluindo tela de login

WSL2 com interface gráfica utilizando WSLg (XWayland)

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.

Instalando os componentes

Instalando a interface gráfica

  1. Primeiro você seleciona o metapackage do seu ambiente desktop favorito. Aqui está uma lista dos metapackages mais comuns:

    DistribuiçãoAmbiente DesktopMetapackage
    UbuntuBudgieubuntu-budgie-desktop (atualmente bastante bugado, não recomendo a instalação)
    GNOMEubuntu-desktop
    KDEkubuntu-desktop
    Kylinubuntukylin-desktop
    LXDElubuntu-desktop
    MATEubuntu-mate-desktop
    Studioubuntustudio-desktop
    Unityubuntu-unity-desktop
    Xfcexubuntu-desktop
    Ubuntu/DebianCinnamontask-cinnamon-desktop
    GNOMEtask-gnome-desktop
    GNOME Flashbacktask-gnome-flashback-desktop
    KDE Plasmatask-kde-desktop
    LXDEtask-lxde-desktop
    LXQttask-lxqt-desktop
    MATEtask-mate-desktop
    Xfcetask-xfce-desktop
  2. 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 o xwayland (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.

  3. 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
    

Configurando o ambiente

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

Criando e modificando serviços

  1. 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
    
  2. 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
    
  3. Saia do editor salvando as alterações do arquivo.

  4. Vamos habilitar o wslg-fix.service:

    sudo systemctl enable wslg-fix.service
    
  5. 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 user-runtime-dir@.service:

    sudo systemctl edit user-runtime-dir@.service
    
  6. 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.

  1. Saia do editor salvando as alterações do arquivo.

  2. 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
    

Substituindo o Xorg padrão pelo Xwayland

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.

  1. Primeiro, vamos fazer um backup do script Xorg original.

    sudo mv /usr/bin/Xorg /usr/bin/Xorg.original
    
  2. Agora, criamos um novo script Xorg.

    sudo nano /usr/bin/Xorg.Xwayland
    
  3. 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).

  4. Saia do editor salvando as alterações do arquivo.

  5. 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.

Configurando a resolução do monitor no GDM e no GNOME

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.

  1. Primeiro, criamos o arquivo no diretório do usuário atual:

    mkdir ~/.config/
    nano ~/.config/monitors.xml
    
  2. 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>
  3. Saia do editor salvando as alterações do arquivo.

  4. 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/
    
  5. 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
    
  6. Reinicie o WSL usando wsl.exe --shutdown, e então reabra o terminal da sua distribuição novamente.

Executando sua distribuição com interface gráfica habilitada

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:

  1. sudo nano /etc/gdm3/custom.conf

  2. Descomente e edite as seguintes linhas:

     AutomaticLoginEnable=true
     AutomaticLogin=[seu username sem os colchetes]
    

Desligando

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.

Solução de problemas

  1. 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.

  2. 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.

  3. Verifique se o Xorg é seu display server padrão, não Xephyr ou Wayland. Caso não seja, você precisa mudar o display server padrão para o Xorg.

  4. Se você está utilizando o LightDM, você também precisa verificar os logs em /var/log/lightdm (você vai precisar utilizar o sudo para ler os arquivos nesse diretório). A saída do Xvnc estará no arquivo /var/log/lightdm/x-0.log.

  5. 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.

Telas de exemplo

GDM

GDM

LightDM (Kubuntu)

LightDM

GNOME

GNOME

KDE (Kubuntu)

KDE

LXDE (Lubuntu)

LXDE

Xfce (Xubuntu)

Xfce

Pessoas que contribuíram

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).

@PhilBorges
Copy link

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.

@tdcosta100
Copy link
Author

Opa, @PhilBorges! Que bom que curtiu! Infelizmente é isso mesmo, essas funcionalidades fazem bastante falta e eu ainda não sei se tem um jeito de resolver. Continuo pesquisando e atualizando sempre que consigo alguma melhoria.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment