压缩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了。