当前位置: 首页 > news >正文

WSL2 吃掉我 25GB C 盘空间:一次完整的排查与回收记录

C 盘只剩 1GB,罪魁祸首是 WSL2 里的 Docker 缓存(19GB)。但清理完 Docker 后 C 盘并没有立刻恢复——因为WSL2 的虚拟磁盘(ext4.vhdx)只会自动膨胀,不会自动收缩。最终通过docker system prune+fstrim+Optimize-VHD三步组合拳,回收了约 17GB 空间。


起因:C 盘告急

某天系统开始卡顿,一查磁盘:

Get-PSDrive-Name C

可用空间只剩~1GB,已经影响正常使用了。

排查方向很明确——我机器上跑着多个 WSL 发行版:

wsl-l-v
NAME STATE VERSION * Ubuntu Running 2 podman-machine-default Stopped 2 kali-linux Stopped 2

WSL2 的虚拟磁盘是最大嫌疑。


第一步:定位 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-lc"df -h /"# 各目录占用排序wsl-dUbuntu-uroot --sh-lc"du -sh /home /var /usr /opt /tmp /root 2>/dev/null | sort -h"

结果:

目录占用
/home< 1GB
/usr~9GB
/var~22GB

继续深挖/var

wsl-dUbuntu-uroot --sh-lc"du -sh /var/* 2>/dev/null | sort -h | tail"
19G /var/lib/docker

Docker 独占 19GB,占了 VHDX 总量的 76%。


第三步:清理 Docker

查看 Docker 占用明细

wsl-dUbuntu-uroot --sh-lc"docker system df -v"

可以看到镜像、已停止容器、build cache 各自的占用情况。

执行清理

wsl-dUbuntu-uroot --sh-lc"docker system prune -af"

这条命令清理的内容:

  • ✅ 所有已停止的容器
  • ✅ 所有未被引用的镜像
  • ✅ 全部 build cache
  • ✅ 未使用的网络
  • 不会删除 volume(这是刻意的)

本次回收:~10GB

⚠️关于--volumes参数

Docker volume 里通常存放数据库文件、业务数据等有状态内容。除非你明确知道所有 volume 都可以丢弃,否则不要--volumes

清理系统缓存

顺手清理 APT 缓存和临时文件:

wsl-dUbuntu-uroot --sh-lc"apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*"

清理 systemd 日志(保留最近 7 天):

wsl-dUbuntu-uroot --sh-lc"journalctl --vacuum-time=7d >/dev/null 2>&1 || true"

清理完成后,Ubuntu 内部实际占用:24GB → 7.3GB


第四步:为什么 C 盘还没恢复?

这是很多人踩的坑:

WSL2 的 ext4.vhdx 是"只增不减"的。

Linux 内部删了文件,VHDX 文件大小不会自动缩小。必须手动压缩。

类比理解:就像一个气球吹到 25L,即使放掉一半气体,气球皮也不会自己缩回去——你需要手动"压缩"它。


第五步:压缩 VHDX

5.1 执行 fstrim(通知底层释放空闲块)

wsl-dUbuntu-uroot --sh-lc"fstrim -av"

5.2 关闭所有 WSL 实例

wsl--shutdown

5.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 sparse"

5.4 执行压缩(需要管理员 PowerShell)

Optimize-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~2GB
Ubuntu 内部实际占用24GB7.3GB
ext4.vhdx 文件大小25GB~8GB
C 盘可用空间~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-lc"df -h /; echo '---'; du -sh /var/lib/docker 2>/dev/null"# ⑤ 清理 Docker(不删 volume)wsl-d Ubuntu-u root--sh-lc"docker system prune -af"# ⑥ 清理系统缓存wsl-d Ubuntu-u root--sh-lc"apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*"# ⑦ fstrimwsl-d Ubuntu-u root--sh-lc"fstrim -av"# ⑧ 关闭 WSLwsl--shutdown# ⑨ 压缩 VHDX(管理员 PowerShell)Optimize-VHD-Path"你的ext4.vhdx路径"-Mode Full# ⑩ 验证Get-PSDrive-Name C

