1、立项原因
Docker Desktop 基于 WSL2 的虚拟磁盘文件 docker_data.vhdx 采用动态扩展机制,长期使用后删除镜像、容器等操作不会自动回收已占用空间,导致磁盘文件虚胖(如实际数据仅 3GB 却占用 20GB),造成磁盘空间浪费。本脚本旨在自动化回收“死空间”,解决手动压缩流程繁琐、易出错的问题,释放被无效占用的存储资源。
2、行业场景
适用于 Windows 平台上频繁使用 Docker 进行开发测试的工程师、运维人员,以及 CI/CD 构建机等需要定期清理磁盘的环境。尤其适合 SSD 容量有限的笔记本或云桌面,帮助用户在不重装 Docker 的前提下快速回收空间。
3、功能模块:
脚本为单一 PowerShell 文件,内部划分为五个逻辑模块:
路径交互模块:提供默认路径(%LOCALAPPDATA%\Docker\wsl\disk\docker_data.vhdx)与手动输入自定义路径的交互选择。
前置检查模块:检测管理员权限、VHDX 文件存在性,确保运行环境合法。
WSL 操作模块:执行 wsl --shutdown 关闭实例,挂载/卸载 VHDX 为裸设备。
填零回收模块:在 WSL 内通过 dd 命令对数据分区空闲空间写零,触发 VHDX 的收缩标记。
压缩执行模块:调用 diskpart 的 compact vdisk 指令完成物理压缩,并显示压缩后大小。
4、核心功能
一键完成从关闭 WSL、挂载磁盘、填零、压缩到卸载的全流程自动化,用户仅需以管理员身份运行,按提示选择路径即可,无需记忆复杂命令。
1、技术栈
基于 PowerShell 5.0+ 编写,依赖 Windows 内置工具(diskpart、wsl.exe)以及 WSL 发行版中的 dd 命令(BusyBox 提供)。无需额外安装第三方软件。
2、架构
采用线性顺序执行 + 交互式输入,包含异常退出保护(文件不存在、权限不足时提前终止)。
3、实现亮点
通过磁盘大小自动定位数据分区,避免用户手动指定设备名。
智能处理 Windows/Linux 换行符差异,确保传递的路径字符串在 WSL 内被正确解析。
支持路径中的空格和特殊字符,自动去除首尾引号。
4、技术难点
WSL 挂载裸设备时需正确构造命令(wsl --mount --bare),且需等待挂载完成后再执行 dd,需处理异步时序。
diskpart 交互式命令的自动化需通过管道输入,需确保脚本无残留挂载,避免文件锁定。
压缩过程可能因 Docker 服务未完全退出而失败,需在脚本开头强制检测并提示用户退出。