查看: 100|回复: 1

WSL虚拟磁盘空间回收指南:缓存清理、压缩与迁移

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
许多使用WSL 2的开发者都遇到过C盘空间被无故占满的问题,罪魁祸首往往是WSL的虚拟磁盘文件ext4.vhdx。该文件不会自动回收空间,即使删除了WSL内部的文件,.vhdx大小也不会减少。本文从三个层面提供可落地的解决方案:Docker缓存智能清理、虚拟磁盘压缩、以及彻底的迁移优化,帮助你有效回收20GB以上的磁盘空间。

一、Docker缓存智能清理:从根源减少空间占用
Docker镜像和构建缓存是WSL内部空间膨胀的首要元凶。通过配置BuildKit的垃圾回收机制,可以实现自动清理。

在WSL内部编辑Docker守护进程配置:
  1. sudo nano /etc/docker/daemon.json
复制代码
添加以下内容:
  1. {
  2. "features": {"buildkit": true},
  3. "builder": {
  4. "gc": {
  5. "enabled": true,
  6. "defaultKeepStorage": "5GB"
  7. }
  8. },
  9. "storage-driver": "overlay2",
  10. "storage-opts": [
  11. "overlay2.override_kernel_check=true"
  12. ]
  13. }
复制代码
重启Docker服务使配置生效:
  1. sudo service docker restart
复制代码
技术原理:当构建缓存总大小超过5GB时,BuildKit的GC会自动清理最旧的缓存层。

如果需要更精细的自动化控制,可以创建清理脚本,配合cron定时执行。脚本会根据磁盘使用率(超过80%)触发清理操作,并保留最近72小时的缓存。

二、虚拟磁盘压缩:回收被浪费的碎片空间
WSL 2的虚拟磁盘文件(VHDX)长时间使用后会产生大量碎片空间,删除文件后不会自动缩容。必须手动执行压缩。

基础手动压缩步骤(以管理员身份运行PowerShell):
  1. docker system prune -a --volumes --force
  2. wsl --shutdown
  3. diskpart
  4. select vdisk file="替换为你的实际.vhdx路径"
  5. attach vdisk readonly
  6. compact vdisk
  7. detach vdisk
  8. exit
  9. wsl -d 你的分发版名称
复制代码
注意:必须确保WSL完全关闭,否则压缩可能失败或导致数据损坏。

对于多个WSL分发版,可以使用自动化PowerShell脚本批量压缩。该脚本会读取注册表中的WSL分发版路径,遍历所有.vhdx文件并执行diskpart压缩,然后输出每个分发版节省的空间量。

三、终极方案:虚拟磁盘迁移
如果上述方法仍无法满足空间需求,迁移整个WSL分发版到其他磁盘是最彻底的方式。

步骤:
1. 导出当前分发版为tar文件:
  1. wsl --export Ubuntu D:\wsl-backup\ubuntu-backup.tar
复制代码
2. 注销旧分发版:
  1. wsl --unregister Ubuntu
复制代码
3. 在新位置导入:
  1. mkdir D:\wsl-new\ubuntu
  2. wsl --import Ubuntu-New D:\wsl-new\ubuntu D:\wsl-backup\ubuntu-backup.tar --version 2
复制代码
4. 设置默认用户:
  1. Ubuntu-New config --default-user yourusername
复制代码
迁移后磁盘结构会得到优化,并且释放原C盘空间。

四、高级优化与最佳实践
在%USERPROFILE%\.wslconfig中配置WSL全局设置,可以进一步控制资源占用:
  1. [wsl2]
  2. memory=4GB
  3. processors=4
  4. swap=1GB
  5. localhostForwarding=true
  6. autoMemoryReclaim=gradual
  7. sparseVhd=true
复制代码
其中sparseVhd=true可以让虚拟磁盘文件自动精简配置,但受限于VHDX格式和Windows版本支持(建议Windows 11或Windows Server 2022以上)。

在WSL内部定期执行文件系统维护:
  1. sudo apt autoremove -y
  2. sudo apt clean
  3. sudo journalctl --vacuum-time=7d
  4. sudo fstrim /
复制代码
最后,建立定期维护计划:每周执行Docker清理,每月执行虚拟磁盘压缩,每季度考虑迁移。通过预防性维护,可以避免磁盘空间突然告急。

提示:Docker清理在WSL内部操作,虚拟磁盘压缩在Windows端执行,迁移方案需要两者配合。建议使用原文提供的PowerShell脚本实现一键压缩,路径可通过注册表自动获取。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: WSL虚拟磁盘空间回收指南:缓存清理、压缩与迁移

感谢微软专家的详细指南!之前一直被WSL的虚拟磁盘占用搞得很头疼,试过手动压缩但每次都要查命令,而且效果感觉不太稳定。文中提到的BuildKit GC自动清理配置和迁移方案非常实用,特别是sparseVhd这个设置,我之前都没注意到,回头去检查一下Windows版本是否支持。另外想请教一下,如果已经通过迁移把vhdx放到D盘了,后续再执行磁盘压缩时,diskpart命令里的路径应该指向迁移后的新位置对吧?还有那个自动清理脚本,是直接放在WSL内部执行还是放在Windows端用任务计划调?期待进一步解答,再次感谢分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-5 18:17 , Processed in 0.030074 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部