日常维护建议

  1. 定期检查 Docker 占用docker system df养成习惯,别等爆了才清理
  2. 清理时不要无脑--volumes:volume 里可能有数据库数据,误删无法恢复
  3. 删大文件后记得压缩 VHDX:Linux 内部释放空间 ≠ Windows 释放空间,必须走 fstrim + Optimize-VHD
  4. 考虑迁移 VHDX 到其他盘:如果 D 盘空间充裕,可以用wsl --export+wsl --import把整个发行版搬走,从根本上解决 C 盘压力

一句话总结

WSL2 + Docker 吃 C 盘的本质:Docker 缓存在 Linux 里无限增长,而 VHDX 虚拟磁盘只膨胀不收缩。清理数据只是第一步,压缩 VHDX 才是真正释放空间的关键。

http://www.jsqmd.com/news/895462/

相关文章:

  • 革命性AI视频字幕去除工具:Video-subtitle-remover一站式解决方案
  • video-subtitle-extractor:如何让AI看懂视频中的“隐形文字“并精准提取?
  • 向量数据库与RAG管道:从核心组件到系统工程的关键认知
  • Linux入门到实战·学习笔记系列——10.计算机网络基础概论
  • 如何快速掌握OBS多平台直播:obs-multi-rtmp插件完整教程
  • 用Unity和C#实现人群疏散模拟:手把手教你搭建社会力模型(附完整代码)
  • 终极指南:5分钟快速上手AzurLaneAutoScript,彻底解放你的碧蓝航线游戏时间
  • 2026杭州GEO优化公司深度横评:5家服务商避坑实测与选型指南 - 品牌报告
  • Windows 11 系统、MySQL 8.0.46 ZIP 解压版、自定义安装目录
  • 2026年4月推拉窗批发厂家推荐,吊趟门/断桥门窗/系统门窗/断桥窗沙一体外开窗/断桥铝合金门窗,推拉窗门店怎么选择 - 品牌推荐师
  • 解锁、截图、删文件都能换声音?macOS Sequoia 新系统太会玩了
  • 魔兽争霸3兼容性修复终极指南:5步解决现代系统运行问题
  • 2026靠谱的感应控制、动态、线光源楼宇外立面灯厂家推荐 - 工业品牌热点
  • API静默变更引发集成故障:防御性编码与监控策略实践
  • 保姆级教程:用博图V17搞定WINCC RT Advanced与S7-1200 PLC的通讯(含PG/PC接口设置避坑)
  • RV1126人脸识别项目实战:手把手教你搞定GC2053红外摄像头驱动配置(附完整DTS代码)
  • 基于广义加性模型的气候模型偶然不确定性量化实践
  • 深圳全屋定制避坑指南:如何甄选靠谱品牌? - 产品测评官
  • Neovim配置踩坑实录:从零搞定Python虚拟环境和C++的clangd语言服务器(Ubuntu 24.04亲测)
  • Unity独立游戏开发:如何用C#脚本在Windows平台强制锁定游戏窗口宽高比(含全屏适配)
  • 面试复盘7.0
  • 2026年全屋定制行业现状与品牌综合解析 - 产品测评官
  • 聊一聊AI - GEO搜索推广套餐性价比,尚棠科技值得选吗 - 工业品牌热点
  • 提取矩阵特定多列元素
  • Python初学者项目练习41--反转头尾并拼接字符串
  • 网页聊天室-测试报告
  • 构建股票分析AI智能体:三大设计模式解决数据幻觉与深度挖掘
  • livox mid 360s使用记录
  • 突破Windows权限限制:RunAsTI获取TrustedInstaller权限的终极指南
  • 2026黄金回收价格及靠谱公司,快速黄金回收联系方式推荐 - 工业品牌热点