WSL - Windows Subsystem for Linux
O WSL, ou Windows Subsystem for Linux, permite executar uma distribuição Linux dentro do Windows, direto pelo terminal, de forma rápida e sem a sobrecarga de uma máquina virtual tradicional. Na prática, ele junta o melhor dos dois sistemas operacionais em uma única máquina de desenvolvimento.
Neste guia, você vê por que o WSL faz sentido para quem programa, quais são os requisitos, como instalar o WSL 2 com o Ubuntu e como deixar o .NET, o VS Code e o terminal prontos para o dia a dia.
Por que usar o WSL no desenvolvimento
O Linux sempre foi conhecido pelo ótimo terminal e por um gerenciador de pacotes muito eficiente. O macOS também cumpre bem esse papel, enquanto o Windows ficou famoso pelos instaladores gráficos.
Enquanto Windows e macOS dominam o mundo dos usuários, nos servidores quem manda é o Linux. Por isso, quem desenvolve no Windows costuma sentir um choque quando precisa fazer tudo pelo terminal.
O problema é que os comandos do Windows são diferentes dos comandos do Linux, incluindo a forma de escrever caminhos. Então, na hora de preparar a aplicação para o deploy em um servidor Linux, não tem jeito: é preciso estudar o sistema operacional.
O fim do dual boot
Durante muito tempo, a saída foi manter dois sistemas instalados. Em paralelo ao Windows e ao Mac, o autor deste artigo chegou a adotar um dual boot entre Windows e Ubuntu, principalmente por conta do Docker.
Afinal, ferramentas como Office, Adobe e Camtasia não estão disponíveis no Linux. Por outro lado, programar no Ubuntu é muito agradável, porque o terminal tem tudo o que um dev precisa e há muito conteúdo na internet sobre ele.
Com o WSL, esse vai e vem acabou. Você não precisa mais reiniciar a máquina para abrir o Photoshop, já que o Linux passa a rodar dentro do próprio Windows.
O que o WSL entrega na prática
Com o WSL instalado, você tem um subsistema Linux, como o Ubuntu, rodando junto com o Windows. Assim, pela linha de comando, você acessa tanto o sistema de arquivos do Windows quanto o do Linux, incluindo todos os comandos Unix.
Segundo a documentação oficial do WSL, você usa aplicativos, utilitários e ferramentas de linha de comando do Linux diretamente no Windows, sem modificação. Além disso, não há a configuração de uma máquina virtual tradicional nem a necessidade de um dual boot.
Esse movimento aproxima o Windows do padrão Unix que macOS e Linux já usam nos terminais. Com isso, o Windows ganha força como sistema operacional para desenvolvedores, já que reúne o melhor dos dois mundos sem custo extra.
WSL 1 e WSL 2: qual a diferença
Existem duas versões do subsistema, e este guia foca no WSL 2. A primeira versão usava uma camada de tradução de chamadas de sistema criada pela equipe da Microsoft.
O WSL 2, por sua vez, executa um kernel Linux real dentro de uma máquina virtual leve e gerenciada. Desse modo, ele oferece compatibilidade completa com as chamadas de sistema do Linux.
A Microsoft compila esse kernel a partir do branch estável mais recente do kernel.org e o distribui por meio de atualizações. Portanto, você recebe correções de segurança sem gerenciar nada por conta própria.
Na comparação oficial, operações pesadas de arquivo, como git clone, npm install e apt update, ficam visivelmente mais rápidas no WSL 2. Ainda assim, o ganho real depende de como cada aplicação interage com o sistema de arquivos.
A compatibilidade completa também abre espaço para ferramentas que não funcionavam bem antes, como o Docker. Se esse é o seu caso, o artigo sobre Docker: instalação, configuração e primeiros passos complementa este guia.
Por outro lado, o WSL 1 ainda tem vantagem quando os arquivos do projeto precisam ficar no sistema de arquivos do Windows. Nesse cenário, o acesso entre os dois sistemas é mais rápido na versão 1.
Requisitos para instalar o WSL 2
Quando este artigo foi escrito originalmente, o requisito para o WSL 2 era o Windows 10 na versão 2004 ou superior, com o build 19041 ou superior. Em suma, você precisa manter o Windows atualizado.
Windows 10, updated to version 2004, Build 19041
Hoje, a página de instalação manual da Microsoft detalha melhor esse ponto. Em sistemas x64, o WSL 2 funciona a partir da versão 1903, build 18362.1049, enquanto sistemas ARM64 exigem a versão 2004, build 19041.
Para conferir a sua versão, pressione a tecla do Windows mais R, digite winver e confirme. Além disso, a virtualização precisa estar habilitada no computador, porque o WSL 2 depende dela.
Política de execução do PowerShell
Talvez você também precise alterar a política de execução de scripts do PowerShell. Para isso, rode o comando abaixo em um PowerShell aberto como administrador.
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
Esse passo varia de acordo com cada conta. Mesmo assim, se quiser já ficar preparado, execute o comando antes de prosseguir.
Instalando o WSL com um único comando
Na primeira versão deste artigo, a instalação em uma linha exigia o build 20262 do Windows 10 ou superior. Atualmente, a documentação oficial indica o comando para o Windows 10 versão 2004, build 19041 ou superior, e para o Windows 11.
Para usar esse caminho, abra o PowerShell como administrador e execute o comando a seguir. Em seguida, reinicie a máquina.
wsl --install
O comando habilita os recursos necessários e instala o Ubuntu como distribuição padrão. Se preferir outra, liste as opções disponíveis e informe o nome desejado.
wsl --list --online
wsl --install -d Debian
Depois da reinicialização, o sistema pede para você criar o usuário e a senha do Ubuntu ou da distribuição escolhida. Se tudo correr bem, pule direto para a seção sobre a instalação do .NET dentro do WSL.
Habilitando o WSL manualmente
Se o comando único não funcionar no seu build, siga o caminho manual. Primeiro, feche o PowerShell ou o Windows Terminal e abra um novo, como administrador.
Então, execute o comando abaixo para habilitar o recurso do Subsistema do Windows para Linux.
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
Agora, habilite os componentes de máquina virtual, também em modo administrador. Esse recurso, chamado Plataforma de Máquina Virtual, é o que permite rodar o WSL 2.
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
Por fim, reinicie a máquina para que as alterações tenham efeito. Em builds mais antigos, a documentação também orienta baixar o pacote de atualização do kernel Linux antes de continuar.
Definindo o WSL 2 como padrão
Caso você já tenha o WSL 1 instalado, abra um terminal após a reinicialização e defina a versão 2 como padrão.
wsl --set-default-version 2
Para listar os subsistemas instalados, use o comando wsl --list. Se esta for a sua primeira instalação, a lista ainda virá vazia.
Também vale conhecer a variação detalhada, que mostra a versão do WSL usada por cada distribuição. Com ela, você confirma se o Ubuntu já está no WSL 2.
wsl --list --verbose
wsl --set-version Ubuntu 2
Instalando o Ubuntu pela Microsoft Store
Com o WSL habilitado, chegou a hora de instalar o Ubuntu como subsistema. Para isso, abra a Microsoft Store pelo menu Iniciar e procure por Ubuntu.
Na página do produto, clique em Obter para fazer o download e a instalação. Existem outras distribuições disponíveis, como Debian, openSUSE e Kali Linux, mas este guia usa o Ubuntu 20.04.
Instalar o Linux dentro do Windows é uma das coisas mais surpreendentes para quem acompanha a plataforma há muitos anos. De fato, poucas mudanças aproximaram tanto os dois mundos.
Executando o Ubuntu no WSL
Após a instalação, um aplicativo chamado Ubuntu fica disponível no Windows. Basta pesquisar por Ubuntu no menu Iniciar.
Na primeira execução, o console pede para você aguardar alguns minutos enquanto descompacta os arquivos. Depois disso, as próximas inicializações levam menos de um segundo.
O setup é simples e pede apenas um usuário e uma senha. Não use espaços nem caracteres especiais no nome de usuário, e guarde essas informações, porque o comando sudo vai pedir a senha mais adiante.
Pronto, isso é tudo o que você precisa para ter o Ubuntu rodando dentro do Windows de forma praticamente invisível.
Usando o WSL no terminal
Agora você acessa o WSL a partir do PowerShell ou do Windows Terminal. Basta abrir um deles e digitar wsl para entrar no Ubuntu.
Se ainda não usa o Windows Terminal, vale conhecer o artigo sobre o Windows Terminal. Ele permite abrir várias abas com PowerShell e distribuições Linux lado a lado.
Para conferir a versão do Ubuntu instalada, use o comando abaixo dentro do WSL.
lsb_release -a
Arquivos do Windows dentro do Linux
O WSL já mapeia as unidades do Windows. Assim, além das pastas padrão do Linux, você também navega pelo seu disco C, que aparece montado em /mnt/c.
cd /mnt/c/Users
ls -la
A Microsoft recomenda, no entanto, guardar os projetos no sistema de arquivos do próprio Linux, como em /home/<usuario>/projects. Dessa forma, você obtém o melhor desempenho quando trabalha pela linha de comando do Linux.
O caminho inverso também funciona. No Explorador de Arquivos, digite \\wsl$ na barra de endereços para ver as distribuições, ou rode explorer.exe . dentro do Ubuntu para abrir a pasta atual.
Comandos do Windows e do Linux juntos
Outra vantagem do WSL é a interoperabilidade entre os comandos dos dois sistemas. Por exemplo, no PowerShell você executa ferramentas Linux prefixando o comando com wsl.
wsl ls -la
dir | wsl grep git
Dentro do Ubuntu, por sua vez, você chama executáveis do Windows informando a extensão do arquivo. Nesse caso, pipes e redirecionamentos funcionam como esperado.
ipconfig.exe | grep IPv4 | cut -d: -f2
notepad.exe "C:\temp\notes.txt"
Instalando o .NET dentro do WSL
Se você instalou o .NET no Windows, ele não vai funcionar dentro do WSL, porque as instalações dos dois sistemas são separadas. Para confirmar, execute dotnet --version no Ubuntu.
Por isso, instale o SDK também no subsistema. Os comandos abaixo registram o repositório de pacotes da Microsoft para o Ubuntu 20.04 e instalam o SDK do .NET Core 3.1.
# registra o repositório de pacotes da Microsoft para o Ubuntu 20.04
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
# instala o SDK
sudo apt-get update
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install dotnet-sdk-3.1
A versão da última linha era a mais recente do SDK quando este artigo foi escrito. Hoje, o .NET Core 3.1 já não recebe suporte, então troque o pacote pela versão que o seu projeto usa.
A documentação do .NET também alerta para não misturar pacotes de feeds diferentes, como o feed da Microsoft e o feed do Ubuntu. Afinal, essa mistura costuma causar conflitos na resolução de versões.
Com tudo instalado, execute dotnet --version para verificar se deu certo e qual versão está em uso.
Certificados HTTPS de desenvolvimento
Por fim, limpe e gere novamente o certificado HTTPS de desenvolvimento que o .NET utiliza. Esse cuidado evita erros de segurança ao executar as aplicações localmente.
dotnet dev-certs https --clean
dotnet dev-certs https --trust
Vale saber que, no Linux, a confiança no certificado depende da distribuição e do navegador. Segundo a documentação do ASP.NET Core, o suporte oficial do --trust cobre Ubuntu e Fedora, e só a partir do .NET 10 o comando executado no WSL também confia no certificado do lado do Windows.
Integrando o WSL ao Visual Studio Code
Por padrão, o Visual Studio Code usa o PowerShell no Windows. Isso significa que ele só enxerga o que está instalado no Windows.
Para trabalhar com o Linux, você precisa de duas coisas: uma extensão e um ajuste de configuração. Se ainda não instalou o editor, o artigo Visual Studio Code: instalação e customização mostra o passo a passo.
Primeiro, abra a aba Extensions e instale a extensão ms-vscode-remote.remote-wsl. Na época do artigo original, ela se chamava Remote WSL e, hoje, aparece no marketplace apenas como WSL.
Essa extensão divide o VS Code em cliente e servidor. A interface roda no Windows, enquanto o código, o Git e as extensões de linguagem rodam na distribuição Linux, onde o .NET está instalado.
Além disso, a extensão adiciona a aba Remote Explorer no menu lateral e um ícone no canto inferior esquerdo. Esse ícone indica em qual ambiente o projeto aberto vai rodar, e você alterna entre Linux e Windows quando quiser.
Também é possível abrir um projeto direto do terminal do Ubuntu. Basta entrar na pasta e executar o comando abaixo.
cd ~/projects/my-api
code .
Lembre-se apenas de que as instalações são separadas. Assim, os softwares do Windows não rodam no Linux, e extensões de depuração ou de linguagem precisam ser instaladas também dentro do WSL.
WSL como terminal padrão do VS Code
Toda vez que você abre um terminal no VS Code, ele usa a opção padrão do sistema, que no Windows é o PowerShell. Então, para tornar o WSL o terminal padrão, edite o arquivo de configurações com CTRL + , e a opção Open Settings JSON.
Na época do artigo original, a configuração era esta:
"terminal.integrated.shell.windows": "C:\\Windows\\System32\\wsl.exe"
As versões atuais do VS Code, porém, marcaram essa chave como obsoleta e passaram a usar perfis de terminal. Nesse caso, você indica o perfil desejado na chave terminal.integrated.defaultProfile.windows, usando o nome exibido no seletor de perfis do terminal.
"terminal.integrated.defaultProfile.windows": "Ubuntu (WSL)"
Turbinando o terminal do WSL com o Powerline
Este passo é totalmente opcional, mas o Powerline deixa o terminal mais bonito. Além disso, ele mostra informações do repositório Git atual direto no prompt.
Fontes do Powerline
O Powerline usa um conjunto de fontes para exibir ícones na tela. Portanto, baixe e instale essas fontes no Windows antes de continuar, a partir do repositório powerline/fonts no GitHub.
Instalação no Ubuntu
Dentro do WSL, instale o Powerline pelo apt-get com o comando abaixo.
sudo apt-get install powerline fonts-powerline
Em seguida, edite o seu profile para carregar o Powerline sempre que o terminal abrir. Para isso, abra o arquivo .bashrc no VS Code.
code ~/.bashrc
Depois, adicione as linhas abaixo ao fim do arquivo e salve.
# carrega o Powerline ao abrir o terminal
if [ -f /usr/share/powerline/bindings/bash/powerline.sh ]; then
source /usr/share/powerline/bindings/bash/powerline.sh
fi
Pronto, agora o Powerline funciona no seu terminal Linux rodando via WSL no Windows.
Conclusão
O WSL acabou com a necessidade de escolher entre Windows e Linux na mesma máquina. Com ele, você mantém as ferramentas do Windows e, ao mesmo tempo, trabalha com o terminal e os pacotes do Linux.
Neste guia, você viu os requisitos, a instalação do WSL 2 com um comando ou pelo caminho manual, o Ubuntu, o .NET, a integração com o VS Code e o Powerline. Desse modo, o ambiente fica muito próximo do servidor Linux onde a aplicação vai rodar.
Se você quer saber como fica o dia a dia de quem programa em C# fora do Windows, leia também é viável programar em C# no Linux.
FAQ
O WSL é uma máquina virtual?
O WSL 2 usa uma máquina virtual leve e gerenciada pelo próprio Windows, mas você não precisa configurá-la. Na prática, a experiência é a de um terminal Linux integrado ao sistema.
Qual versão do Windows preciso para usar o WSL 2?
O comando wsl --install exige o Windows 10 versão 2004, build 19041 ou superior, ou o Windows 11. Pelo caminho manual, sistemas x64 aceitam a versão 1903, build 18362.1049.
O .NET instalado no Windows funciona dentro do WSL?
Não. As instalações são separadas, então você precisa instalar o SDK do .NET também na distribuição Linux.
Onde devo guardar os projetos ao usar o WSL?
Guarde os projetos no sistema de arquivos do Linux, como em /home/<usuario>, quando trabalhar pelo terminal do Ubuntu. Assim, as operações de arquivo ficam mais rápidas.
Posso instalar outra distribuição além do Ubuntu?
Sim. Rode wsl --list --online para ver as opções e wsl --install -d seguido do nome da distribuição para instalá-la.