压缩WSL2的虚拟硬盘空间

自从微软加入了支持GPU的特性后,WSL2已经能满足我90%的写代码的需求。不需要繁琐的重启电脑+切换系统,也不会像VMWARE那样一打开就资源吃满(并且不支持GPU),配合上VSCode,可以说是生产力和舒适度拉满。

不过,WSL2使用的是动态虚拟硬盘,虚拟硬盘的占用空间会随实际使用量而增加(而不是一次性占完本地的几百G的空间)。但是,占用空间的增加是单调递增的,这意味着当你删除一些大文件,或者清理大量缓存后,系统并不会自动free掉对应的占用空间。

此外,哪怕WSL的实际使用量一直保持一个上确界,虚拟硬盘的占用空间似乎也会一直增加下去。在我跑完一个project并清理完缓存后,WSL的虚拟硬盘文件吃了我将近150G的空间,而其实际使用量只有不到40G. 这相当于在你的电脑里多装了一个原神

解决方法

注:以下方法均只能用于WSL2

Set Sparse (可能不管用)

在某次版本更新中,WSL2可以设置为sparse disk,可以自动释放unused space. 设置方法如下(在Windows的Powershell里输入)

$ wsl --manage Debian --set-sparse true

但是这似乎无法释放已经占用的unused space,至少对我不管用。

Diskpart (推荐)

这个是微软官方的方法. 利用Windows自带的diskpart工具来压缩vhdx文件. 微软附上了这个工具的使用方法的Blog

在使用前,先将上面的set-sparse设置为false.

NOTE: 压缩数据前务必备份所有重要文件!

1. 关闭wsl

$ wsl --terminate Debian
$ wsl --shutdown

2. 找到vhdx文件的地址

一般而言,你可以在以下目录找到vhdx文件

C:\Users\%USER_NAME%\AppData\Local\Packages\TheDebianProject.DebianGNULinux_*******\LocalState\ext4.vhdx

3. 调用diskpart

$ diskpart

输入该命令后,会打开一个diskpart的新窗口,在这个新窗口里输入:

DISKPART> select vdisk file=“C:\Users\%USER_NAME%\AppData\Local\Packages\TheDebianProject.DebianGNULinux_*******\LocalState\ext4.vhdx”
DISKPART> compact vdisk

等到显示sucessfully compacted后,就可以重新打开WSL2了。