在使用 Windows Subsystem for Linux (WSL) 的过程中,最让人头疼的问题之一就是虚拟硬盘文件(ext4.vhdx)不断膨胀,迅速吞噬宝贵的 C 盘空间。即便你在 WSL 内部删除了大量文件,宿主机上的磁盘空间也往往不会自动释放——因为 WSL2 的虚拟磁盘只会“长大”而不擅长“缩身”。
本文将系统性地讲解两种根本性解决方案:压缩虚拟磁盘(回收空闲空间)和迁移虚拟磁盘(更换存放位置)。无论你是希望临时释放空间,还是打算一劳永逸地搬家到 D 盘,都能在这里找到清晰的步骤。
一、预备工作:了解你的 WSL 环境
在进行任何操作之前,建议先查看当前 WSL 发行版列表及状态:
wsl -l -v
你会看到类似输出:
NAME STATE VERSION
* Ubuntu-22.04 Running 2
docker-desktop-data Running 2
记下你要操作的发行版名称(例如 Ubuntu-22.04)。如果涉及 Docker,注意 docker-desktop-data 是存放 Docker 镜像和容器的专用发行版,也可以独立迁移。
二、方法一:压缩虚拟磁盘(回收 C 盘空间)
压缩的原理是:先在 WSL 内部将空闲区域填充为零,然后使用 Windows 磁盘工具真正压缩 VHDX 文件。务必按顺序操作。
1. 清理 WSL 内部无用文件(可选但推荐)
进入 WSL 终端(例如 Ubuntu),执行清理命令:
# 清理系统包缓存
sudo apt clean
# 如果是 Docker 环境,清理未使用的镜像、容器和卷
docker system prune -a -f
docker system prune --volumes -f
2. 用零填充空闲空间(关键步骤)
在同一个 WSL 终端中运行:
# 创建一个填充文件,占满所有剩余空间
dd if=/dev/zero of=~/zero.fill bs=1M status=progress
# 强制同步到磁盘
sync
# 删除该文件
rm ~/zero.fill
此过程会暂时占满虚拟磁盘,需要等待数分钟至数十分钟,请耐心直至命令完成。
3. 彻底关闭 WSL
回到 Windows(以管理员身份打开 PowerShell 或 CMD):
wsl --shutdown
4. 使用 DiskPart 压缩 VHDX
找到你的虚拟硬盘文件路径:
- 普通 WSL 发行版:
C:\Users\<你的用户名>\AppData\Local\Packages\<发行版包名>\LocalState\ext4.vhdx - Docker Desktop 数据:
C:\Users\<你的用户名>\AppData\Local\Docker\wsl\data\ext4.vhdx
然后在管理员终端中执行:
diskpart
select vdisk file="C:\Users\<你的用户名>\AppData\Local\Docker\wsl\data\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
等待 compact 命令完成后,你会发现虚拟磁盘文件体积显著缩小。
如果你有 Hyper-V 环境,也可以打开“Hyper-V 管理器” → “编辑磁盘” → 选择 VHDX → “压缩”,用图形界面完成同样操作。
三、方法二:迁移虚拟硬盘到其他盘(一劳永逸)
如果 C 盘本身空间不足,压缩只是权宜之计。最彻底的解决方式是将整个 WSL 发行版迁移到 D 盘或其他大容量分区。推荐使用 导出/导入 官方方法,安全可靠。
1. 导出当前发行版为备份文件
在目标盘(如 D 盘)创建文件夹,例如 D:\WSL,然后导出:
wsl --export Ubuntu-22.04 D:\WSL\ubuntu-backup.tar
导出的
.tar文件大小约等于当前虚拟磁盘的实际使用量,请确保目标盘有足够空间。
2. 注销旧发行版(释放 C 盘空间)
wsl --unregister Ubuntu-22.04
这步会删除 C:\Users\...\LocalState\ 下的 ext4.vhdx 文件,立即释放空间。
3. 导入到新位置
wsl --import Ubuntu-22.04 D:\WSL\Ubuntu D:\WSL\ubuntu-backup.tar --version 2
参数含义:
Ubuntu-22.04:新发行版名称(可与原来相同)D:\WSL\Ubuntu:新的虚拟硬盘存放目录,vhdx文件将在此生成D:\WSL\ubuntu-backup.tar:上一步导出的备份文件
4. 恢复默认用户(可选)
导入后默认以 root 身份登录。若想恢复原先的用户,找到对应的可执行文件(如 ubuntu2204.exe)并执行:
ubuntu2204.exe config --default-user <你的用户名>
5. 验证并清理
启动 WSL,确认环境正常(文件、已安装软件等)。一切无误后,可以删除 D:\WSL\ubuntu-backup.tar 以释放空间。
小技巧:如果你使用的是 Docker Desktop,可以单独迁移
docker-desktop-data发行版,步骤完全一样,只需替换发行版名称。
四、备选方案:全新安装时直接指定位置
如果你是首次安装 WSL 发行版,可以直接用命令指定安装目录,避免日后折腾:
wsl --install -d Ubuntu --location D:\WSL\Ubuntu
或从离线包导入:
wsl --install --from-file D:\path\to\install.wsl --location D:\WSL\Ubuntu
五、注意事项与常见问题
| 注意点 | 说明 |
|---|---|
| 管理员权限 | 所有涉及 wsl --export/--import 和 diskpart 的操作都必须以管理员身份运行 PowerShell/CMD。 |
| 目标盘格式 | 必须为 NTFS 文件系统,否则 WSL 可能无法正常读写。 |
| 备份重要数据 | 迁移前建议备份 WSL 内的重要文件,以防操作失误。 |
| 关闭所有 WSL 进程 | 迁移或压缩前务必运行 wsl --shutdown 确保没有进程占用。 |
| Docker 特殊处理 | 如果使用 Docker Desktop,建议先退出 Docker Desktop 再操作 docker-desktop-data。 |
| 压缩无效? | 如果压缩后空间未释放,请确认在 WSL 内正确执行了 dd 填充步骤,并确保 compact 命令成功。 |
六、总结
- 压缩适合临时应急,能快速回收空闲空间,但虚拟磁盘仍留在 C 盘,治标不治本。
- 迁移是根本解决方案,将虚拟硬盘搬到空间充裕的分区,从此告别 C 盘焦虑。
建议遵循以下流程:
先清理无用数据 → 再压缩回收空间 → 若仍不足则果断迁移。
通过本文的方法,你不仅能有效管理 WSL 磁盘占用,更能深入理解 WSL 虚拟磁盘的工作机制。从此,C 盘飘红不再可怕!
如果你在操作中遇到其他问题,欢迎查阅 Microsoft WSL 官方文档 获得更多支持。

评论