748 字
4 分钟
WSL2 虚拟磁盘空间压缩指南

WSL2 使用动态虚拟硬盘(VHDX),有一个问题:磁盘空间只增不减。即使删除了大量文件,VHDX 文件的实际占用也不会自动释放。

解决方案#

NOTE

以下方法仅适用于 WSL2。

方法一:设置 Sparse 磁盘#

较新版本的 WSL 支持 Sparse 模式,可自动释放未使用空间:

Terminal window
# 将 Ubuntu 替换为你的发行版名称
wsl --manage Ubuntu --set-sparse true

缺点是可能无法释放已占用的空闲空间。

方法二:使用 Diskpart 压缩(推荐)#

这是微软官方推荐的方法

压缩前务必备份重要数据!

1. 关闭 WSL#

Terminal window
wsl --shutdown

2. 找到 VHDX 文件#

Terminal window
# 列出所有 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 压缩#

以管理员身份运行:

Terminal window
diskpart

在 Diskpart 中输入:

select vdisk file="C:\Users\用户名\AppData\Local\Packages\...\LocalState\ext4.vhdx"
compact vdisk
exit
TIP

路径需使用完整绝对路径,不能用 %USERPROFILE% 变量。

等待显示 DiskPart successfully compacted the virtual disk file 即可。

扩展:将 WSL 迁移到其他盘符#

如果 C 盘空间紧张,除了压缩磁盘外,还可以直接将 WSL 所在的虚拟磁盘移动到其他盘符(如 D 盘)。通过导出再导入的方式,不仅能转移文件,还能顺便实现完美的空间压缩

操作前务必确保目标盘符有足够的空间,并备份好重要数据!

1. 关闭 WSL#

Terminal window
wsl --shutdown

2. 导出当前的系统镜像#

首先通过 wsl -l -v 命令确定你要迁移的分发版名称(如 Ubuntu)。然后将系统打包成 tar 文件:

Terminal window
# 建立备份存放的文件夹(根据自己情况修改)
mkdir D:\wsl_backup
# 导出系统镜像(过程可能需要几分钟到几十分钟)
wsl --export Ubuntu D:\wsl_backup\ubuntu.tar

3. 注销原来的系统#

注意:这一步会注销之前的 WSL 实例,并删除 C 盘上原有的 WSL 映像数据(释放 C 盘空间)。

Terminal window
wsl --unregister Ubuntu

4. 导入系统到新盘符#

将刚刚导出的 tar 包导入到新位置(例如 D:\wsl_system\Ubuntu):

Terminal window
# 创建新安装目录
mkdir D:\wsl_system\Ubuntu
# 导入系统镜像格式:wsl --import <系统名称> <安装位置> <备份文件路径>
wsl --import Ubuntu D:\wsl_system\Ubuntu D:\wsl_backup\ubuntu.tar

5. 恢复默认登录用户#

导入后默认会以 root 用户登录。我们需要修改配置恢复为你原来的普通用户:

Terminal window
# 启动进入刚导入的 Ubuntu
wsl -d Ubuntu

在 WSL 终端中执行(将 your_username 替换为你原来使用的用户名):

Terminal window
echo -e "[user]\ndefault=your_username" | sudo tee -a /etc/wsl.conf

设置完成后,退出并在宿主机重启 WSL (wsl --shutdown),再次启动即为正常环境,且系统已经成功迁移到了新盘符。确认无误后,甚至可以删除之前导出的 ubuntu.tar 备份文件。

预防建议#

  1. 定期清理 WSL 内部缓存:sudo apt clean && sudo apt autoremove
  2. 大型数据存放在 Windows 文件系统,通过 /mnt/c/ 访问
  3. 使用 Docker 时定期运行 docker system prune
WSL2 虚拟磁盘空间压缩指南
https://fuwari.vercel.app/posts/wsl2-compress-disk/
作者
枯園
发布于
2026-01-21
许可协议
CC BY-NC-SA 4.0