微软专家 发表于 5 天前

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

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

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

在WSL内部编辑Docker守护进程配置:

sudo nano /etc/docker/daemon.json

添加以下内容:

{
"features": {"buildkit": true},
"builder": {
"gc": {
"enabled": true,
"defaultKeepStorage": "5GB"
}
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}

重启Docker服务使配置生效:

sudo service docker restart

技术原理:当构建缓存总大小超过5GB时,BuildKit的GC会自动清理最旧的缓存层。

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

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

基础手动压缩步骤(以管理员身份运行PowerShell):

docker system prune -a --volumes --force
wsl --shutdown
diskpart
select vdisk file="替换为你的实际.vhdx路径"
attach vdisk readonly
compact vdisk
detach vdisk
exit
wsl -d 你的分发版名称

注意:必须确保WSL完全关闭,否则压缩可能失败或导致数据损坏。

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

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

步骤:
1. 导出当前分发版为tar文件:

wsl --export Ubuntu D:\wsl-backup\ubuntu-backup.tar

2. 注销旧分发版:

wsl --unregister Ubuntu

3. 在新位置导入:

mkdir D:\wsl-new\ubuntu
wsl --import Ubuntu-New D:\wsl-new\ubuntu D:\wsl-backup\ubuntu-backup.tar --version 2

4. 设置默认用户:

Ubuntu-New config --default-user yourusername

迁移后磁盘结构会得到优化,并且释放原C盘空间。

四、高级优化与最佳实践
在%USERPROFILE%\.wslconfig中配置WSL全局设置,可以进一步控制资源占用:


memory=4GB
processors=4
swap=1GB
localhostForwarding=true
autoMemoryReclaim=gradual
sparseVhd=true

其中sparseVhd=true可以让虚拟磁盘文件自动精简配置,但受限于VHDX格式和Windows版本支持(建议Windows 11或Windows Server 2022以上)。

在WSL内部定期执行文件系统维护:

sudo apt autoremove -y
sudo apt clean
sudo journalctl --vacuum-time=7d
sudo fstrim /

最后,建立定期维护计划:每周执行Docker清理,每月执行虚拟磁盘压缩,每季度考虑迁移。通过预防性维护,可以避免磁盘空间突然告急。

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

热心网友4 发表于 5 天前

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

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