如何彻底解决Windows系统下WSL2虚拟磁盘文件占用空间过大且无法释放的问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计788个文字,预计阅读时间需要4分钟。
相关专题
wsl2 的 ext4.vhdx 文件不会自动收缩,哪怕你在 linux 里删光所有文件,windows 上看到的文件大小依然不变。真正释放空间需要两步:先清空 wsl2 内部可回收空间,再用 windows 工具压缩虚拟磁盘。
第一步:在 WSL2 内彻底清理冗余数据
这一步是压缩生效的前提。不清理就压缩,几乎不减小体积。
-
清空 APT 缓存(Ubuntu/Debian 类系统):
sudo apt clean && sudo apt autoclean -
卸载无用依赖:
sudo apt autoremove --purge -
清空日志文件(安全,只清内容不删文件):
sudo find /var/log -name "*.log" -exec truncate -s 0 {} \;
再限制 systemd 日志上限:sudo journalctl --vacuum-size=50M -
若装了 Docker,必须执行深度清理:
docker system prune -a -f && docker builder prune -f && docker volume prune -f -
可选进阶清理(谨慎):
删除本地文档和手册:sudo rm -rf /usr/share/doc/* /usr/share/man/* /usr/share/info/*
第二步:关闭 WSL 并用 diskpart 压缩 .vhdx 文件
必须确保 WSL 完全停止,否则 diskpart 会报错或失败。
- 在 PowerShell 中执行:
wsl --shutdown - 确认所有发行版状态为 Stopped:
wsl -l -v - 打开
diskpart,然后依次输入(注意路径用英文双引号包裹,且使用正斜杠或双反斜杠):select vdisk file="C:\Users\你的用户名\AppData\Local\Packages\发行版包名\LocalState\ext4.vhdx"compact vdiskdetach vdisk - 退出 diskpart,回到 PowerShell 查看文件大小变化
第三步:验证与长期维护建议
压缩后不一定立刻反映在资源管理器中,可重启资源管理器或等待几秒刷新。
- 检查实际占用:
在 WSL 终端运行df -h,对比/分区已用空间;
在 PowerShell 运行Get-ChildItem "路径\ext4.vhdx" | Select Length查看文件字节数 - 避免反复膨胀:
定期运行上述清理命令;
Docker 用户建议配置/etc/docker/daemon.json加入日志限制,例如:{"log-driver": "json-file", "log-opts": {"max-size": "10m", "max-file": "3"}} - 如 C 盘长期告急,考虑迁移整个发行版到其他盘:
wsl --export 发行版名 D:\backup.tarwsl --unregister 发行版名wsl --import 发行版名 D:\wsl\install D:\backup.tar --version 2
关键点在于顺序不能颠倒——内部清得越干净,diskpart 压缩效果越明显。操作前无需备份整个系统,但建议导出重要数据以防误操作。
本文共计788个文字,预计阅读时间需要4分钟。
相关专题
wsl2 的 ext4.vhdx 文件不会自动收缩,哪怕你在 linux 里删光所有文件,windows 上看到的文件大小依然不变。真正释放空间需要两步:先清空 wsl2 内部可回收空间,再用 windows 工具压缩虚拟磁盘。
第一步:在 WSL2 内彻底清理冗余数据
这一步是压缩生效的前提。不清理就压缩,几乎不减小体积。
-
清空 APT 缓存(Ubuntu/Debian 类系统):
sudo apt clean && sudo apt autoclean -
卸载无用依赖:
sudo apt autoremove --purge -
清空日志文件(安全,只清内容不删文件):
sudo find /var/log -name "*.log" -exec truncate -s 0 {} \;
再限制 systemd 日志上限:sudo journalctl --vacuum-size=50M -
若装了 Docker,必须执行深度清理:
docker system prune -a -f && docker builder prune -f && docker volume prune -f -
可选进阶清理(谨慎):
删除本地文档和手册:sudo rm -rf /usr/share/doc/* /usr/share/man/* /usr/share/info/*
第二步:关闭 WSL 并用 diskpart 压缩 .vhdx 文件
必须确保 WSL 完全停止,否则 diskpart 会报错或失败。
- 在 PowerShell 中执行:
wsl --shutdown - 确认所有发行版状态为 Stopped:
wsl -l -v - 打开
diskpart,然后依次输入(注意路径用英文双引号包裹,且使用正斜杠或双反斜杠):select vdisk file="C:\Users\你的用户名\AppData\Local\Packages\发行版包名\LocalState\ext4.vhdx"compact vdiskdetach vdisk - 退出 diskpart,回到 PowerShell 查看文件大小变化
第三步:验证与长期维护建议
压缩后不一定立刻反映在资源管理器中,可重启资源管理器或等待几秒刷新。
- 检查实际占用:
在 WSL 终端运行df -h,对比/分区已用空间;
在 PowerShell 运行Get-ChildItem "路径\ext4.vhdx" | Select Length查看文件字节数 - 避免反复膨胀:
定期运行上述清理命令;
Docker 用户建议配置/etc/docker/daemon.json加入日志限制,例如:{"log-driver": "json-file", "log-opts": {"max-size": "10m", "max-file": "3"}} - 如 C 盘长期告急,考虑迁移整个发行版到其他盘:
wsl --export 发行版名 D:\backup.tarwsl --unregister 发行版名wsl --import 发行版名 D:\wsl\install D:\backup.tar --version 2
关键点在于顺序不能颠倒——内部清得越干净,diskpart 压缩效果越明显。操作前无需备份整个系统,但建议导出重要数据以防误操作。

