Por que WSL2 e Docker enchem o disco: como reduzir o ext4.vhdx
O disco virtual cresce e nunca encolhe sozinho
Resposta curta: o WSL2 guarda todo o seu sistema de arquivos Linux em um disco virtual chamado `ext4.vhdx`. Esse arquivo cresce conforme a necessidade, mas NÃO diminui quando você apaga arquivos lá dentro. Para recuperar espaço, limpe primeiro dentro da distribuição, depois execute `wsl --shutdown` e compacte o arquivo com o `diskpart`.
É a causa mais comum do «meu disco C está cheio e não encontro o que está ocupando» em uma máquina de desenvolvimento. As ferramentas de análise mostram um único arquivo de 80 GB e você hesita em mexer nele — com razão, porque apagá-lo levaria junto todo o seu ambiente Linux. Este guia explica o que é esse arquivo, como reduzi-lo com segurança e como evitar que inche de novo.
Pontos principais
- O WSL2 guarda todo o sistema de arquivos Linux em um único disco virtual `ext4.vhdx` que cresce, mas nunca encolhe automaticamente.
- O arquivo costuma ficar em `%LOCALAPPDATA%\Packages\<distribuição>\LocalState\ext4.vhdx`; o Docker Desktop usa seu próprio `docker_data.vhdx`.
- A ordem importa: apague primeiro os dados DENTRO da distribuição e só depois compacte o disco virtual.
- No Docker, `docker system prune -a --volumes` sozinho costuma liberar dezenas de gigabytes.
- `wsl --shutdown` é obrigatório antes de compactar: um arquivo em uso não pode ser reduzido.
- A partir do WSL 2.0, incluir `sparseVhd=true` no `.wslconfig` faz o disco encolher sozinho com o tempo.
Por que ele cresce e nunca encolhe
O WSL2 é uma máquina virtual de verdade e guarda todo o sistema de arquivos Linux do lado do Windows em um único arquivo: `ext4.vhdx`. É um disco virtual de expansão dinâmica. Com 5 GB de dados dentro, o arquivo ocupa cerca de 5 GB; ao escrever 60 GB, ele cresce para 60 GB.
O problema surge no sentido contrário. Apague lá dentro uma imagem Docker de 50 GB e o Linux informará o espaço como livre — mas o arquivo VHDX no Windows continua exatamente do mesmo tamanho. O formato apenas marca os blocos liberados como não usados, sem encurtar fisicamente o arquivo. Resultado: `df -h` mostra bastante espaço dentro enquanto o Windows acusa disco C cheio.
O Docker Desktop com backend WSL2 dobra o efeito. O Docker instala a própria distribuição e guarda imagens, camadas e volumes em um `docker_data.vhdx` separado. Em uma máquina de desenvolvimento usada por alguns anos, os dois arquivos juntos passam facilmente de 100 GB.
Primeiro por dentro: o que apagar antes de compactar
Compactar não faz mágica; só devolve blocos que estão realmente livres lá dentro. Por isso o primeiro passo é sempre limpar a distribuição. Em sistemas baseados em Debian e Ubuntu, `sudo apt clean` remove o cache de pacotes baixados e `sudo apt autoremove --purge` tira as dependências de que nenhum pacote precisa mais.
Se você usa Docker, é ali que está o ganho real. `docker system df` detalha quanto ocupam imagens, contêineres, volumes e cache de build. `docker system prune -a --volumes` remove tudo o que não está em uso — atenção, isso também apaga volumes não utilizados: exporte antes qualquer banco de dados que queira manter.
O cache de build costuma ser o maior item e o mais fácil de esquecer. `docker builder prune -a` atinge somente esse cache e deixa suas imagens intactas. Em projetos Node.js, as pastas `node_modules` dentro do WSL mais `~/.npm` e `~/.cache` somam outras dezenas de gigabytes.
Compactar: devolver o espaço ao Windows
Com o interior limpo, resta encurtar fisicamente o disco virtual. O pré-requisito é que o WSL esteja totalmente parado: execute `wsl --shutdown` no PowerShell e feche o Docker Desktop. Se algum processo ainda segurar o arquivo, a compactação falha com erro de acesso negado.
Em um PowerShell com privilégios de administrador inicie o `diskpart` e execute estes passos na ordem: `select vdisk file="C:\Users\nome\AppData\Local\Packages\...\ext4.vhdx"`, depois `attach vdisk readonly`, então `compact vdisk` e por fim `detach vdisk`. A montagem somente leitura é importante; montado para escrita, a compactação não roda.
Em sistemas com os componentes do Hyper-V instalados existe uma alternativa de uma linha: `Optimize-VHD -Path "caminho\ext4.vhdx" -Mode Full`. Esse cmdlet não existe nas edições Home do Windows, o que torna o caminho do `diskpart` o padrão mais seguro. Ao terminar, o tamanho do arquivo deve ficar perto do uso real interno.
Para não acontecer de novo
Com o WSL 2.0 a Microsoft acrescentou suporte a discos virtuais esparsos. Adicione `sparseVhd=true` sob um cabeçalho `[experimental]` em `%USERPROFILE%\.wslconfig`, execute `wsl --shutdown`, e os discos criados a partir daí começam a encolher sozinhos conforme o espaço é liberado por dentro. Para converter uma distribuição existente use `wsl --manage <distribuição> --set-sparse true`.
Dois hábitos ajudam além disso. Primeiro, limpar o cache de build do Docker com regularidade — `docker builder prune -a` uma vez por mês basta na maioria das máquinas. Segundo, manter conjuntos de dados grandes do lado do Windows e acessá-los por `/mnt/c` em vez de guardá-los no sistema de arquivos do WSL, para que esses dados nunca inflem o disco virtual.
Perceber esses arquivos já é um problema em si, porque aparecem como um único arquivo e não se destacam em ferramentas que raciocinam por tamanho de pasta. O módulo Arquivos grandes (Large Files) do Disk Mop ordena por tamanho os maiores arquivos de uma unidade, e o `ext4.vhdx` costuma ficar entre os três primeiros. A visão Disk Treemap mostra esse mesmo arquivo como um retângulo que ocupa boa parte da tela.
Perguntas frequentes
Posso simplesmente apagar o ext4.vhdx?
Não. Esse arquivo É a sua distribuição WSL: pacotes instalados, projetos e bancos de dados estão todos dentro dele. Apagá-lo remove a distribuição por completo. O caminho correto é limpar o conteúdo e depois compactar o disco.
Compactar coloca meus dados em risco?
Não. O `compact vdisk` apenas descarta blocos não utilizados do arquivo de disco virtual; ele não toca nos dados do sistema de arquivos. Ainda assim, é boa prática encerrar o WSL corretamente com `wsl --shutdown` antes e ter backup dos projetos críticos.
Onde fica o arquivo do Docker Desktop?
Nas versões atuais, em `%LOCALAPPDATA%\Docker\wsl\disk\docker_data.vhdx`. Versões mais antigas instalam uma distribuição WSL separada chamada `docker-desktop-data`, com o arquivo em `%LOCALAPPDATA%\Docker\wsl\data\ext4.vhdx`.
Com o sparseVhd ligado ainda preciso compactar?
Normalmente não, mas discos esparsos recuperam espaço de forma gradual, não instantânea. Depois de uma exclusão muito grande, compactar manualmente ainda é mais rápido. Além disso, o `sparseVhd` vale automaticamente apenas para discos criados após a ativação.
Veredito
O WSL2 e o Docker encherem o disco não é um defeito: é como discos virtuais funcionam. A regra é simples: limpe por dentro, encerre o WSL, compacte o disco. Esses três passos recuperam 20 a 60 GB de uma vez na maioria das máquinas de desenvolvimento.
Como solução duradoura, ative `sparseVhd=true` e limpe o cache de build com regularidade. Se quiser ver o que mais se acumulou, os módulos Arquivos grandes e Disk Treemap do Disk Mop revelam esse tipo de caso em segundos.
Veja quais outros arquivos gigantes estão no seu disco
Pagamento único para acesso vitalício a todos os recursos. Sem assinatura, sem taxas ocultas.
Baixe o Disk Mop Agora