Perché WSL2 e Docker riempiono il disco: come ridurre ext4.vhdx
Il disco virtuale cresce e non si riduce mai da solo
Risposta breve: WSL2 conserva l'intero file system Linux in un disco virtuale chiamato `ext4.vhdx`. Quel file cresce quando serve ma NON si riduce quando elimini file al suo interno. Per recuperare spazio, pulisci prima dentro la distribuzione, poi esegui `wsl --shutdown` e compatta il file con `diskpart`.
È la causa più comune del «il disco C è pieno e non trovo cosa lo occupa» su una macchina di sviluppo. Gli strumenti di analisi mostrano un unico file da 80 GB e non te la senti di toccarlo — giustamente, perché eliminarlo porterebbe via tutto il tuo ambiente Linux. Questa guida spiega cos'è quel file, come ridurlo in sicurezza e come evitare che si gonfi di nuovo.
In sintesi
- WSL2 conserva l'intero file system Linux in un unico disco virtuale `ext4.vhdx` che cresce ma non si riduce mai automaticamente.
- Il file si trova di solito in `%LOCALAPPDATA%\Packages\<distribuzione>\LocalState\ext4.vhdx`; Docker Desktop usa un proprio `docker_data.vhdx`.
- L'ordine conta: elimina prima i dati DENTRO la distribuzione, poi compatta il disco virtuale.
- Con Docker, `docker system prune -a --volumes` da solo libera spesso decine di gigabyte.
- `wsl --shutdown` è obbligatorio prima di compattare: un file in uso non può essere ridotto.
- Da WSL 2.0, aggiungere `sparseVhd=true` in `.wslconfig` fa sì che il disco si riduca da solo nel tempo.
Perché cresce e non si riduce mai
WSL2 è una vera macchina virtuale e conserva l'intero file system Linux lato Windows in un unico file: `ext4.vhdx`. È un disco virtuale a espansione dinamica. Con 5 GB di dati dentro, il file occupa circa 5 GB; scrivendo 60 GB, cresce fino a 60 GB.
Il problema nasce nella direzione opposta. Elimina all'interno un'immagine Docker da 50 GB e Linux segnala lo spazio come libero — ma il file VHDX su Windows resta esattamente della stessa dimensione. Il formato si limita a marcare i blocchi liberati come inutilizzati senza accorciare fisicamente il file. Risultato: `df -h` mostra molto spazio dentro mentre Windows segnala un disco C pieno.
Docker Desktop con backend WSL2 raddoppia l'effetto. Docker installa una propria distribuzione e conserva immagini, layer e volumi in un `docker_data.vhdx` separato. Su una macchina di sviluppo usata da un paio d'anni, i due file insieme superano tranquillamente i 100 GB.
Prima l'interno: cosa eliminare prima di compattare
La compattazione non fa magie; restituisce solo blocchi realmente liberi all'interno. Per questo il primo passo è sempre pulire la distribuzione. Su sistemi basati su Debian e Ubuntu, `sudo apt clean` rimuove la cache dei pacchetti scaricati e `sudo apt autoremove --purge` elimina le dipendenze di cui nessun pacchetto ha più bisogno.
Con Docker il guadagno vero è lì. `docker system df` mostra quanto occupano separatamente immagini, container, volumi e cache di build. `docker system prune -a --volumes` rimuove tutto ciò che non è in uso — attenzione, elimina anche i volumi inutilizzati: esporta prima qualsiasi database da conservare.
La cache di build è spesso la voce più grande e la più facile da dimenticare. `docker builder prune -a` colpisce solo quella cache e lascia intatte le immagini. Nei progetti Node.js, le cartelle `node_modules` dentro WSL più `~/.npm` e `~/.cache` aggiungono altre decine di gigabyte.
Compattare: restituire lo spazio a Windows
Pulito l'interno, resta da accorciare fisicamente il disco virtuale. Il presupposto è che WSL sia completamente fermo: esegui `wsl --shutdown` in PowerShell e chiudi Docker Desktop. Se un processo tiene ancora il file, la compattazione fallisce con un errore di accesso negato.
In una PowerShell con privilegi di amministratore avvia `diskpart` ed esegui questi passaggi in ordine: `select vdisk file="C:\Users\nome\AppData\Local\Packages\...\ext4.vhdx"`, poi `attach vdisk readonly`, poi `compact vdisk` e infine `detach vdisk`. Il montaggio in sola lettura è importante; montato in scrittura, la compattazione non parte.
Sui sistemi con i componenti Hyper-V installati esiste un'alternativa da una riga: `Optimize-VHD -Path "percorso\ext4.vhdx" -Mode Full`. Quel cmdlet manca nelle edizioni Home di Windows, il che rende `diskpart` la scelta predefinita più sicura. Al termine la dimensione del file dovrebbe avvicinarsi all'occupazione reale interna.
Evitare che si ripeta
Con WSL 2.0 Microsoft ha aggiunto il supporto ai dischi virtuali sparsi. Aggiungi `sparseVhd=true` sotto un'intestazione `[experimental]` in `%USERPROFILE%\.wslconfig`, esegui `wsl --shutdown`, e i dischi creati da quel momento iniziano a ridursi da soli quando si libera spazio all'interno. Per convertire una distribuzione esistente usa `wsl --manage <distribuzione> --set-sparse true`.
Due abitudini aiutano ulteriormente. Primo, svuotare regolarmente la cache di build di Docker — `docker builder prune -a` una volta al mese basta sulla maggior parte delle macchine. Secondo, tenere i grandi insiemi di dati lato Windows e accedervi tramite `/mnt/c` invece di conservarli nel file system WSL, così quei dati non gonfiano mai il disco virtuale.
Accorgersi di questi file è già di per sé un problema, perché appaiono come un unico file e non risaltano negli strumenti che ragionano per dimensione di cartella. Il modulo File di grandi dimensioni (Large Files) di Disk Mop ordina per dimensione i file più grandi di un'unità, e `ext4.vhdx` finisce di solito tra i primi tre. La vista Disk Treemap mostra lo stesso file come un rettangolo che occupa buona parte dello schermo.
Domande frequenti
Posso semplicemente eliminare ext4.vhdx?
No. Quel file È la tua distribuzione WSL: pacchetti installati, progetti e database si trovano tutti lì dentro. Eliminarlo rimuove del tutto la distribuzione. Il modo corretto è pulire il contenuto e poi compattare il disco.
La compattazione mette a rischio i miei dati?
No. `compact vdisk` scarta soltanto i blocchi inutilizzati del file di disco virtuale; non tocca i dati nel file system. Resta comunque buona pratica arrestare WSL correttamente con `wsl --shutdown` e avere un backup dei progetti critici.
Dove si trova il file di Docker Desktop?
Nelle versioni attuali in `%LOCALAPPDATA%\Docker\wsl\disk\docker_data.vhdx`. Le versioni più vecchie installano una distribuzione WSL separata chiamata `docker-desktop-data`, con il file in `%LOCALAPPDATA%\Docker\wsl\data\ext4.vhdx`.
Con sparseVhd attivo devo ancora compattare?
Di solito no, ma i dischi sparsi recuperano spazio gradualmente, non all'istante. Dopo una cancellazione molto grande, compattare a mano resta più rapido. Inoltre `sparseVhd` si applica automaticamente solo ai dischi creati dopo averlo attivato.
Verdetto
Che WSL2 e Docker riempiano il disco non è un difetto: è il comportamento dei dischi virtuali. La regola è semplice: pulisci l'interno, arresta WSL, compatta il disco. Questi tre passaggi recuperano 20-60 GB in una volta sola sulla maggior parte delle macchine di sviluppo.
Per una soluzione duratura attiva `sparseVhd=true` e svuota regolarmente la cache di build. Se vuoi vedere cos'altro si è accumulato, i moduli File di grandi dimensioni e Disk Treemap di Disk Mop fanno emergere questo tipo di casi in pochi secondi.
Scopri quali altri file enormi occupano il tuo disco
Pagamento una tantum per l'accesso a vita a tutte le funzionalità. Nessun abbonamento, nessun costo nascosto.
Scarica Disk Mop ora