Gestire lo spazio disco di Podman su Windows (WSL2): guida completa

Immagine di copertina

Ti è mai capitato di vedere il tuo disco di sistema principale occupato per 2/3 da Podman su Windows, senza riuscire a capire cosa stesse occupando tutto quello spazio? E magari, anche dopo aver rimosso immagini e container, lo spazio non si liberava?

Questo è un problema comune quando si usa Podman su Windows con WSL2, e la causa principale è il comportamento del file VHDX che contiene il filesystem della distribuzione WSL2 usata da Podman.

Indice


Come funziona l’allocazione dello spazio

Architettura Podman su Windows

Podman su Windows utilizza WSL2 (Windows Subsystem for Linux 2) per eseguire i container. L’architettura è la seguente:

Windows Host
└── WSL2
    └── Distribuzione "podman-machine-default"
        └── Filesystem ext4 (dentro un file VHDX)
            ├── Immagini container
            ├── Layer intermedi (da build)
            ├── Container (attivi e fermati)
            ├── Volumi
            └── Cache di build

Il file VHDX

Quando lo spazio occupato cresce senza mai diminuire, il cuore del problema risiede nel file VHDX che contiene il filesystem della distribuzione WSL2 usata da Podman. Il percorso di questo file è:

%USERPROFILE%\.local\share\containers\podman\machine\wsl\wsldist\podman-machine-default\ext4.vhdx

Questo è un disco virtuale dinamico (Virtual Hard Disk eXtended) che:

  • Cresce automaticamente quando si scrivono dati (pull di immagini, build, creazione container)
  • NON si riduce automaticamente quando i dati vengono cancellati

Questo comportamento è by-design di WSL2/Hyper-V: il VHDX alloca nuovi blocchi quando servono, ma non li rilascia quando vengono liberati all’interno del filesystem guest.

Cosa occupa spazio

ElementoDescrizioneAccumulo tipico
ImmaginiImmagini scaricate con podman pull o create con podman buildAlto
Immagini danglingImmagini intermedie senza tag (<none>) da build ripetuteMolto alto
Container fermatiContainer in stato “exited” che mantengono il loro layer scrivibileMedio
Volumi orfaniVolumi non più associati a nessun containerMedio
Cache di buildLayer intermedi cachati durante le build multi-stageAlto

Struttura della cartella WSL di Podman

Se volessi esplorare manualmente la cartella di Podman su Windows, la struttura è la seguente:

~\.local\share\containers\podman\machine\wsl\
├── wsldist\
│   └── podman-machine-default\
│       └── ext4.vhdx              ← IL DISCO VIRTUALE (può crescere enormemente)
├── podman-machine-default-amd64   ← Immagine base della distribuzione (~770 MB)
└── cache\
    └── *.tar.zst                  ← Cache dei download (~230 MB)

Analisi dello spazio occupato

Immagina che il tuo disco di sistema principale sia occupato per 2/3 da Podman, ma non riesci a capire cosa sta occupando tutto quello spazio. Ecco come analizzare la situazione:

1. Verificare la dimensione del VHDX

$vhdx = "$env:USERPROFILE\.local\share\containers\podman\machine\wsl\wsldist\podman-machine-default\ext4.vhdx"
$sizeGB = [math]::Round((Get-Item $vhdx).Length / 1GB, 2)
Write-Host "Dimensione VHDX: $sizeGB GB"

Questo comando ti darà la dimensione attuale del file VHDX, che rappresenta lo spazio fisico occupato su disco. Se è molto grande (es. > 50 GB), è un segnale che c’è molto spazio allocato dentro la VM.

Un’alternativa è quella di usare strumenti come Treesize, che mostrano la dimensione dei file e cartelle su Windows, anche se spesso non riescono a interpretare correttamente i file VHDX, mostrando solo la dimensione del file stesso (es. 200 GB) senza indicare lo spazio effettivamente utilizzato all’interno.

2. Verificare cosa occupa spazio dentro Podman

