C 盘只剩 1GB罪魁祸首是 WSL2 里的 Docker 缓存19GB。但清理完 Docker 后 C 盘并没有立刻恢复——因为WSL2 的虚拟磁盘ext4.vhdx只会自动膨胀不会自动收缩。最终通过docker system prunefstrimOptimize-VHD三步组合拳回收了约 17GB 空间。起因C 盘告急某天系统开始卡顿一查磁盘Get-PSDrive-Name C可用空间只剩~1GB已经影响正常使用了。排查方向很明确——我机器上跑着多个 WSL 发行版wsl-l-vNAME STATE VERSION * Ubuntu Running 2 podman-machine-default Stopped 2 kali-linux Stopped 2WSL2 的虚拟磁盘是最大嫌疑。第一步定位 VHDX 文件WSL2 把整个 Linux 文件系统打包在一个ext4.vhdx虚拟磁盘中默认存放在 C 盘用户目录下Get-ChildItem-Path$env:LOCALAPPDATA\Packages-Recurse-Filterext4.vhdx找到 Ubuntu 的虚拟磁盘%LOCALAPPDATA%\Packages\CanonicalGroupLimited.Ubuntu_...\LocalState\ext4.vhdx文件大小~25GB。破案了。第二步排查 Linux 内部占用进入 Ubuntu 看看空间都被谁吃了# 文件系统总览wsl-dUbuntu-uroot --sh-lcdf -h /# 各目录占用排序wsl-dUbuntu-uroot --sh-lcdu -sh /home /var /usr /opt /tmp /root 2/dev/null | sort -h结果目录占用/home 1GB/usr~9GB/var~22GB继续深挖/varwsl-dUbuntu-uroot --sh-lcdu -sh /var/* 2/dev/null | sort -h | tail19G /var/lib/dockerDocker 独占 19GB占了 VHDX 总量的 76%。第三步清理 Docker查看 Docker 占用明细wsl-dUbuntu-uroot --sh-lcdocker system df -v可以看到镜像、已停止容器、build cache 各自的占用情况。执行清理wsl-dUbuntu-uroot --sh-lcdocker system prune -af这条命令清理的内容✅ 所有已停止的容器✅ 所有未被引用的镜像✅ 全部 build cache✅ 未使用的网络❌不会删除 volume这是刻意的本次回收~10GB。⚠️关于--volumes参数Docker volume 里通常存放数据库文件、业务数据等有状态内容。除非你明确知道所有 volume 都可以丢弃否则不要加--volumes。清理系统缓存顺手清理 APT 缓存和临时文件wsl-dUbuntu-uroot --sh-lcapt-get clean rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*清理 systemd 日志保留最近 7 天wsl-dUbuntu-uroot --sh-lcjournalctl --vacuum-time7d /dev/null 21 || true清理完成后Ubuntu 内部实际占用24GB → 7.3GB。第四步为什么 C 盘还没恢复这是很多人踩的坑WSL2 的 ext4.vhdx 是只增不减的。Linux 内部删了文件VHDX 文件大小不会自动缩小。必须手动压缩。类比理解就像一个气球吹到 25L即使放掉一半气体气球皮也不会自己缩回去——你需要手动压缩它。第五步压缩 VHDX5.1 执行 fstrim通知底层释放空闲块wsl-dUbuntu-uroot --sh-lcfstrim -av5.2 关闭所有 WSL 实例wsl--shutdown5.3 处理 sparse 文件标记如有如果之前执行过wsl --manage Ubuntu --set-sparse true压缩时会报错虚拟硬盘文件必须是未压缩和未加密的文件并且不能是稀疏文件。检查并关闭 sparse 标记# 检查fsutil sparse queryflag你的ext4.vhdx完整路径# 如果显示 This file is set as sparse执行fsutil sparse setflag你的ext4.vhdx完整路径0# 再次确认应显示 This file is NOT set as sparse5.4 执行压缩需要管理员 PowerShellOptimize-VHD-Path你的ext4.vhdx完整路径-Mode Full 如果系统没有Optimize-VHD非 Pro/Enterprise可以用diskpart替代diskpart select vdisk file你的ext4.vhdx完整路径 compact vdisk detach vdisk exit压缩完成后C 盘空间真正释放。最终结果指标处理前处理后Docker 占用19GB~2GBUbuntu 内部实际占用24GB7.3GBext4.vhdx 文件大小25GB~8GBC 盘可用空间~1GB20GB完整 SOP可直接复用以后再遇到同样问题按顺序执行# ① 确认 C 盘状态Get-PSDrive-Name C# ② 查看 WSL 发行版wsl-l-v# ③ 定位 VHDX 文件Get-ChildItem$env:LOCALAPPDATA\Packages-Recurse-Filterext4.vhdx# ④ 查看 Linux 内部占用wsl-d Ubuntu-u root--sh-lcdf -h /; echo ---; du -sh /var/lib/docker 2/dev/null# ⑤ 清理 Docker不删 volumewsl-d Ubuntu-u root--sh-lcdocker system prune -af# ⑥ 清理系统缓存wsl-d Ubuntu-u root--sh-lcapt-get clean rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*# ⑦ fstrimwsl-d Ubuntu-u root--sh-lcfstrim -av# ⑧ 关闭 WSLwsl--shutdown# ⑨ 压缩 VHDX管理员 PowerShellOptimize-VHD-Path你的ext4.vhdx路径-Mode Full# ⑩ 验证Get-PSDrive-Name C日常维护建议定期检查 Docker 占用docker system df养成习惯别等爆了才清理清理时不要无脑--volumesvolume 里可能有数据库数据误删无法恢复删大文件后记得压缩 VHDXLinux 内部释放空间 ≠ Windows 释放空间必须走 fstrim Optimize-VHD考虑迁移 VHDX 到其他盘如果 D 盘空间充裕可以用wsl --exportwsl --import把整个发行版搬走从根本上解决 C 盘压力一句话总结WSL2 Docker 吃 C 盘的本质Docker 缓存在 Linux 里无限增长而 VHDX 虚拟磁盘只膨胀不收缩。清理数据只是第一步压缩 VHDX 才是真正释放空间的关键。
WSL2 吃掉我 25GB C 盘空间:一次完整的排查与回收记录
发布时间:2026/5/27 8:02:05
C 盘只剩 1GB罪魁祸首是 WSL2 里的 Docker 缓存19GB。但清理完 Docker 后 C 盘并没有立刻恢复——因为WSL2 的虚拟磁盘ext4.vhdx只会自动膨胀不会自动收缩。最终通过docker system prunefstrimOptimize-VHD三步组合拳回收了约 17GB 空间。起因C 盘告急某天系统开始卡顿一查磁盘Get-PSDrive-Name C可用空间只剩~1GB已经影响正常使用了。排查方向很明确——我机器上跑着多个 WSL 发行版wsl-l-vNAME STATE VERSION * Ubuntu Running 2 podman-machine-default Stopped 2 kali-linux Stopped 2WSL2 的虚拟磁盘是最大嫌疑。第一步定位 VHDX 文件WSL2 把整个 Linux 文件系统打包在一个ext4.vhdx虚拟磁盘中默认存放在 C 盘用户目录下Get-ChildItem-Path$env:LOCALAPPDATA\Packages-Recurse-Filterext4.vhdx找到 Ubuntu 的虚拟磁盘%LOCALAPPDATA%\Packages\CanonicalGroupLimited.Ubuntu_...\LocalState\ext4.vhdx文件大小~25GB。破案了。第二步排查 Linux 内部占用进入 Ubuntu 看看空间都被谁吃了# 文件系统总览wsl-dUbuntu-uroot --sh-lcdf -h /# 各目录占用排序wsl-dUbuntu-uroot --sh-lcdu -sh /home /var /usr /opt /tmp /root 2/dev/null | sort -h结果目录占用/home 1GB/usr~9GB/var~22GB继续深挖/varwsl-dUbuntu-uroot --sh-lcdu -sh /var/* 2/dev/null | sort -h | tail19G /var/lib/dockerDocker 独占 19GB占了 VHDX 总量的 76%。第三步清理 Docker查看 Docker 占用明细wsl-dUbuntu-uroot --sh-lcdocker system df -v可以看到镜像、已停止容器、build cache 各自的占用情况。执行清理wsl-dUbuntu-uroot --sh-lcdocker system prune -af这条命令清理的内容✅ 所有已停止的容器✅ 所有未被引用的镜像✅ 全部 build cache✅ 未使用的网络❌不会删除 volume这是刻意的本次回收~10GB。⚠️关于--volumes参数Docker volume 里通常存放数据库文件、业务数据等有状态内容。除非你明确知道所有 volume 都可以丢弃否则不要加--volumes。清理系统缓存顺手清理 APT 缓存和临时文件wsl-dUbuntu-uroot --sh-lcapt-get clean rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*清理 systemd 日志保留最近 7 天wsl-dUbuntu-uroot --sh-lcjournalctl --vacuum-time7d /dev/null 21 || true清理完成后Ubuntu 内部实际占用24GB → 7.3GB。第四步为什么 C 盘还没恢复这是很多人踩的坑WSL2 的 ext4.vhdx 是只增不减的。Linux 内部删了文件VHDX 文件大小不会自动缩小。必须手动压缩。类比理解就像一个气球吹到 25L即使放掉一半气体气球皮也不会自己缩回去——你需要手动压缩它。第五步压缩 VHDX5.1 执行 fstrim通知底层释放空闲块wsl-dUbuntu-uroot --sh-lcfstrim -av5.2 关闭所有 WSL 实例wsl--shutdown5.3 处理 sparse 文件标记如有如果之前执行过wsl --manage Ubuntu --set-sparse true压缩时会报错虚拟硬盘文件必须是未压缩和未加密的文件并且不能是稀疏文件。检查并关闭 sparse 标记# 检查fsutil sparse queryflag你的ext4.vhdx完整路径# 如果显示 This file is set as sparse执行fsutil sparse setflag你的ext4.vhdx完整路径0# 再次确认应显示 This file is NOT set as sparse5.4 执行压缩需要管理员 PowerShellOptimize-VHD-Path你的ext4.vhdx完整路径-Mode Full 如果系统没有Optimize-VHD非 Pro/Enterprise可以用diskpart替代diskpart select vdisk file你的ext4.vhdx完整路径 compact vdisk detach vdisk exit压缩完成后C 盘空间真正释放。最终结果指标处理前处理后Docker 占用19GB~2GBUbuntu 内部实际占用24GB7.3GBext4.vhdx 文件大小25GB~8GBC 盘可用空间~1GB20GB完整 SOP可直接复用以后再遇到同样问题按顺序执行# ① 确认 C 盘状态Get-PSDrive-Name C# ② 查看 WSL 发行版wsl-l-v# ③ 定位 VHDX 文件Get-ChildItem$env:LOCALAPPDATA\Packages-Recurse-Filterext4.vhdx# ④ 查看 Linux 内部占用wsl-d Ubuntu-u root--sh-lcdf -h /; echo ---; du -sh /var/lib/docker 2/dev/null# ⑤ 清理 Docker不删 volumewsl-d Ubuntu-u root--sh-lcdocker system prune -af# ⑥ 清理系统缓存wsl-d Ubuntu-u root--sh-lcapt-get clean rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*# ⑦ fstrimwsl-d Ubuntu-u root--sh-lcfstrim -av# ⑧ 关闭 WSLwsl--shutdown# ⑨ 压缩 VHDX管理员 PowerShellOptimize-VHD-Path你的ext4.vhdx路径-Mode Full# ⑩ 验证Get-PSDrive-Name C日常维护建议定期检查 Docker 占用docker system df养成习惯别等爆了才清理清理时不要无脑--volumesvolume 里可能有数据库数据误删无法恢复删大文件后记得压缩 VHDXLinux 内部释放空间 ≠ Windows 释放空间必须走 fstrim Optimize-VHD考虑迁移 VHDX 到其他盘如果 D 盘空间充裕可以用wsl --exportwsl --import把整个发行版搬走从根本上解决 C 盘压力一句话总结WSL2 Docker 吃 C 盘的本质Docker 缓存在 Linux 里无限增长而 VHDX 虚拟磁盘只膨胀不收缩。清理数据只是第一步压缩 VHDX 才是真正释放空间的关键。