Skip to content

WSL2 Docker ext4.vhdx 文件过大问题解决

问题描述

在使用 Docker Desktop 和 WSL2 时,即使通过 docker system prune -a 和清理 dangling volumes 等命令删除了所有容器和镜像,ext4.vhdx 虚拟磁盘文件仍然占用大量磁盘空间(通常达到几十GB)。这是因为 WSL2 的虚拟硬盘机制不会自动回收已释放的空间。

解决方案

方法一:使用 Docker Desktop 内置清理功能(推荐)

这是最简单且安全的方法,适用于大多数用户:

  1. 打开 Docker Desktop
  2. 点击标题栏的问号图标 (?)
  3. 选择 Clean / Purge data(清理/清除数据)
  4. 在弹出的窗口中确保勾选 WSL 2 选项
  5. 确认执行清理操作

注意

此操作会删除所有 Docker 数据,包括容器、镜像和卷,请确保已备份重要数据。

方法二:手动优化虚拟磁盘

如果希望保留部分数据但回收空间,可以使用以下方法:

对于 Windows Pro 及以上版本

  1. 停止所有 WSL 实例:

    powershell
    wsl --shutdown
  2. 使用 PowerShell 管理员权限执行:

    powershell
    Optimize-VHD -Path "$Env:LocalAppData\Docker\wsl\data\ext4.vhdx" -Mode Full

对于 Windows Home 版本

  1. 停止所有 WSL 实例:

    powershell
    wsl --shutdown
  2. 使用 diskpart 工具:

    powershell
    diskpart
  3. 在 diskpart 中选择虚拟磁盘:

    diskpart
    select vdisk file="C:\Users\用户名\AppData\Local\Docker\wsl\data\ext4.vhdx"
  4. 压缩虚拟磁盘:

    diskpart
    compact vdisk

方法三:完全重置 Docker 数据

如果不需要保留任何 Docker 数据,可以完全重置:

  1. 卸载 Docker Desktop
  2. 在 PowerShell 中删除 WSL 发行版:
    powershell
    wsl --unregister docker-desktop
    wsl --unregister docker-desktop-data
  3. 重新安装 Docker Desktop

方法四:使用第三方工具

可以使用 wslcompact 工具自动化压缩过程:

powershell
# 安装后使用
wslcompact

该工具会列出所有 WSL 发行版(包括 Docker 相关)并估算压缩后的空间和时间。

方法五:从 Linux 内部执行 Trim

在 WSL2 的 Linux 发行版中执行:

bash
sudo fstrim -av

这会通知 Hyper-V 回收未使用的磁盘块。

预防措施

启用稀疏 VHD 功能(实验性)

在 WSL 配置文件 .wslconfig(位于用户目录)中添加:

ini
[experimental]
sparseVhd=true

这将使新创建的发行版使用稀疏虚拟磁盘格式,支持自动空间回收。

警告

稀疏 VHD 功能仍处于实验阶段,可能导致文件系统损坏,请谨慎使用并确保备份重要数据。

总结

WSL2 的 ext4.vhdx 文件过大是常见问题,主要原因在于虚拟磁盘不会自动收缩。通过 Docker Desktop 的清理功能是最简单安全的解决方案,而手动优化方法适用于需要保留数据的情况。定期清理和考虑使用实验性的稀疏 VHD 功能可以有效预防此问题。