wsl2 磁盘清理

wsl2 默认使用的是 ext4.vhdx 虚拟磁盘格式,特定是可以自动扩容,但是不会自动缩容。

拿 wsl2 跑 Docker 用起来很方便,但是时间长了,磁盘空间会越来越大,导致 C 盘都快满了。这里记录一下如何使用 DISKPART 清理。

# 查看最大空间占用目录
sudo du -h --exclude="mnt*" --exclude="proc*" -d 1 /

# 清理 无用的volumes
docker volume prune

# 删除无用的镜像和容器及构建缓存
docker system prune

# 删除全部镜像
docker rmi $(docker images -a -q)

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

# powershell中执行
wsl --shutdown
diskpart

DISKPART> select vdisk file="C:\Users\用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx"
# DiskPart 已成功选择虚拟磁盘文件。

DISKPART> compact vdisk
# 如果出现
# 虚拟磁盘服务错误: 所请求的操作需要以只读方式 连接虚拟磁盘。
# 则执行
# detach vdisk
# attach vdisk readonly

# 100 百分比已完成

# DiskPart 已成功压缩虚拟磁盘文件。

DISKPART> detach vdisk

不放心的可以在清理前先做下备份:

# 备份指定系统到指定位置
wsl --export Ubuntu-18.04 d:\Ubuntu-18.04.tar

# 还原指定系统
wsl --import Ubuntu-18.04 d:\Ubuntu-18.04.tar