Windows WSL2 占用磁盘空间清理释放

目前工作中时常用到WSL2(Ubuntu20.04),在使用一段时间后会发现WSL2所占用磁盘空间越来越多,体现在WSL2之上安装Linux分发对应的vhdx虚拟磁盘文件体积越来越大,会占用Windows自身空间,即使手动清理了Linux分发内文件释放空间,此虚拟磁盘文件体积也不会自动缩小,所以在有需要的时候需要手动缩减虚拟磁盘空间大小来释放更多空间给到Windows自身使用。 这里推荐一个软件WinDirStat,主要用于查找Windows系统内的大体积文件的,通常来说vhdx文件都是在系统中可以排进前十的大文件,所以用WinDirStat比较容易定位大文件和进行清理,例如下方截图,在我的系统中虚拟磁盘文件存放路径为(此路径用于后续进行磁盘缩减):C:Users
ongAppDataLocalPackagesCanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsLocalStateext4.vhdx

清理操作说明

以下方式在Windows10 或Windows11 专业版及以上测试通过

步骤一:进入WSL2的Linux分发手动删除Linux分发内无用文件

步骤二(可选):如果系统安装使用了Docker Desktop,一般还需要执行此步骤,否则很多空间会被占用无法释放,导致后续缩减磁盘时效果不理想。

进入Linux分发并执行如下命令,清理docker相关缓存,无用容器等占用空间。

docker system prune

    注意:执行以上命令会清理以下内容,

  • 所有已经停止运行的容器(运行中的不会被清理)
  • 所有未被任何容器引用的volume
  • 所有未被任何容器引用的network
  • 所有未被任何镜像应用的layer,如果执行 docker system prune -a,则会一并删除未被任何运行中容器使用的镜像,需要小心使用。
  • 构建镜像的缓存信息

步骤三:关闭所有WSL2已运行的分发,并关闭WSL2,方法为:
1. 如果有安装Docker Desktop 先关闭退出
2. 打开cmd窗口并执行如下命令关闭所有WSL分发

wsl --shutdown

步骤四: 以管理员身份打开一个cmd窗口,

1. 输入 diskpart 并回车,进入DISKPART命令行,如下图:

2. 在DISKPART>命令提示符下输入以下命令,每行以回车结尾,其中执行compact vdisk时会根据虚拟磁盘文件大小占用过一些时间。(虚拟磁盘文件一般位于:C:Users<your_username>AppDataLocalPackages<distro_package_name>LocalStateext4.vhdx)

select vdisk file="这里替换为上方通过WinDirStat获取的vhdx虚拟磁盘文件路径"
attach vdisk readonly
compact vdisk
detach vdisk

3. 执行 exit 并回车来退出DiskPart。

其他参考

以上方式是前两年找到的资料,一直在使用并沿用至今。 随着使用人更多,目前也出现了其他方式,例如在专业版及以上版本也可以通过powershell,进入存放vhdx文件目录,并执行Optimize-VHD -Path .ext4.vhdx -Mode full命令进行磁盘大小缩减(未测试过)。

官方也在2023年9月声明新增了自动缩减虚拟磁盘文件大小的特性,但是也未测试过, 参考:

Windows Subsystem for Linux September 2023 update - Windows Command Line