748 字
4 分钟
WSL2 虚拟磁盘空间压缩指南
WSL2 使用动态虚拟硬盘(VHDX),有一个问题:磁盘空间只增不减。即使删除了大量文件,VHDX 文件的实际占用也不会自动释放。
解决方案
NOTE以下方法仅适用于 WSL2。
方法一:设置 Sparse 磁盘
较新版本的 WSL 支持 Sparse 模式,可自动释放未使用空间:
# 将 Ubuntu 替换为你的发行版名称wsl --manage Ubuntu --set-sparse true缺点是可能无法释放已占用的空闲空间。
方法二:使用 Diskpart 压缩(推荐)
这是微软官方推荐的方法。
压缩前务必备份重要数据!
1. 关闭 WSL
wsl --shutdown2. 找到 VHDX 文件
# 列出所有 WSL 的 VHDX 文件Get-ChildItem -Path "$env:USERPROFILE\AppData\Local\Packages\*" -Filter "ext4.vhdx" -Recurse -ErrorAction SilentlyContinue常见路径:
- Ubuntu:
%USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu*\LocalState\ext4.vhdx - Debian:
%USERPROFILE%\AppData\Local\Packages\TheDebianProject.DebianGNULinux*\LocalState\ext4.vhdx
3. 使用 Diskpart 压缩
以管理员身份运行:
diskpart在 Diskpart 中输入:
select vdisk file="C:\Users\用户名\AppData\Local\Packages\...\LocalState\ext4.vhdx"compact vdiskexitTIP路径需使用完整绝对路径,不能用
%USERPROFILE%变量。
等待显示 DiskPart successfully compacted the virtual disk file 即可。
扩展:将 WSL 迁移到其他盘符
如果 C 盘空间紧张,除了压缩磁盘外,还可以直接将 WSL 所在的虚拟磁盘移动到其他盘符(如 D 盘)。通过导出再导入的方式,不仅能转移文件,还能顺便实现完美的空间压缩。
操作前务必确保目标盘符有足够的空间,并备份好重要数据!
1. 关闭 WSL
wsl --shutdown2. 导出当前的系统镜像
首先通过 wsl -l -v 命令确定你要迁移的分发版名称(如 Ubuntu)。然后将系统打包成 tar 文件:
# 建立备份存放的文件夹(根据自己情况修改)mkdir D:\wsl_backup# 导出系统镜像(过程可能需要几分钟到几十分钟)wsl --export Ubuntu D:\wsl_backup\ubuntu.tar3. 注销原来的系统
注意:这一步会注销之前的 WSL 实例,并删除 C 盘上原有的 WSL 映像数据(释放 C 盘空间)。
wsl --unregister Ubuntu4. 导入系统到新盘符
将刚刚导出的 tar 包导入到新位置(例如 D:\wsl_system\Ubuntu):
# 创建新安装目录mkdir D:\wsl_system\Ubuntu# 导入系统镜像格式:wsl --import <系统名称> <安装位置> <备份文件路径>wsl --import Ubuntu D:\wsl_system\Ubuntu D:\wsl_backup\ubuntu.tar5. 恢复默认登录用户
导入后默认会以 root 用户登录。我们需要修改配置恢复为你原来的普通用户:
# 启动进入刚导入的 Ubuntuwsl -d Ubuntu在 WSL 终端中执行(将 your_username 替换为你原来使用的用户名):
echo -e "[user]\ndefault=your_username" | sudo tee -a /etc/wsl.conf设置完成后,退出并在宿主机重启 WSL (wsl --shutdown),再次启动即为正常环境,且系统已经成功迁移到了新盘符。确认无误后,甚至可以删除之前导出的 ubuntu.tar 备份文件。
预防建议
- 定期清理 WSL 内部缓存:
sudo apt clean && sudo apt autoremove - 大型数据存放在 Windows 文件系统,通过
/mnt/c/访问 - 使用 Docker 时定期运行
docker system prune
WSL2 虚拟磁盘空间压缩指南
https://fuwari.vercel.app/posts/wsl2-compress-disk/