- A estrutura de subsistema do Windows NT é composta por uma camada de conversão de chamadas de API para executar programas de outros sistemas operacionais
- O WSL1 segue essa tradição, atuando como uma camada de tradução leve que converte chamadas do Linux em chamadas do kernel do Windows
- O WSL2 foi migrado para uma VM Linux completa baseada em Hyper-V para resolver problemas de desempenho e passou a executar o kernel Linux real
- O WSL2 oferece maior integração do que uma VM comum com gerenciamento dinâmico de memória, montagem de drives do Windows e integração de GUI via WSLg
- Apesar de limitações como inconveniência no gerenciamento de arquivos e dependência de imagem de disco, é importante a flexibilidade de aproveitar seletivamente os pontos fortes e fracos do WSL1 e WSL2
Conceito de subsistema do Windows NT
- O subsistema (subsystem) do Windows NT significa um conjunto de APIs e camada de conversão de chamadas para executar programas de outros sistemas operacionais
- O NT antigo tinha, entre outros, OS/2 subsystem (OS2SS.EXE) e POSIX subsystem (PSXSS.EXE)
- O CSRSS.EXE é a camada de conversão da API Win32, com algumas funções migradas para o modo kernel (
WIN32K.SYS)
- O subsistema POSIX era uma implementação mínima para certificação governamental e depois foi substituído pelo Windows Services for Unix baseado no Interix
WSL1: camada Linux baseada em tradução
- O WSL1 (Windows Subsystem for Linux) é uma camada de tradução fina que converte chamadas de sistema do Linux em chamadas do Windows
- Ao executar, apenas os processos
bash consomem alguns MB de memória e é mostrado como processo normal no Gerenciador de Tarefas
- O sistema de arquivos raiz existe como estrutura de arquivos individuais no NTFS, com overhead de armazenamento quase nulo
- Limitações
- Degradação de desempenho de I/O: custo de tradução causado pelas diferenças entre as APIs de sistema de arquivos do Linux e do Win32
- Servidor X externo necessário para executar GUI (por exemplo, X410)
- Sem suporte a raw socket, portanto
traceroute, nmap, tcpdump e similares não podem ser executados
WSL2: VM Linux baseada em Hyper-V
- Atendendo às necessidades dos usuários, a Microsoft introduziu uma VM Linux completa executando no Hyper-V
- O sistema de arquivos raiz é gerenciado como um arquivo VHDX único
- O comando
wsl --set-version "Ubuntu" 2 permite alternar entre WSL1 e WSL2
- Características de desempenho
- A inicialização inicial é mais lenta, mas o kernel Linux nativo é executado
- O uso de memória é dinâmico e pode escalar até metade da memória física máxima
- Nos testes com
stress, o consumo de memória aumenta com a carga e depois reduz automaticamente
- Se necessário, o comando
wsl --shutdown encerra a VM
WSL2: integração e limitações
- O WSL2 reforça a integração com o Windows em vez de funcionar como uma VM tradicional
- Montagem automática de drives do Windows, acesso às drives do Linux pelo caminho
\\wsl$\, execução de apps GUI via WSLg
- Os apps GUI são transmitidos via Remote Desktop Protocol e exigem configurações adicionais de DPI e escala de texto
- Problemas de gerenciamento de arquivos
- Os dados de trabalho do Linux são salvos dentro da imagem
ext4.vhdx, com risco de portabilidade e recuperação
- Quando executado
wsl --unregister Distro, todos os dados são excluídos imediatamente
- Ao usar o drive do Windows (
/mnt/c), há perda de desempenho devido à sobrecarga de NTFS + VM
- Protocolo de sistema de arquivos
- WSL1 usa
drvfs, enquanto o WSL2 usa o protocolo 9p do Plan9
- Foram citados casos de bugs residuais de
drvfs durante a conversão
- Alternativas
- É recomendável separar os dados de trabalho criando uma imagem VHDX separada e montando com
wsl --mount --vhd
- Não é possível configurar automaticamente via
.wslconfig, então precisa ser tratado por script
Conclusão
- O design modular e a ABI de kernel estável do Windows NT mantêm a compatibilidade com drivers legados
- O WSL1 tem vantagem em baixo consumo de memória, enquanto o WSL2 oferece maior compatibilidade e desempenho com kernel Linux real
- O WSL2 é uma arquitetura que minimiza as desvantagens de uma VM e reforça a integração com o OS host
- Pela definição tradicional, embora esteja mais próximo de uma VM, tem mérito para ser chamado de “subsistema” como um ambiente integrado e leve
3 comentários
Uau, até tem o Sseuk desenvolvedor aqui
Opinião no Hacker News
O WSL2 roda sobre um subconjunto do Hyper-V e, no fundo, é uma VM sobre o hipervisor
Mas ele tem diferenças em relação a uma VM comum do Hyper-V. Por exemplo, as distribuições Linux no WSL2 podem usar aceleração de GPU até em ambientes X ou Wayland por meio de particionamento de GPU (ou seja, PCI/GPU passthrough) e de uma implementação especial do DirectX
Esses recursos também podem ser viabilizados no Hyper-V comum com algumas gambiarras via PowerShell e afins, mas oficialmente só têm suporte no Windows Server
Só que dizer que “o X ou o Wayland fazem a renderização” é um mal-entendido. Quem realmente usa a GPU é a própria aplicação, e o X/Wayland fica mais com a composição de janelas depois que a renderização termina
Existem tarefas mais complexas, como conversão de cores, mas a carga computacional é pequena
O WSL1 é baseado em pico process, uma tecnologia derivada da pesquisa Drawbridge
Veja os materiais relacionados The Linux Kernel Hidden Inside Windows 10 e WSL Pico Process Overview
A mesma tecnologia Drawbridge também é usada para rodar o SQL Server no Linux
O artigo da Ars Technica explica isso em mais detalhes
Entendo por que migraram para o WSL2, mas é uma pena terem parado totalmente o desenvolvimento do WSL1
Nosso ambiente de CI é em grande parte baseado em Linux, mas algumas toolchains não funcionam bem no Wine, como o MSVC
Por isso, precisávamos de um ambiente em que fosse possível executar builds Linux de forma tranquila no Windows. O WSL1 permitia isso, mas o WSL2 não compartilha namespaces de processo nem descritores de arquivo, então é preciso recorrer a várias gambiarras
A velocidade de IO melhorou, mas o compartilhamento de arquivos é lento demais para uso real
/mnt/cJá cheguei a compilar extensões C de Python dessa forma
O WSL2 é uma VM extremamente integrada ao ambiente Windows
Sou obrigado a usar Windows por política da empresa e uso isso todos os dias para desenvolvimento; na maior parte dos casos, a experiência é bem confortável
Só que, como a base é RHEL8, é inconveniente que o suporte seja só para a família Debian. Queria saber como está hoje o suporte a apps gráficos
psou notopsó aparece o processo da VM.Com
docker run -it ubuntutambém dá para fazer algo parecido, então fico curioso sobre o que realmente muda.Pessoalmente, achei o espaço de trabalho separado bem incômodo
O WSL2 é, no fim, uma VM leve. É uma ideia parecida com o Firecracker, focada em boot rápido e baixo uso de memória
Mas, se você rodar vários containers Docker, a exigência de memória cresce bastante. Para ficar confortável, é melhor ter pelo menos 20 GB
Pessoalmente, acho o WSL1 muito mais útil. A maior parte das ferramentas de CLI, como toolchains de C++ e .NET, além de ssh/scp, funciona bem
Já o WSL2 quase não me serve para nada. Se preciso de uma VM Linux, uso VMware
O VMware tem muitos recursos, como árvore de snapshots, aceleração 3D, conexão de dispositivos USB, configuração de rede virtual, e ainda oferece uma GUI conveniente
Dá para acessar o disco da VM interna do WSL pelo caminho
\\wsl$Se um software antigo não suportar caminho UNC, dá para resolver mapeando para uma letra de unidade
Existe o problema de o arquivo VHDX continuar crescendo. É preciso fazer compactação (compact) manualmente
systemd-trimresolve parte do problemaVeja a issue relacionada GitHub WSL #12103
Se ainda assim não funcionar, dá para usar o método de otimização manual
Só como referência, o WSL contorna as regras do firewall do Windows por padrão. Fico me perguntando por que a Microsoft projetou isso dessa forma
Fico me perguntando se daria para montar uma partição ext4 real e assim reduzir a perda de desempenho causada pela simulação de dispositivo de bloco baseada em arquivo de imagem
À medida que passei a usar o WSL2 com frequência, bem quando fui deixando de usar Linux cada vez menos, comecei a me perguntar: isso também é EEE?
EEE - abraçar, estender e extinguir (Embrace, Extend, and Extinguish)