C 盘空间 100G,如今只剩不到 15G,通过WinDirStat软件查看,有个ext4.vhdx占用了近 20G 空间

原因

此文件产生的原因是主机上安装了 WSL2,且安装了 docker,日积月累的,内部积压了特别多版本的镜像和容器
WSL2 本质上来说还是虚拟机,Windows 会创建 vhdx 后缀的磁盘镜像文件,作为存储,特点是支持自动扩容,但是一般不会自动缩容,如 VBox 创建虚拟机时的动态存储卷
由于 Docker 安装了 Kafka、Apollo、XXL-JOB、ETCD 等一堆还包含多个版本的系统组件,镜像和容器所占空间可观
其实都是本地验证测试之类的用途,使用时通过 docker-compose 创建,完成应该删除

解决方法

由于主要是 docker 占用的空间,故先清理 docker 的占用空间
也可以先确认什么目录的空间占用比较大
发现最大的就是 docker /var/lib/docker
其中 /var/lib/docker/volumes 也是相当大,原因是容器删除后,数据卷仍在磁盘中,需要清理(非手动挂载)

sudo du -h --exclude="mnt*" --exclude="proc*" -d 1 /

docker volume prune

docker system prune

docker images
docker rmi xxx

搜索找到 ext4.vhdx文件,位置一般在 C:\Users\用户名\AppData\Local\Packages\应用名\LocalState\ext4.vhdx

DISKPART> HELP SELECT VDISK

    按文件名选择指定的虚拟磁盘,并将焦点移动到该磁盘。

语法:  SELECT VDISK FILE=<"filename"> [NOERR]

    FILE=<"filename">

                指定现有虚拟磁盘文件的完整路径
                和文件名。

    NOERR       仅用于脚本。遇到错误时,DiskPart
                会继续处理命令,如同没有出现错误一样。
                如果不使用 NOERR 参数,错误会导致 DiskPart 退出
                并返回错误代码。
示例:

    SELECT VDISK FILE="c:\test\test.vhd"
    SELECT VDISK FILE="c:\test\test.vhdx" NOERR
wsl --shutdown
diskpart

 DISKPART> select vdisk file="C:\Users\用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx"
 DISKPART> compact vdisk

 DISKPART> detach vdisk

完成后ext4.vhdx文件体积不到 8 个 G 了,释放了十几个 G
当然,还可以在设置-> 系统 -> 存储 -> 更改新内容的保存位置来设置新应用的存储移出 C 盘
不过 WSL 应该需要借助其它的工具来迁移,游戏一类的还是可以的,还可以尝试使用移动来对已安装的应用迁移
此外还有其它命令,并未尝试

Optimize-VHD -Path <VHDX 文件路径> -Mode Full

补充

wsl 提供了系统的备份恢复功能,只需要两个命令即可,定期备份一下更安心

PS C:\WINDOWS\System32> wsl -l
适用于 Linux 的 Windows 子系统分发版:
Ubuntu-18.04 (默认)
。。。

wsl --shutdown

wsl --export Ubuntu-18.04 d:\Ubuntu-18.04.tar

wsl --import Ubuntu-18.04 d:\Ubuntu-18.04.tar

原文链接