A questo punto, ci rivolgiamo a Podman: cosa sta occupando spazio dentro la VM? Usiamo i comandi di sistema per analizzare l’occupazione:

# Riepilogo generale dello spazio usato
podman system df

>>>

TYPE           TOTAL       ACTIVE      SIZE        RECLAIMABLE
Images         0           0           0B          0B (0%)
Containers     0           0           0B          0B (0%)
Local Volumes  0           0           0B          0B (0%)

# Dettaglio per singola immagine/container/volume
podman system df -v

Nell’esempio, non ci sono immagini o container attivi, ma se ci fossero, potresti vedere la dimensione totale e quanto di essa è recuperabile (reclaimable) cancellando le risorse non più necessarie.

3. Elencare le immagini dangling (senza tag)

Spesso capita che, nell’eseguire la build di un’immagine, vengano creati layer intermedi che non vengono più referenziati da nessuna immagine taggata. Questi layer “dangling” occupano spazio ma non sono visibili con un semplice podman images.

podman images -f "dangling=true"

Questo comando mostrerà tutte le immagini intermedie che non hanno un tag associato e che possono essere rimosse in sicurezza.

4. Elencare i container arrestati

Altrettanto importante è verificare se ci sono container in stato “exited” che occupano spazio. Anche se non sono attivi, mantengono il loro layer scrivibile e possono occupare spazio significativo.

podman ps -a -f "status=exited"

5. Elencare i volumi orfani

Ultimo, ma non ultimo, i volumi “orfani”: sono quelli che non sono più associati a nessun container. Possono essere rimossi in sicurezza se non contengono dati importanti. Per verificarne la presenza:

podman volume ls -f "dangling=true"

Procedura di pulizia e recupero spazio

Ora che abbiamo identificato cosa sta occupando spazio, è il momento di liberarlo. La procedura è divisa in due fasi: una prima dedicata a rimuovere tutto ciò che non è uso, utilizzando il comando podman prune, e una seconda fase dedicata alla compattazione del VHDX per recuperare lo spazio fisico su disco.

Fase 1 — Pulizia logica dentro Podman

Questa fase rimuove i dati non più necessari dall’interno della VM. È un’operazione sicura: non cancella immagini in uso o container attivi. Infatti, rimuove container arrestati, immagini non referenziate, volumi orfani e cache di build.

podman system prune -a -f

Nota: Se vuoi preservare le immagini taggate e rimuovere solo quelle dangling:

podman system prune -f   # senza -a

Dopo aver eseguito questo step, verifica lo spazio recuperato:

podman system df

Se il risultato non è soddisfacente, procedi con la Fase 2 per recuperare lo spazio fisico su disco.

Fase 2 — Compattazione del VHDX

Dopo la Fase 1, lo spazio è stato liberato dentro il filesystem della VM, ma il file VHDX su Windows mantiene la stessa dimensione. Bisogna compattarlo esplicitamente.

Prerequisiti

  • Arrestare l’esecuzione di tutti i container in esecuzione
  • Avere privilegi di amministrazione su Windows

Procedura

# 1. Ferma la macchina Podman
podman machine stop

# 2. Chiudi completamente WSL (rilascia il lock sul VHDX)
wsl --shutdown

# 3. Prepara lo script per diskpart
$vhdxPath = "$env:USERPROFILE\.local\share\containers\podman\machine\wsl\wsldist\podman-machine-default\ext4.vhdx"
@"
select vdisk file="$vhdxPath"
attach vdisk readonly
compact vdisk
detach vdisk
exit
"@ | Set-Content "$env:TEMP\compact_vhdx.txt"

# 4. Esegui diskpart come amministratore
#    (Si aprirà una finestra UAC per conferma)
Start-Process -FilePath "diskpart.exe" -ArgumentList "/s $env:TEMP\compact_vhdx.txt" -Verb RunAs -Wait

# 5. Verifica la nuova dimensione
$newSize = [math]::Round((Get-Item $vhdxPath).Length / 1GB, 2)
Write-Host "Nuova dimensione VHDX: $newSize GB"

