Por qué WSL2 y Docker llenan el disco: cómo reducir ext4.vhdx
El disco virtual crece y nunca se encoge por su cuenta
Respuesta corta: WSL2 guarda todo su sistema de archivos Linux en un disco virtual llamado `ext4.vhdx`. Ese archivo crece según hace falta pero NO se reduce cuando borras archivos dentro. Para recuperar el espacio, limpia primero dentro de la distribución, luego ejecuta `wsl --shutdown` y compacta el archivo con `diskpart`.
Es la causa más habitual del «mi disco C está lleno y no encuentro qué lo ocupa» en un equipo de desarrollo. Las herramientas de análisis muestran un único archivo de 80 GB y dudas en tocarlo — con razón, porque borrarlo se llevaría todo tu entorno Linux. Esta guía explica qué es ese archivo, cómo reducirlo con seguridad y cómo evitar que vuelva a hincharse.
Puntos clave
- WSL2 guarda todo tu sistema de archivos Linux en un único disco virtual `ext4.vhdx` que crece pero nunca se reduce automáticamente.
- El archivo suele estar en `%LOCALAPPDATA%\Packages\<distribución>\LocalState\ext4.vhdx`; Docker Desktop usa su propio `docker_data.vhdx`.
- El orden importa: borra primero los datos DENTRO de la distribución y después compacta el disco virtual.
- Con Docker, `docker system prune -a --volumes` por sí solo suele liberar decenas de gigabytes.
- `wsl --shutdown` es obligatorio antes de compactar: un archivo en uso no se puede reducir.
- Desde WSL 2.0, añadir `sparseVhd=true` en `.wslconfig` hace que el disco se reduzca solo con el tiempo.
Por qué crece y nunca se reduce
WSL2 es una máquina virtual real y guarda todo el sistema de archivos Linux en un único archivo del lado de Windows: `ext4.vhdx`. Es un disco virtual de expansión dinámica. Con 5 GB de datos dentro, el archivo ocupa unos 5 GB; si escribes 60 GB, crece hasta 60 GB.
El problema aparece en el sentido contrario. Borra dentro una imagen de Docker de 50 GB y Linux informará del espacio como libre — pero el archivo VHDX en Windows conserva exactamente el mismo tamaño. El formato solo marca los bloques liberados como no usados, sin acortar físicamente el archivo. Resultado: `df -h` muestra espacio de sobra dentro mientras Windows informa de un disco C lleno.
Docker Desktop con motor WSL2 duplica el efecto. Docker instala su propia distribución y guarda imágenes, capas y volúmenes en un `docker_data.vhdx` aparte. En un equipo de desarrollo con un par de años de uso, ambos archivos juntos superan cómodamente los 100 GB.
Primero por dentro: qué borrar antes de compactar
Compactar no hace magia; solo devuelve bloques que están realmente libres dentro. Por eso el primer paso siempre es limpiar la distribución. En sistemas basados en Debian y Ubuntu, `sudo apt clean` elimina la caché de paquetes descargados y `sudo apt autoremove --purge` quita las dependencias que ya nada necesita.
Si usas Docker, ahí está la ganancia real. `docker system df` desglosa cuánto ocupan imágenes, contenedores, volúmenes y caché de compilación. `docker system prune -a --volumes` elimina todo lo que no esté en uso — ojo, también borra volúmenes sin usar, así que exporta antes cualquier base de datos que quieras conservar.
La caché de compilación suele ser la partida más grande y la más fácil de pasar por alto. `docker builder prune -a` apunta solo a esa caché y deja intactas tus imágenes. En proyectos Node.js, las carpetas `node_modules` dentro de WSL más `~/.npm` y `~/.cache` añaden sus propias decenas de gigabytes.
Compactar: devolver el espacio a Windows
Con el interior limpio, toca acortar físicamente el disco virtual. El requisito es que WSL esté completamente detenido: ejecuta `wsl --shutdown` en PowerShell y cierra Docker Desktop. Si algún proceso sigue reteniendo el archivo, la compactación falla con un error de acceso denegado.
En una PowerShell con permisos de administrador inicia `diskpart` y ejecuta estos pasos en orden: `select vdisk file="C:\Users\nombre\AppData\Local\Packages\...\ext4.vhdx"`, después `attach vdisk readonly`, luego `compact vdisk` y por último `detach vdisk`. El montaje en solo lectura es importante; montado con escritura, la compactación no se ejecuta.
En sistemas con los componentes de Hyper-V instalados existe una alternativa de una línea: `Optimize-VHD -Path "ruta\ext4.vhdx" -Mode Full`. Ese cmdlet no está en las ediciones Home de Windows, lo que hace de `diskpart` la opción predeterminada más segura. Al terminar, el tamaño del archivo debería acercarse al uso real de dentro.
Para que no vuelva a ocurrir
Con WSL 2.0, Microsoft añadió compatibilidad con discos virtuales dispersos (sparse). Añade `sparseVhd=true` bajo un encabezado `[experimental]` en `%USERPROFILE%\.wslconfig`, ejecuta `wsl --shutdown`, y los discos creados a partir de entonces empiezan a reducirse solos a medida que se libera espacio dentro. Para convertir una distribución existente usa `wsl --manage <distribución> --set-sparse true`.
Dos hábitos ayudan además. Primero, purgar la caché de compilación de Docker con regularidad — `docker builder prune -a` una vez al mes basta en la mayoría de equipos. Segundo, guardar los conjuntos de datos grandes del lado de Windows y acceder a ellos por `/mnt/c` en lugar de almacenarlos en el sistema de archivos de WSL, para que esos datos nunca hinchen el disco virtual.
Detectar estos archivos es un problema en sí mismo, porque aparecen como un único archivo y no destacan en herramientas que razonan por tamaño de carpeta. El módulo Archivos grandes (Large Files) de Disk Mop ordena por tamaño los archivos más grandes de una unidad, y `ext4.vhdx` suele quedar entre los tres primeros. La vista Disk Treemap muestra ese mismo archivo como un rectángulo que ocupa buena parte de la pantalla.
Preguntas frecuentes
¿Puedo borrar ext4.vhdx sin más?
No. Ese archivo ES tu distribución de WSL: paquetes instalados, proyectos y bases de datos están todos dentro. Borrarlo elimina la distribución por completo. La forma correcta es limpiar el contenido y luego compactar el disco.
¿Compactar pone en riesgo mis datos?
No. `compact vdisk` solo descarta bloques sin usar del archivo de disco virtual; no toca los datos del sistema de archivos. Aun así, conviene detener WSL correctamente con `wsl --shutdown` antes y tener copia de seguridad de los proyectos críticos.
¿Dónde está el archivo de Docker Desktop?
En las versiones actuales, en `%LOCALAPPDATA%\Docker\wsl\disk\docker_data.vhdx`. Las versiones antiguas instalan una distribución WSL aparte llamada `docker-desktop-data`, con el archivo en `%LOCALAPPDATA%\Docker\wsl\data\ext4.vhdx`.
Con sparseVhd activado, ¿ya no hay que compactar?
Normalmente no, pero los discos dispersos recuperan espacio de forma gradual, no instantánea. Tras un borrado muy grande, compactar a mano sigue siendo más rápido. Además, `sparseVhd` se aplica automáticamente solo a los discos creados después de activarlo.
Veredicto
Que WSL2 y Docker llenen el disco no es un fallo: es el comportamiento de los discos virtuales. La regla es simple: limpia por dentro, detén WSL, compacta el disco. Esos tres pasos recuperan de 20 a 60 GB de una vez en la mayoría de equipos de desarrollo.
Como solución duradera, activa `sparseVhd=true` y purga la caché de compilación con regularidad. Si quieres ver qué más se ha acumulado, los módulos Archivos grandes y Disk Treemap de Disk Mop sacan a la luz este tipo de casos en segundos.
Descubre qué otros archivos gigantes ocupan tu disco
Pago único para acceso de por vida a todas las funciones. Sin suscripción, sin tarifas ocultas.
Descarga Disk Mop ahora