<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>WSL2 on kenji.blog</title><link>http://kenji.blog/pt/tags/wsl2/</link><description>Recent content in WSL2 on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>pt</language><copyright>kenjinote</copyright><lastBuildDate>Sun, 13 Sep 2026 07:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/pt/tags/wsl2/index.xml" rel="self" type="application/rss+xml"/><item><title>Hyper-V vs WSL2: Comparação de tecnologias de virtualização no Windows</title><link>http://kenji.blog/pt/p/hyper-v-vs-wsl2-windows-virtualization/</link><pubDate>Sun, 13 Sep 2026 07:00:00 +0900</pubDate><guid>http://kenji.blog/pt/p/hyper-v-vs-wsl2-windows-virtualization/</guid><description>&lt;img src="http://kenji.blog/p/hyper-v-vs-wsl2-windows-virtualization/img/eyecatch.jpg" alt="Featured image of post Hyper-V vs WSL2: Comparação de tecnologias de virtualização no Windows" />&lt;h2 id="1-introdução-a-evolução-da-virtualização-no-windows">1. Introdução: A evolução da virtualização no Windows
&lt;/h2>&lt;p>A tecnologia de virtualização na plataforma Windows passou por uma evolução dramática nas últimas décadas. No passado, hipervisores Type 2 de terceiros (como VMware Workstation e VirtualBox) eram a norma, mas desde que a Microsoft introduziu o &amp;ldquo;Hyper-V&amp;rdquo; no Windows Server 2008, hipervisores Type 1 também foram incorporados em SOs desktop como o Windows 10/11.&lt;/p>
&lt;p>E nos últimos anos, o que mais tem chamado a atenção dos desenvolvedores é o &amp;ldquo;WSL2 (Windows Subsystem for Linux 2)&amp;rdquo;. Enquanto o WSL1 dependia da conversão de chamadas de sistema (tradução), o WSL2 adota uma &amp;ldquo;Lightweight Utility VM&amp;rdquo; (Máquina Virtual Utilitária Leve) que aplica a tecnologia do Hyper-V, alcançando total compatibilidade com o Linux e uma melhoria dramática de desempenho.&lt;/p>
&lt;p>Neste artigo, vamos comparar e explicar minuciosamente essas duas poderosas tecnologias de virtualização — o &amp;ldquo;Hyper-V&amp;rdquo; completo e o &amp;ldquo;WSL2&amp;rdquo; focado na experiência do desenvolvedor — abordando suas arquiteturas, desempenho (CPU, memória, E/S de disco), configuração de rede e os melhores casos de uso, juntamente com profundos detalhes técnicos.&lt;/p>
&lt;hr>
&lt;h2 id="2-teoria-básica-dos-hipervisores-e-comparação-de-arquiteturas">2. Teoria básica dos hipervisores e comparação de arquiteturas
&lt;/h2>&lt;p>Ao entender a tecnologia de virtualização, classificar os tipos de hipervisores (Monitores de Máquina Virtual: VMM) é essencial.&lt;/p>
&lt;h3 id="21-diferenças-entre-hipervisores-type-1-e-type-2">2.1. Diferenças entre hipervisores Type 1 e Type 2
&lt;/h3>&lt;p>Um hipervisor é uma camada de software que abstrai o acesso ao hardware e permite que vários sistemas operacionais (SOs convidados) sejam executados simultaneamente em uma única máquina física.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Type 1 (Bare-metal)&lt;/strong>: Executado diretamente no hardware. Não existe o conceito de um SO host (embora, estritamente falando, possa existir um SO de gerenciamento com privilégios). Tem sobrecarga extremamente baixa e oferece alto desempenho e segurança. Exemplos: Hyper-V, VMware ESXi, Xen.&lt;/li>
&lt;li>&lt;strong>Type 2 (Hospedado)&lt;/strong>: Executado como um aplicativo no SO host (como Windows ou macOS). Como todo o acesso ao hardware passa pelo SO host, a sobrecarga é maior. Exemplos: VMware Workstation, Oracle VirtualBox.&lt;/li>
&lt;/ul>
&lt;p>O Hyper-V do Windows é um puro &lt;strong>hipervisor Type 1&lt;/strong>. Quando o Hyper-V é ativado, na verdade, o próprio SO Windows que o usuário opera normalmente passa a ser executado dentro de uma máquina virtual especial chamada &amp;ldquo;Partição Raiz (Root Partition)&amp;rdquo;.&lt;/p>
&lt;h3 id="22-detalhes-da-arquitetura-do-hyper-v">2.2. Detalhes da arquitetura do Hyper-V
&lt;/h3>&lt;p>A arquitetura do Hyper-V adota um design de microkernel e baseia-se em unidades de separação lógicas chamadas Partiçõoes (Partitions).&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;Hardware (CPU, RAM, Disco, NIC)&amp;#34;] --&amp;gt; B[&amp;#34;Hipervisor do Windows (Ring -1)&amp;#34;]
B --&amp;gt; C[&amp;#34;Partição Raiz (SO Windows)&amp;#34;]
B --&amp;gt; D[&amp;#34;Partição Filha 1 (VM Windows)&amp;#34;]
B --&amp;gt; E[&amp;#34;Partição Filha 2 (VM Linux)&amp;#34;]
C --&amp;gt; F[&amp;#34;VMBus (Barramento de Máquina Virtual)&amp;#34;]
D --&amp;gt; F
E --&amp;gt; F
C --&amp;gt; G[&amp;#34;VID (Driver de Infraestrutura de Virtualização)&amp;#34;]
C --&amp;gt; H[&amp;#34;VMWP.exe (Processo de Trabalho)&amp;#34;]
&lt;/pre>
&lt;ul>
&lt;li>&lt;strong>Hipervisor do Windows (Windows Hypervisor)&lt;/strong>: Opera no estado de nível de privilégio mais alto da CPU (Ring -1 ou VMX Root Mode) e é responsável apenas pela alocação de memória e escalonamento da CPU. Não inclui drivers de dispositivo.&lt;/li>
&lt;li>&lt;strong>Partição Raiz (Root Partition)&lt;/strong>: A partição onde o SO Windows host é executado. Ela possui todos os drivers de dispositivo e controla o hardware diretamente. Também fornece funções de gerenciamento para as partições filhas (como provedores WMI e VMWP.exe).&lt;/li>
&lt;li>&lt;strong>Partição Filha (Child Partition)&lt;/strong>: A partição onde o SO convidado é executado. O acesso direto ao hardware não é permitido e as solicitações de E/S são enviadas à partição raiz (I/O Sintético) por meio de um barramento de compartilhamento de memória lógico chamado &amp;ldquo;VMBus&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;h3 id="23-o-mecanismo-do-wsl2-e-da-lightweight-utility-vm">2.3. O mecanismo do WSL2 e da Lightweight Utility VM
&lt;/h3>&lt;p>O WSL2 utiliza a mesma tecnologia base de hipervisor Type 1 que o Hyper-V, mas utiliza um subconjunto de recursos chamado &amp;ldquo;Plataforma de Máquina Virtual (Virtual Machine Platform: VMP)&amp;rdquo;, que é diferente de uma máquina virtual Hyper-V completa.&lt;/p>
&lt;p>A &amp;ldquo;Lightweight Utility VM&amp;rdquo; (Máquina Virtual Utilitária Leve) adotada no WSL2 elimina completamente a emulação de hardware legado (como BIOS virtual ou placa-mãe virtual) encontrada em VMs tradicionais.&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;SO Host Windows (Espaço do Usuário)&amp;#34;]
B[&amp;#34;Sistema de Arquivos NTFS&amp;#34;]
C[&amp;#34;Servidor de Protocolo 9P (Plan 9)&amp;#34;]
D[&amp;#34;Lightweight Utility VM (Kernel Linux)&amp;#34;]
E[&amp;#34;ext4.vhdx (Disco Virtual)&amp;#34;]
F[&amp;#34;Espaço do Usuário Linux (Distribuições WSL2)&amp;#34;]
A --&amp;gt; C
C --&amp;gt;| Compartilhamento de Arquivos Cross-OS | D
D --&amp;gt; E
D --&amp;gt; F
&lt;/pre>
&lt;p>A maior característica do WSL2 é a &lt;strong>velocidade de inicialização&lt;/strong> e a &lt;strong>integração perfeita com o SO host&lt;/strong>. O kernel do Linux é inicializado em menos de alguns segundos e o sistema de arquivos do lado do Windows (NTFS) é acessado por meio do protocolo de sistema de arquivos de rede &lt;code>9P&lt;/code> do Plan 9.&lt;/p>
&lt;hr>
&lt;h2 id="3-análise-detalhada-de-desempenho-recursos-computacionais-e-es">3. Análise detalhada de desempenho: Recursos computacionais e E/S
&lt;/h2>&lt;p>O desempenho da máquina virtual é expresso como a soma das sobrecargas em cada componente de CPU, memória e E/S de disco.&lt;/p>
&lt;h3 id="31-sobrecarga-de-cpu-e-troca-de-contexto">3.1. Sobrecarga de CPU e troca de contexto
&lt;/h3>&lt;p>Tanto o Hyper-V quanto o WSL2 usam virtualização assistida por hardware (Intel VT-x / AMD-V). As instruções da CPU são executadas basicamente na velocidade nativa, mas ao executar instruções privilegiadas ou processar E/S, ocorre uma interrupção chamada &amp;ldquo;VM Exit&amp;rdquo;, realizando uma troca de contexto para o hipervisor.&lt;/p>
&lt;p>A sobrecarga de CPU neste momento, $T_{overhead}$, pode ser expressa pelo seguinte modelo matemático:&lt;/p>
$$ T_{overhead} = \sum_{i=1}^{N} (t_{vm\_exit} + t_{hypercall\_process} + t_{vm\_entry}) $$&lt;p>Onde:&lt;/p>
&lt;ul>
&lt;li>$N$: Número de ocorrências de VM Exit por unidade de tempo&lt;/li>
&lt;li>$t_{vm\_exit}$: Tempo de transição do convidado para o hipervisor&lt;/li>
&lt;li>$t_{hypercall\_process}$: Tempo de processamento de E/S ou interrupções via VMBus&lt;/li>
&lt;li>$t_{vm\_entry}$: Tempo de retorno do hipervisor para o convidado&lt;/li>
&lt;/ul>
&lt;p>Como o WSL2 não possui emulação de legado, $t_{hypercall\_process}$ é otimizado para ser extremamente pequeno. Portanto, em operações de CPU puras (como compilação de kernel ou inferência de modelos de aprendizado de máquina), a degradação de desempenho fica dentro de alguns por cento em comparação com um ambiente bare-metal.&lt;/p>
&lt;h3 id="32-mecanismos-de-alocação-de-memória">3.2. Mecanismos de alocação de memória
&lt;/h3>&lt;p>Existem diferenças claras nas filosofias de design entre os dois na abordagem de gerenciamento de memória.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Hyper-V (Memória Dinâmica)&lt;/strong>: A partição raiz aloca e recupera dinamicamente a memória de acordo com a demanda de memória da VM convidada. No entanto, a memória reservada como cache de página dentro do SO convidado tende a não ser liberada a menos que o sistema esteja sob pressão.&lt;/li>
&lt;li>&lt;strong>WSL2 (Recuperação dinâmica de memória)&lt;/strong>: O WSL2 tem seu próprio mecanismo e retorna periodicamente (Reclaim) a memória que não é mais necessária na VM Linux (incluindo o cache) para o host Windows. Nos primórdios do WSL2, havia o problema do cache de páginas do Linux consumir a memória do Windows (inchaço do processo Vmmem), mas isso foi melhorado agora com patches de kernel.&lt;/li>
&lt;/ul>
&lt;h3 id="33-características-de-es-de-disco-vhdx-vs-ext4vhdx">3.3. Características de E/S de disco (VHDX vs ext4.vhdx)
&lt;/h3>&lt;p>A E/S de disco é o gargalo mais provável no desempenho de uma máquina virtual.&lt;/p>
&lt;p>A latência de E/S, $L_{total}$, é calculada da seguinte forma:&lt;/p>
$$ L_{total} = L_{guest\_fs} + L_{vmbus} + L_{host\_fs} + L_{physical\_disk} $$&lt;p>&lt;strong>No caso do Hyper-V&lt;/strong>:
Convidados gerais do Hyper-V usam discos virtuais no formato &lt;code>VHDX&lt;/code>. As solicitações de E/S emitidas pelo sistema de arquivos (ext4 ou NTFS) dentro do SO convidado passam pelo driver de armazenamento de dispositivo de bloco (storvsc) do VMBus e são processadas como acessos ao arquivo VHDX no NTFS do lado do Windows.&lt;/p>
&lt;p>&lt;strong>No caso do WSL2&lt;/strong>:
As distribuições Linux no WSL2 operam em um sistema de arquivos ext4 nativo construído dentro de um arquivo &lt;code>ext4.vhdx&lt;/code> dedicado. Operações de arquivo dentro do Linux (como dentro do diretório &lt;code>~&lt;/code>) apresentam desempenho nativo equivalente ao do Hyper-V acima.
No entanto, o processo é muito diferente &lt;strong>quando o Linux no WSL2 acessa arquivos no lado do Windows (como &lt;code>/mnt/c/&lt;/code>)&lt;/strong>, ou vice-versa. Para esse acesso cross-OS, o &lt;code>9P (Plan 9 File System Protocol)&lt;/code> é usado.&lt;/p>
$$ L_{cross\_os} = L_{9p\_client} + L_{socket\_transfer} + L_{9p\_server} + L_{ntfs} $$&lt;p>O acesso através deste protocolo 9P possui uma grande sobrecarga de processamento de serialização e, para o propósito de ler e escrever um grande número de arquivos pequenos (por exemplo: um &lt;code>npm install&lt;/code> ou operações do Git em um projeto Node.js localizado em um diretório no lado do Windows), o desempenho diminui significativamente (às vezes mais de 10 vezes mais lento).
Portanto, &lt;strong>ao usar o WSL2, é uma regra de ouro sempre colocar os arquivos de projeto no sistema de arquivos nativo do Linux (sob &lt;code>~/&lt;/code>)&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="4-estrutura-de-rede-nat-default-switch-e-bridged">4. Estrutura de rede: NAT, Default Switch e Bridged
&lt;/h2>&lt;p>A flexibilidade de rede é uma das maiores diferenças entre o Hyper-V e o WSL2.&lt;/p>
&lt;h3 id="41-rede-do-wsl2-baseada-em-nat">4.1. Rede do WSL2 (Baseada em NAT)
&lt;/h3>&lt;p>Por padrão, a rede do WSL2 usa uma configuração &amp;ldquo;NAT (Network Address Translation)&amp;rdquo; usando a tecnologia de comutador virtual (Virtual Switch) do Hyper-V.
A VM Linux recebe automaticamente um endereço IP privado diferente do host Windows (por exemplo: &lt;code>172.20.x.x&lt;/code>). Está integrado um mecanismo onde o host Windows usa &lt;code>localhost&lt;/code> para encaminhar para serviços (portas) iniciados no WSL2, permitindo que os desenvolvedores testem servidores web e outros sem precisar estar cientes da rede.&lt;/p>
&lt;p>Recentemente, um novo modo de rede chamado &amp;ldquo;Mirrored mode&amp;rdquo; (Modo espelhado) foi introduzido em versões de visualização do WSL2. Isso visa melhorar o suporte IPv6 e a compatibilidade com conexões VPN (pode ser configurado em &lt;code>.wslconfig&lt;/code>).&lt;/p>
&lt;h3 id="42-comutador-virtual-do-hyper-v-virtual-switch">4.2. Comutador Virtual do Hyper-V (Virtual Switch)
&lt;/h3>&lt;p>O Hyper-V permite a construção de redes avançadas de nível corporativo. Através do &amp;ldquo;Gerenciador de Comutador Virtual&amp;rdquo;, ele fornece principalmente 3 modos.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Externo (External)&lt;/strong>: Vincula a NIC física da máquina host ao comutador virtual e permite que as VMs convidadas participem diretamente da rede física (conexão em ponte). A VM obtém um IP da mesma sub-rede da rede física através de um servidor DHCP.&lt;/li>
&lt;li>&lt;strong>Interno (Internal)&lt;/strong>: Permite a comunicação apenas entre o SO host e a VM, e entre as VMs. Não pode acessar diretamente redes externas.&lt;/li>
&lt;li>&lt;strong>Privado (Private)&lt;/strong>: Permite a comunicação apenas entre as VMs e bloqueia a comunicação com o SO host. Usado para construir ambientes de teste isolados.&lt;/li>
&lt;/ol>
&lt;h3 id="43-construção-avançada-de-rede-hyper-v-com-powershell">4.3. Construção avançada de rede Hyper-V com PowerShell
&lt;/h3>&lt;p>Em ambientes de desenvolvimento ou teste, quando você deseja construir uma rede NAT personalizada para VMs, o PowerShell permite um controle detalhado. Abaixo está um exemplo de script que cria um comutador virtual interno, configura NAT nele e fornece acesso à internet para as VMs.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 1. Criação do comutador virtual interno&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SwitchName&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HyperV-NatSwitch&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-VMSwitch&lt;/span> &lt;span class="n">-SwitchName&lt;/span> &lt;span class="nv">$SwitchName&lt;/span> &lt;span class="n">-SwitchType&lt;/span> &lt;span class="n">Internal&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 2. Definir endereço IP na NIC virtual do host (IP que servirá como gateway)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$GatewayIP&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;192.168.100.1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$NetPrefix&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="mf">24&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$InterfaceAlias&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;vEthernet (&lt;/span>&lt;span class="nv">$SwitchName&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-NetIPAddress&lt;/span> &lt;span class="n">-IPAddress&lt;/span> &lt;span class="nv">$GatewayIP&lt;/span> &lt;span class="n">-PrefixLength&lt;/span> &lt;span class="nv">$NetPrefix&lt;/span> &lt;span class="n">-InterfaceAlias&lt;/span> &lt;span class="nv">$InterfaceAlias&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 3. Configuração da rede NAT&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$NatName&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HyperV-NatNetwork&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$NatSubnet&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;192.168.100.0/24&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-NetNat&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="nv">$NatName&lt;/span> &lt;span class="n">-InternalIPInterfaceAddressPrefix&lt;/span> &lt;span class="nv">$NatSubnet&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Comando para verificação&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Get-NetNat&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Com esta configuração, ao definir manualmente um IP de &lt;code>192.168.100.x&lt;/code> e o gateway &lt;code>192.168.100.1&lt;/code> no convidado Hyper-V especificado, você pode construir um segmento NAT próprio capaz de se comunicar externamente através do host.&lt;/p>
&lt;hr>
&lt;h2 id="5-casos-de-uso-e-guia-prático-de-seleção">5. Casos de uso e guia prático de seleção
&lt;/h2>&lt;p>Com base nas diferenças em arquitetura e desempenho discutidas até o momento, vamos definir em quais situações qual tecnologia deve ser adotada.&lt;/p>
&lt;h3 id="51-cenários-onde-o-wsl2-deve-ser-selecionado">5.1. Cenários onde o WSL2 deve ser selecionado
&lt;/h3>&lt;p>O WSL2 foi projetado especificamente para &amp;ldquo;melhorar a produtividade do desenvolvedor&amp;rdquo;. É ideal para os seguintes usos:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Desenvolvimento Web e nativo de nuvem&lt;/strong>: Desenvolvimento de contêineres usando Docker Desktop (backend WSL2) ou Podman.&lt;/li>
&lt;li>&lt;strong>Uso de ferramentas exclusivas do Linux&lt;/strong>: Ao usar diariamente bash, grep, awk, sed ou compiladores GCC ou Clang para Linux.&lt;/li>
&lt;li>&lt;strong>Aplicativos com GUI (WSLg)&lt;/strong>: Quando se deseja executar aplicativos Linux X11/Wayland nativamente na área de trabalho do Windows sem problemas.&lt;/li>
&lt;li>&lt;strong>Aprendizado de Máquina e Desenvolvimento de IA&lt;/strong>: Treinamento rápido de TensorFlow ou PyTorch usando a função de repasse de GPU (NVIDIA CUDA on WSL).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Nota&lt;/strong>: Você pode encontrar limitações se quiser personalizar o kernel em detalhes ou construir serviços complexos que dependem fortemente do systemd (o systemd agora é suportado, mas desabilitado ou restrito por padrão).&lt;/p>
&lt;h3 id="52-cenários-onde-o-hyper-v-deve-ser-selecionado">5.2. Cenários onde o Hyper-V deve ser selecionado
&lt;/h3>&lt;p>O Hyper-V visa &amp;ldquo;virtualização e isolamento completo da infraestrutura&amp;rdquo;. Ele se torna indispensável para os seguintes casos de uso:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Execução de VMs Windows&lt;/strong>: Para executar diferentes versões do Windows (Windows Server, Windows 10 mais antigo, etc.) como um ambiente de teste.&lt;/li>
&lt;li>&lt;strong>Virtualização aninhada (Nested Virtualization)&lt;/strong>: Quando se deseja executar ainda mais máquinas virtuais (Hyper-V ou KVM) dentro de uma máquina virtual. É essencial para ambientes de verificação de engenheiros de infraestrutura.&lt;/li>
&lt;li>&lt;strong>Requisitos avançados de rede&lt;/strong>: Quando se precisa controlar rigorosamente as configurações de rede, como conexões de ponte externa (participação na mesma LAN), marcação de VLAN ou alocação de várias NICs.&lt;/li>
&lt;li>&lt;strong>Instantâneos (Snapshots/Checkpoints)&lt;/strong>: A capacidade de salvar o estado de uma VM em um momento específico e reverter instantaneamente a qualquer momento. Extremamente útil para testes destrutivos de software ou análise de malware.&lt;/li>
&lt;li>&lt;strong>Alocação de recursos fixos&lt;/strong>: Quando se deseja fixar rigorosamente o número de núcleos de CPU e a quantidade de memória para minimizar o impacto no SO host.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="6-considerações-sobre-a-taxa-de-transferência-throughput-de-es-por-meio-de-modelos-matemáticos-apêndice">6. Considerações sobre a taxa de transferência (throughput) de E/S por meio de modelos matemáticos (Apêndice)
&lt;/h2>&lt;p>Como um engenheiro de sistemas, ao avaliar os limites de desempenho de E/S de ambos, é importante entender teoricamente a relação entre a taxa de transferência $S$ e o tamanho do bloco $B$.&lt;/p>
&lt;p>A taxa de transferência de transferência de dados $S$ é a quantidade de transferência de dados por unidade de tempo, e é modelada da seguinte forma:&lt;/p>
$$ S(B) = \frac{B}{L_{setup} + \frac{B}{R_{max}}} $$&lt;ul>
&lt;li>$B$: Tamanho do bloco (Bytes)&lt;/li>
&lt;li>$L_{setup}$: Latência fixa associada à configuração de solicitações de E/S e à troca de contexto&lt;/li>
&lt;li>$R_{max}$: A largura de banda máxima do hardware na cópia ou transferência de dispositivo&lt;/li>
&lt;/ul>
&lt;p>No acesso a arquivos por meio do protocolo 9P do WSL2, este $L_{setup}$ é muito grande (devido à comunicação de soquete e à serialização/desserialização do protocolo). Portanto, quando o tamanho do bloco $B$ é pequeno (como leitura e gravação em massa de arquivos pequenos de cerca de alguns KB), a influência do $L_{setup}$ no denominador se torna dominante, e a taxa de transferência $S$ diminui drasticamente.
Por outro lado, em acessos VHDX via VMBus do Hyper-V, como o $L_{setup}$ é otimizado para um nível próximo a interrupções de hardware, operações altas de IOPS podem ser mantidas mesmo com blocos de pequeno tamanho.&lt;/p>
&lt;p>Esta realidade matemática é o fundamento lógico por trás da melhor prática de que &amp;ldquo;você não deve colocar arquivos de projeto no lado do Windows no WSL2&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="7-conclusão-duas-tecnologias-de-virtualização-que-coexistem">7. Conclusão: Duas tecnologias de virtualização que coexistem
&lt;/h2>&lt;p>O Hyper-V e o WSL2 não se tratam de um ser superior ao outro; eles são &lt;strong>&amp;ldquo;duas soluções com propósitos diferentes&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>O &lt;strong>WSL2&lt;/strong> é a &amp;ldquo;melhor ferramenta de integração&amp;rdquo; para romper a casca do SO Windows e entregar o ecossistema Linux aos usuários do Windows de forma contínua e rápida. Não é exagero dizer que é o melhor ambiente CLI para desenvolvedores.&lt;/li>
&lt;li>O &lt;strong>Hyper-V&lt;/strong> é um &amp;ldquo;hipervisor completo&amp;rdquo; que traz o robusto isolamento e capacidade de gerenciamento cultivados em data centers corporativos para o desktop. Não tem rival na construção de redes, no teste de SOs Windows e na simulação de ambientes de infraestrutura.&lt;/li>
&lt;/ul>
&lt;p>Nos ambientes Windows modernos, essas duas tecnologias não competem uniformemente, mas coexistem lindamente na mesma plataforma de VM. Ao usá-las nos lugares certos, dependendo da finalidade, o Windows será indiscutivelmente a estação de trabalho de engenharia mais poderosa e flexível do mundo.&lt;/p></description></item><item><title>Guia de Configuração Definitivo do Ambiente de Desenvolvimento para WSL2 (Windows Subsystem for Linux)</title><link>http://kenji.blog/pt/p/wsl2-ultimate-development-setup-guide/</link><pubDate>Sat, 12 Sep 2026 23:00:00 +0900</pubDate><guid>http://kenji.blog/pt/p/wsl2-ultimate-development-setup-guide/</guid><description>&lt;img src="http://kenji.blog/p/wsl2-ultimate-development-setup-guide/img/eyecatch.jpg" alt="Featured image of post Guia de Configuração Definitivo do Ambiente de Desenvolvimento para WSL2 (Windows Subsystem for Linux)" />&lt;p>O &amp;ldquo;WSL2 (Windows Subsystem for Linux 2)&amp;rdquo;, que fornece um ambiente de desenvolvimento nativo do Linux no Windows, tornou-se uma ferramenta indispensável no desenvolvimento de software moderno. No entanto, há uma diferença imensa em desempenho e experiência de desenvolvimento entre usá-lo em seu estado padrão e ajustá-lo adequadamente após entender sua arquitetura.&lt;/p>
&lt;p>Neste artigo, explicaremos detalhadamente todo o processo para construir o &amp;ldquo;ambiente de desenvolvimento definitivo&amp;rdquo; exigido por engenheiros profissionais. Começando com uma explicação da arquitetura fundamental do WSL2, abordaremos configurações para maximizar o desempenho, a construção de um ambiente de terminal confortável, a integração perfeita com Docker e VS Code, e configurações avançadas de rede.&lt;/p>
&lt;hr>
&lt;h2 id="1-a-arquitetura-do-wsl2-e-a-evolução-a-partir-do-wsl1">1. A Arquitetura do WSL2 e a Evolução a partir do WSL1
&lt;/h2>&lt;p>Para extrair totalmente o potencial do WSL2, é importante primeiro entender sua estrutura interna. O WSL original (WSL1) e o WSL2 têm abordagens fundamentalmente diferentes para executar binários do Linux no Windows.&lt;/p>
&lt;h3 id="wsl1-camada-de-tradução-de-chamadas-de-sistema">WSL1: Camada de Tradução de Chamadas de Sistema
&lt;/h3>&lt;p>O WSL1 adotava um mecanismo que traduzia chamadas de sistema do Linux para a API NT do Windows em tempo real. Isso tinha a vantagem de uma sobrecarga de recursos muito baixa, já que não usava uma máquina virtual (VM). No entanto, era difícil emular perfeitamente chamadas de sistema complexas, como operações de E/S do sistema de arquivos, resultando em uma degradação de desempenho terrível ao lidar com um grande número de arquivos pequenos, como &lt;code>npm install&lt;/code> do Node.js ou operações de repositório do Git.&lt;/p>
&lt;h3 id="wsl2-vm-utilitária-leve-e-kernel-linux-completo">WSL2: VM Utilitária Leve e Kernel Linux Completo
&lt;/h3>&lt;p>No WSL2, a arquitetura foi renovada, e um kernel Linux real construído pela Microsoft agora roda diretamente em uma &lt;strong>&amp;ldquo;VM utilitária leve&amp;rdquo; que utiliza um subconjunto da arquitetura Hyper-V&lt;/strong>. Isso garante 100% de compatibilidade de chamadas de sistema, e o uso de um disco virtual (VHDX) com o sistema de arquivos ext4 nativo do Linux melhorou drasticamente o desempenho de E/S de arquivos em comparação com o WSL1.&lt;/p>
&lt;p>O diagrama Mermaid a seguir mostra as diferenças estruturais entre o WSL1 e o WSL2.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
subgraph &amp;#34;Ambiente do SO Windows&amp;#34;
A[&amp;#34;Kernel Windows NT&amp;#34;]
A --&amp;gt; F[&amp;#34;Sistema de Arquivos NTFS (Unidade C:)&amp;#34;]
end
subgraph &amp;#34;Arquitetura do WSL2&amp;#34;
B[&amp;#34;Hypervisor Hyper-V&amp;#34;]
B --&amp;gt; C[&amp;#34;VM Utilitária Leve&amp;#34;]
C --&amp;gt; D[&amp;#34;Kernel Linux (Microsoft)&amp;#34;]
D --&amp;gt; E[&amp;#34;Espaço de Usuário Ubuntu (glibc, bash, etc.)&amp;#34;]
D --&amp;gt; G[&amp;#34;Disco Virtual ext4 (.vhdx)&amp;#34;]
end
A -.-&amp;gt;|&amp;#34;Compartilhamento de Arquivos de Rede via Protocolo Plan 9 (9P)&amp;#34;| D
style B fill:#f9f,stroke:#333,stroke-width:2px
style D fill:#bbf,stroke:#333,stroke-width:2px
&lt;/pre>
&lt;p>A lição importante a ser tirada dessa estrutura é que &lt;strong>&amp;ldquo;o acesso aos arquivos no lado do Linux (dentro do VHDX) é extremamente rápido, mas o acesso aos arquivos no lado do Windows (&lt;code>/mnt/c/&lt;/code>) é muito lento porque passa pelo protocolo 9P&amp;rdquo;&lt;/strong>. O código-fonte do projeto deve ser sempre colocado no diretório inicial (&lt;code>~&lt;/code>) do lado do WSL.&lt;/p>
&lt;hr>
&lt;h2 id="2-análise-matemática-do-desempenho-por-que-o-wsl2-é-rápido">2. Análise Matemática do Desempenho: Por que o WSL2 é rápido?
&lt;/h2>&lt;p>Vamos avaliar quantitativamente a melhoria de desempenho do WSL2 usando um modelo matemático. Uma das operações mais demoradas no desenvolvimento de software é o processamento que envolve E/S de um grande número de arquivos (por exemplo, instalação de bibliotecas e compilação).&lt;/p>
&lt;p>O tempo total de execução $T_{total}$ de um determinado processo é expresso como a soma do tempo de computação pela CPU $T_{compute}$ e o tempo de E/S de disco $T_{io}$.&lt;/p>
$$ T_{total} = T_{compute} + T_{io} $$&lt;p>No caso do WSL1, ocorre uma sobrecarga ao converter as operações do lado do Linux em operações NTFS, então o tempo de E/S é modelado da seguinte forma. Aqui, $n$ é o número de operações de arquivo, $t_{ntfs\_syscall}$ é o tempo de execução da chamada de sistema do lado do Windows, e $t_{trans}$ é a sobrecarga da camada de tradução.&lt;/p>
$$ T_{wsl1\_io} = \sum_{i=1}^{n} (t_{ntfs\_syscall_i} + t_{trans_i}) $$&lt;p>Por outro lado, no caso do WSL2, o kernel emite E/S diretamente para o sistema de arquivos ext4, então a sobrecarga é apenas um pequeno atraso $t_{virt}$ devido à virtualização.&lt;/p>
$$ T_{wsl2\_io} = \sum_{i=1}^{n} (t_{ext4_i} + t_{virt_i}) $$&lt;p>Em sistemas de arquivos comuns, como $t_{ext4} \ll t_{ntfs\_syscall} + t_{trans}$, quando $n$ é muito grande (dezenas a centenas de milhares de operações de arquivo), a diferença no tempo de E/S entre o WSL1 e o WSL2 aumenta exponencialmente.&lt;/p>
&lt;p>Além disso, assumindo que a taxa de sobrecarga do cálculo da CPU em um ambiente virtualizado seja $\rho$, na virtualização mais recente assistida por hardware (Intel VT-x / AMD-V), ela fica em torno de $\rho \approx 0.01 \sim 0.03$ (1 a 3%). Portanto, mesmo em tarefas puramente computacionais, ele oferece $97\% \sim 99\%$ de desempenho comparável ao de um ambiente Linux nativo.&lt;/p>
&lt;hr>
&lt;h2 id="3-instalação-e-construção-da-base">3. Instalação e Construção da Base
&lt;/h2>&lt;p>No Windows 10/11, a instalação do WSL2 tornou-se muito simples. Basta abrir o PowerShell com privilégios de administrador e executar o seguinte comando:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># WSL2 e Ubuntu são instalados por padrão&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-install&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Ao especificar uma distribuição específica&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Pode ser verificado com wsl --list --online&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-install&lt;/span> &lt;span class="n">-d&lt;/span> &lt;span class="n">Ubuntu&lt;/span>&lt;span class="p">-&lt;/span>&lt;span class="mf">24.04&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Após a instalação e reinicialização, você será solicitado a configurar um nome de usuário UNIX e senha na primeira inicialização. Esse usuário é independente do usuário do Windows e é válido apenas dentro do WSL.&lt;/p>
&lt;p>Se você já estiver usando o WSL1, poderá convertê-lo para o WSL2 com os seguintes comandos:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Converter uma distribuição existente para WSL2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-set-version&lt;/span> &lt;span class="n">Ubuntu&lt;/span> &lt;span class="mf">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Definir o WSL2 como padrão para distribuições adicionadas no futuro&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-set-default-version&lt;/span> &lt;span class="mf">2&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="4-os-segredos-do-controle-de-recursos-wslconfig-e-wslconf">4. Os Segredos do Controle de Recursos: .wslconfig e wsl.conf
&lt;/h2>&lt;p>Uma das maiores armadilhas do WSL2 é o &amp;ldquo;consumo ilimitado de memória (inchaço do processo Vmmem)&amp;rdquo;. Como o WSL2 usa o cache de página do kernel Linux, ele consome infinitamente a memória do host (Windows) a cada E/S. Para evitar isso, é essencial limitar os recursos por meio de arquivos de configuração.&lt;/p>
&lt;p>Os arquivos de configuração do WSL2 são divididos em dois: &lt;strong>&lt;code>.wslconfig&lt;/code> que afeta todo o Windows&lt;/strong> e &lt;strong>&lt;code>wsl.conf&lt;/code> que afeta o interior de cada distribuição&lt;/strong>.&lt;/p>
&lt;h3 id="41-wslconfig-lado-do-windows">4.1. .wslconfig (Lado do Windows)
&lt;/h3>&lt;p>Crie um arquivo no diretório de perfil de usuário do Windows (&lt;code>C:\Users\&amp;lt;NomeDoUsuario&amp;gt;\.wslconfig&lt;/code>) para controlar a alocação de recursos para a VM.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># C:\Users\&amp;lt;NomeDoUsuario&amp;gt;\.wslconfig&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[wsl2]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Quantidade máxima de memória alocada à VM. Recomenda-se cerca de 50% a 75% da memória total do host&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">memory&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">16GB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Número de núcleos de CPU a serem usados (usa todos os núcleos se omitido)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">processors&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Tamanho do arquivo de swap&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">swap&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">8GB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Destino de salvamento do arquivo de swap (se desejar economizar espaço na unidade C)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># swapfile=D:\\wsl\\swap.vhdx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Habilitar o encaminhamento do localhost (para acessar o WSL do lado do Windows através do localhost)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">localhostForwarding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Liberar memória automaticamente (Apenas Windows 11)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Libera dinamicamente o cache de página para evitar o inchaço do Vmmem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">autoMemoryReclaim&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">dropcache&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[experimental]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Recursos avançados de rede disponíveis no Windows 11 22H2 e posteriores&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Isso permite suporte a IPv6 e compartilhamento do mesmo endereço IP entre o WSL e o Windows&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">networkingMode&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">mirrored&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">dnsTunneling&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">firewall&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">autoProxy&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="42-wslconf-lado-do-linux">4.2. wsl.conf (Lado do Linux)
&lt;/h3>&lt;p>Edite &lt;code>/etc/wsl.conf&lt;/code> dentro do WSL para controlar o comportamento específico da distribuição.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># /etc/wsl.conf (Editado dentro do WSL)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[network]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Desativa a geração automática de /etc/resolv.conf na inicialização do WSL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Útil se você deseja definir um DNS personalizado (por exemplo, 8.8.8.8)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">generateResolvConf&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Define um nome de host personalizado&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">hostname&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">WSL-DevNode&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[automount]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Configurações de montagem para unidades do Windows&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">enabled&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">options&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;metadata,uid=1000,gid=1000,umask=022&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Muda o ponto de montagem da unidade C de /mnt/c para /c (encurta o caminho)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">root&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[boot]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Ativa o systemd (WSL 0.67.6 e posteriores)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Isso permite que snap e vários daemons (como o Docker) sejam executados nativamente&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">systemd&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[user]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Usuário de login padrão&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">default&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">kenji&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Para aplicar essas configurações, você deve executar &lt;code>wsl --shutdown&lt;/code> no PowerShell para parar completamente a VM do WSL antes de reiniciar.&lt;/p>
&lt;hr>
&lt;h2 id="5-o-ambiente-de-terminal-definitivo-zsh--powerlevel10k">5. O Ambiente de Terminal Definitivo: Zsh + Powerlevel10k
&lt;/h2>&lt;p>A produtividade não aumentará se você mantiver o bash padrão. Combinaremos o Zsh, que se orgulha de funções poderosas de autocompletar e visibilidade, com o tema ultrarrápido &amp;ldquo;Powerlevel10k&amp;rdquo; para construir o prompt mais forte.&lt;/p>
&lt;h3 id="51-introdução-e-configuração-do-windows-terminal">5.1. Introdução e Configuração do Windows Terminal
&lt;/h3>&lt;p>Instale o &amp;ldquo;Windows Terminal&amp;rdquo; a partir da Microsoft Store. Abra as configurações JSON (&lt;code>settings.json&lt;/code>), defina o perfil padrão para o WSL (Ubuntu) e altere a fonte para uma Nerd Font focada em desenvolvimento (por exemplo, &lt;code>HackGen Console NF&lt;/code> ou &lt;code>MesloLGS NF&lt;/code>).&lt;/p>
&lt;h3 id="52-instalação-do-zsh-e-oh-my-zsh">5.2. Instalação do Zsh e Oh My Zsh
&lt;/h3>&lt;p>Execute os seguintes comandos no terminal do WSL:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Atualização de pacotes e instalação do Zsh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt update &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo apt upgrade -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install -y zsh git curl
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Executa o script de instalação do Oh My Zsh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sh -c &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="53-introdução-ao-powerlevel10k-e-plugins">5.3. Introdução ao Powerlevel10k e Plugins
&lt;/h3>&lt;p>Introduziremos plugins (realce de sintaxe e autocompletar) e o tema Powerlevel10k que aprimoram ainda mais o Zsh.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Powerlevel10k&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone --depth&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> https://github.com/romkatv/powerlevel10k.git &lt;span class="si">${&lt;/span>&lt;span class="nv">ZSH_CUSTOM&lt;/span>&lt;span class="k">:-&lt;/span>&lt;span class="nv">$HOME&lt;/span>&lt;span class="p">/.oh-my-zsh/custom&lt;/span>&lt;span class="si">}&lt;/span>/themes/powerlevel10k
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># zsh-autosuggestions&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/zsh-users/zsh-autosuggestions &lt;span class="si">${&lt;/span>&lt;span class="nv">ZSH_CUSTOM&lt;/span>&lt;span class="k">:-&lt;/span>&lt;span class="p">~/.oh-my-zsh/custom&lt;/span>&lt;span class="si">}&lt;/span>/plugins/zsh-autosuggestions
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># zsh-syntax-highlighting&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/zsh-users/zsh-syntax-highlighting.git &lt;span class="si">${&lt;/span>&lt;span class="nv">ZSH_CUSTOM&lt;/span>&lt;span class="k">:-&lt;/span>&lt;span class="p">~/.oh-my-zsh/custom&lt;/span>&lt;span class="si">}&lt;/span>/plugins/zsh-syntax-highlighting
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Edite &lt;code>~/.zshrc&lt;/code> para ativar o tema e os plugins.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Alterações em ~/.zshrc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ZSH_THEME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;powerlevel10k/powerlevel10k&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Adicionar ao array de plugins&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">plugins&lt;/span>&lt;span class="o">=(&lt;/span>git zsh-autosuggestions zsh-syntax-highlighting&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Ao salvar e executar &lt;code>source ~/.zshrc&lt;/code>, o assistente de configuração do Powerlevel10k (&lt;code>p10k configure&lt;/code>) será iniciado. Siga as instruções na tela para personalizar o prompt ao seu gosto (estilo do prompt, presença de ícones, informações a serem exibidas, etc.). O nome e o status do branch do Git, a versão do Node.js, o tempo de execução do comando, entre outros, serão exibidos em tempo real, melhorando drasticamente a eficiência do desenvolvimento.&lt;/p>
&lt;hr>
&lt;h2 id="6-vs-code-remote---integração-perfeita-com-o-wsl">6. VS Code Remote - Integração Perfeita com o WSL
&lt;/h2>&lt;p>No desenvolvimento com o WSL2, a extensão &amp;ldquo;Remote - WSL&amp;rdquo; é o mecanismo que permite o acesso perfeito aos arquivos dentro do WSL a partir do IDE (Visual Studio Code) instalado no lado do Windows.&lt;/p>
&lt;h3 id="explicação-da-arquitetura">Explicação da Arquitetura
&lt;/h3>&lt;p>O diagrama de sequência a seguir mostra como o VS Code se comunica com o WSL2.&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
autonumber
participant U as &amp;#34;Desenvolvedor&amp;#34;
participant V as &amp;#34;IU do VS Code (Windows)&amp;#34;
participant S as &amp;#34;Servidor VS Code (WSL2)&amp;#34;
participant F as &amp;#34;Sistema de Arquivos ext4 (WSL2)&amp;#34;
U-&amp;gt;&amp;gt;V: &amp;#34;Digitar `code .` no Terminal WSL&amp;#34;
V-&amp;gt;&amp;gt;S: &amp;#34;Estabelecer Conexão RPC via Vsock&amp;#34;
Note over V,S: Comunica-se por soquetes Hyper-V sem usar TCP/IP
S-&amp;gt;&amp;gt;F: &amp;#34;Ler Arquivos de Origem / Executar Linter&amp;#34;
F--&amp;gt;&amp;gt;S: &amp;#34;Retornar Dados e Análise&amp;#34;
S--&amp;gt;&amp;gt;V: &amp;#34;Transmitir resultados do Servidor de Idioma para a IU&amp;#34;
V--&amp;gt;&amp;gt;U: &amp;#34;Exibir realce de sintaxe e erros&amp;#34;
&lt;/pre>
&lt;p>O VS Code no lado do Windows funciona como um mero &amp;ldquo;cliente fino (IU)&amp;rdquo;, e todos os processos pesados como Servidor de Linguagem (Language Server), depurador e execução no terminal são tratados pelo &amp;ldquo;VS Code Server&amp;rdquo; no lado do WSL. Isso permite que você mantenha seu ambiente limpo usando apenas o lado do WSL, sem ter que instalar o Node.js ou Python no lado do Windows.&lt;/p>
&lt;h3 id="configurações-essenciais-do-vs-code">Configurações Essenciais do VS Code
&lt;/h3>&lt;p>Instale a extensão &lt;strong>&amp;ldquo;WSL&amp;rdquo; (ms-vscode-remote.remote-wsl)&lt;/strong> a partir de &amp;ldquo;Extensões&amp;rdquo; no VS Code. Em seguida, navegue até o diretório do seu projeto no terminal do WSL e simplesmente execute &lt;code>code .&lt;/code> para iniciar o VS Code no lado do Windows com esse diretório aberto.&lt;/p>
&lt;p>&lt;strong>Nota importante (Problema com o código de quebra de linha):&lt;/strong>
Windows e Linux usam códigos de quebra de linha diferentes (Windows usa &lt;code>CRLF&lt;/code>, Linux usa &lt;code>LF&lt;/code>). Ao desenvolver no WSL, certifique-se de unificar a configuração &lt;code>core.autocrlf&lt;/code> do Git e as configurações padrão de arquivos do VS Code para &lt;code>LF&lt;/code>. Se não fizer isso, você poderá sofrer com erros misteriosos ao executar scripts de shell ou contêineres Docker.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Configuração do código de quebra de linha do Git no lado do WSL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config --global core.autocrlf input
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Adicione também o seguinte ao &lt;code>settings.json&lt;/code> (configurações remotas) do VS Code:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;files.eol&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;\n&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;terminal.integrated.defaultProfile.linux&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;zsh&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="7-otimização-do-docker-desktop-e-integração-wsl2">7. Otimização do Docker Desktop e Integração WSL2
&lt;/h2>&lt;p>Para usar o Docker no ambiente WSL2, existem principalmente duas abordagens:&lt;/p>
&lt;ol>
&lt;li>Instalar o &lt;strong>Docker Desktop for Windows&lt;/strong> e ativar o recurso de integração com o WSL2&lt;/li>
&lt;li>Instalar o &lt;strong>Docker Engine nativo&lt;/strong> diretamente dentro do WSL2 (Ubuntu, etc.)&lt;/li>
&lt;/ol>
&lt;h3 id="abordagem-1-docker-desktop-recomendado">Abordagem 1: Docker Desktop (Recomendado)
&lt;/h3>&lt;p>Esta abordagem é recomendada na maioria dos casos porque facilita o gerenciamento via GUI e o acesso transparente a contêineres entre Windows/WSL. Verifique o seguinte nas Configurações (Settings) do Docker Desktop:&lt;/p>
&lt;ul>
&lt;li>Em &lt;code>General&lt;/code>, marque a opção &lt;code>Use the WSL 2 based engine&lt;/code>.&lt;/li>
&lt;li>Em &lt;code>Resources&lt;/code> -&amp;gt; &lt;code>WSL Integration&lt;/code>, marque a opção &lt;code>Enable integration with my default WSL distro&lt;/code> e ligue a chave seletora para a distribuição (Ubuntu) a ser usada.&lt;/li>
&lt;/ul>
&lt;p>Isso permite que o comando &lt;code>docker&lt;/code> seja executado diretamente do terminal do WSL2, e a comunicação com o daemon do Docker ocorra por meio de uma VM leve dedicada (&lt;code>docker-desktop&lt;/code> e &lt;code>docker-desktop-data&lt;/code>) gerenciada pelo Docker Desktop.&lt;/p>
&lt;h3 id="abordagem-2-instalação-direta-do-docker-engine-nativo">Abordagem 2: Instalação Direta do Docker Engine Nativo
&lt;/h3>&lt;p>Se houver restrições de rede corporativa (como evitar taxas de licenciamento do Docker Desktop) ou se você quiser reduzir ao máximo a sobrecarga de desempenho, ative o &lt;code>systemd&lt;/code> em &lt;code>/etc/wsl.conf&lt;/code> e instale o Docker como um servidor Ubuntu puro.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Trecho do procedimento oficial de instalação do Docker no Ubuntu WSL2 com systemd ativado&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get install ca-certificates curl gnupg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo install -m &lt;span class="m">0755&lt;/span> -d /etc/apt/keyrings
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -fsSL https://download.docker.com/linux/ubuntu/gpg &lt;span class="p">|&lt;/span> sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chmod a+r /etc/apt/keyrings/docker.gpg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Adição do repositório&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="s2">&amp;#34;deb [arch=&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>dpkg --print-architecture&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34; signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>. /etc/os-release &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$VERSION_CODENAME&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34; stable&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Adicionar o usuário atual ao grupo docker (para executar sem sudo)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo usermod -aG docker &lt;span class="nv">$USER&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Após a reinicialização, o &lt;code>systemctl start docker&lt;/code> funcionará exatamente como em um ambiente Linux nativo, oferecendo alto desempenho.&lt;/p>
&lt;hr>
&lt;h2 id="8-integração-da-chave-ssh-autenticação-perfeita-entre-windows-e-wsl">8. Integração da Chave SSH: Autenticação Perfeita entre Windows e WSL
&lt;/h2>&lt;p>Ao clonar repositórios Git via SSH ou conectar-se a servidores remotos via SSH, é muito trabalhoso gerenciar chaves SSH separadamente nos lados do Windows e do WSL. Para equilibrar segurança e conveniência, configuraremos uma ponte entre o agente SSH em execução no lado do Windows (ou um gerenciador de senhas como o 1Password) e o lado do WSL.&lt;/p>
&lt;p>Aqui, explicaremos o método de usar a &lt;strong>funcionalidade de agente SSH do 1Password&lt;/strong> ou o &lt;strong>OpenSSH Authentication Agent do Windows&lt;/strong> como a abordagem mais segura e moderna, encaminhando-o para o soquete de domínio UNIX do WSL2 usando &lt;code>npiperelay&lt;/code> e &lt;code>socat&lt;/code>.&lt;/p>
&lt;h3 id="encaminhamento-de-soquete-do-ssh-agent">Encaminhamento de Soquete do ssh-agent
&lt;/h3>&lt;p>O agente SSH, que normalmente é fornecido como um Named Pipe (pipe nomeado) no Windows, deve ser convertido em um arquivo de soquete no lado do WSL. É fácil fazer isso usando recursos fornecidos pelo &lt;code>wsl-ssh-agent&lt;/code> ou pelo 1Password.&lt;/p>
&lt;p>Na tela de configurações do 1Password, ative &amp;ldquo;Developer&amp;rdquo; -&amp;gt; &amp;ldquo;Usar Agente SSH&amp;rdquo;.
Em seguida, adicione as seguintes configurações ao &lt;code>~/.zshrc&lt;/code> ou &lt;code>~/.bashrc&lt;/code> do lado do WSL para vincular automaticamente o soquete ao fazer login.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Adição ao ~/.zshrc (Exemplo ao usar o 1Password SSH Agent)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">SSH_AUTH_SOCK&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$HOME&lt;/span>/.ssh/agent.sock
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Encaminhar usando socat e npiperelay se o soquete não existir ou o processo não estiver vinculado quando o WSL iniciar&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ALREADY_RUNNING&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>ps -aux &lt;span class="p">|&lt;/span> grep &lt;span class="s2">&amp;#34;[n]piperelay.exe -ei -s //./pipe/openssh-ssh-agent&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> wc -l&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> &lt;span class="nv">$ALREADY_RUNNING&lt;/span> -eq &lt;span class="m">0&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> -S &lt;span class="nv">$SSH_AUTH_SOCK&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rm &lt;span class="nv">$SSH_AUTH_SOCK&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Inicia o socat em segundo plano e conecta o Named Pipe do lado do Windows ao soquete UNIX do lado do WSL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">(&lt;/span>setsid socat UNIX-LISTEN:&lt;span class="nv">$SSH_AUTH_SOCK&lt;/span>,fork EXEC:&lt;span class="s2">&amp;#34;npiperelay.exe -ei -s //./pipe/openssh-ssh-agent&amp;#34;&lt;/span>,nofork &lt;span class="p">&amp;amp;&lt;/span>&lt;span class="o">)&lt;/span> &amp;gt;/dev/null 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;ul>
&lt;li>É necessário instalar o &lt;code>npiperelay.exe&lt;/code> no lado do Windows e adicionar seu caminho ao PATH antecipadamente.&lt;/li>
&lt;/ul>
&lt;p>Quando essa configuração estiver concluída, a execução de &lt;code>ssh-add -l&lt;/code> a partir do terminal do WSL exibirá uma lista de chaves públicas das chaves SSH registradas no 1Password ou no lado do Windows. Isso permite que você passe pela autenticação com segurança, sem copiar arquivos de chave privada para dentro do WSL.&lt;/p>
&lt;hr>
&lt;h2 id="9-manutenção-otimização-compactação-de-vhdx-inchado">9. Manutenção: Otimização (Compactação) de VHDX Inchado
&lt;/h2>&lt;p>Uma das maiores falhas do WSL2 é a especificação de que &amp;ldquo;mesmo se você excluir imagens do Docker ou arquivos, o tamanho do arquivo do disco virtual do lado do Windows (.vhdx) não será reduzido automaticamente&amp;rdquo;. Após um longo período de desenvolvimento, o arquivo ext4.vhdx pode inchar para dezenas a centenas de gigabytes.&lt;/p>
&lt;p>Para liberar espaço em disco, você deve otimizar (Compactar) periodicamente o VHDX no lado do Windows.&lt;/p>
&lt;ol>
&lt;li>Primeiro, desligue completamente o WSL.
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-shutdown&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;li>Abra o PowerShell com privilégios de administrador e execute o comando &lt;code>diskpart&lt;/code> a seguir ou o comando &lt;code>Optimize-VHD&lt;/code> do módulo Hyper-V (o último só pode ser usado se o Hyper-V estiver ativado).&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Quando o módulo Hyper-V está disponível&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Optimize-VHD&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$env:LOCALAPPDATA&lt;/span>&lt;span class="s2">\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx&amp;#34;&lt;/span> &lt;span class="n">-Mode&lt;/span> &lt;span class="n">Full&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Quando usar o diskpart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">diskpart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Digite interativamente no prompt abaixo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="nb">select &lt;/span>&lt;span class="n">vdisk&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="s2">&amp;#34;C:\Users\&amp;lt;NomeDoUsuario&amp;gt;\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">attach&lt;/span> &lt;span class="n">vdisk&lt;/span> &lt;span class="n">readonly&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">compact&lt;/span> &lt;span class="n">vdisk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">detach&lt;/span> &lt;span class="n">vdisk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">exit&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Ao executar essa operação regularmente, você pode recuperar o espaço consumido desnecessariamente na unidade C.&lt;/p>
&lt;hr>
&lt;h2 id="10-conclusão">10. Conclusão
&lt;/h2>&lt;p>O WSL2 transcendeu completamente o quadro de ser apenas um &amp;ldquo;Linux de bônus rodando no Windows&amp;rdquo; e evoluiu para uma plataforma de desenvolvimento poderosa que rivaliza ou até supera o MacOS ou máquinas Linux nativas.&lt;/p>
&lt;p>Ao aplicar todas as configurações explicadas desta vez (otimização de recursos com &lt;code>.wslconfig&lt;/code>, aprimoramento de terminal com Zsh + Powerlevel10k, acesso transparente com VS Code Remote e integração SSH e manutenção de VHDX), o &amp;ldquo;ambiente de desenvolvimento definitivo&amp;rdquo; livre de estresse, rápido e seguro estará completo.&lt;/p>
&lt;p>Demora um pouco para configurar o ambiente, mas uma vez que você consolide suas configurações, não há dúvida de que sua produtividade em engenharia melhorará drasticamente de agora em diante. Sinta-se à vontade para explorar mais personalizações com base neste guia para atender aos seus próprios projetos e preferências.&lt;/p></description></item></channel></rss>