# 6. Riavvia la macchina Podman
podman machine start

Questa operazione farà sì che il file VHDX venga compattato, liberando lo spazio fisico su disco corrispondente allo spazio logico liberato all’interno della VM. Ci vorrà qualche minuto, a seconda della dimensione del VHDX e della quantità di spazio da recuperare, quindi pazienta!

Il VHDX si ridurrà proporzionalmente allo spazio effettivamente libero all’interno del filesystem. Esempio reale per dare un’idea dell’impatto:

MetricaPrimaDopo
Spazio logico recuperato (prune)23,27 GB
Dimensione VHDX188,96 GB31,21 GB
Spazio totale recuperato~158 GB

Fase 3 (opzionale) — Ricreare la macchina da zero

Se la compattazione non è sufficiente o si vuole ripartire da una situazione pulita, si possono seguire questi passaggi per eliminare completamente la macchina Podman e ricrearla con un disco di dimensione limitata:

# ⚠️ ATTENZIONE: cancella TUTTE le immagini, container e volumi!
podman machine stop
podman machine rm podman-machine-default
podman machine init --disk-size 50   # limita a 50 GB il massimo
podman machine start

Tip: Pulizia aggiuntiva — Cache di download

La cartella cache contiene i file scaricati per creare la VM. Può essere eliminata in sicurezza (~230 MB):

Remove-Item "$env:USERPROFILE\.local\share\containers\podman\machine\wsl\cache" -Recurse -Force

Verrà ricreata automaticamente solo se si inizializza una nuova macchina.

Tip: Abilitare il VHDX sparse (rilascio automatico dello spazio)

Da WSL 2.0+ è disponibile l’opzione sperimentale sparseVhd che rende il disco virtuale in grado di restituire automaticamente lo spazio liberato, eliminando la necessità di compattazione manuale.

Importante: questa opzione deve essere abilitata prima della creazione della distribuzione WSL per avere effetto.

Aggiungere al file %USERPROFILE%\.wslconfig:

[wsl2]
[experimental]
sparseVhd=true

Dopo aver modificato il file:

# Riavviare WSL per applicare la configurazione
wsl --shutdown

# Se necessario, ricreare la macchina Podman per beneficiare del nuovo formato
podman machine stop
podman machine rm podman-machine-default
podman machine init --disk-size 50
podman machine start

Con questa opzione attiva, il VHDX rilascerà automaticamente i blocchi non più utilizzati, rendendo superflua la Fase 2 (compattazione con diskpart).

Riferimenti utili

Conosci meglio chi ha scritto questo articolo

Serena Sensini

Ciao! Mi chiamo Serena Sensini e sono la creatrice di @ TheRedCode.it. Ho aperto questo blog nel 2021 per raccontare il mio lavoro e il mondo dell’informatica a parole semplici, in piccole pillole e alla portata di tutte le persone.

Sono un’ingegnera informatica specializzata in ambito AI & NLP. Di giorno lavoro come CTO @ Welyk e come Innovation & Emerging Technologies Leader @ Dedalus, mentre di notte scrivo e sono autrice di 5 libri -per ora-. 🖊️

Foto di Serena Sensini

Partners

Community, aziende e persone che supportano attivamente il blog

Vuoi diventare partner?

Collaboriamo con community, aziende e strumenti del mondo tech che vogliono raggiungere la nostra community di dev ed engineer italiani. Scrivici per proporre una collaborazione.

✉️ Scrivici

Vuoi diventare tech content creator? 🖊️

Se ti va di raccontare la tua esperienza nel mondo tech, questo è il posto giusto.

Cerchiamo voci autentiche, esempi pratici e punti di vista utili per chi legge.

Scrivici a collaborazioni[at]theredcode.it con una proposta: idea, taglio del contenuto e una breve presentazione. Non vediamo l'ora di leggere la tua esperienza!

Invia la tua idea