Optimize WSL storage

C盘满了,扫了一下发现可能是WSL用太多,积累的安装包使得整个系统变得巨大。参考 https://woshub.com 上的帖子, 解决的思路大致有两种:

  • 压缩使用空间
  • 迁移到其他盘

检查使用情况

打开 Powershell:

1
2
3
PS C:\> wsl --list --verbose
NAME STATE VERSION
* Ubuntu-20.04 Running 2

找出该系统对应的文件夹名称:

1
2
3
4
5
PS D:\WSL> Get-AppxPackage -Name "*Ubuntu20*" | Select PackageFamilyName

PackageFamilyName
-----------------
CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc

计算出其占用空间:

1
2
3
4
PS D:\WSL> $path= $env:USERPROFILE+ "\AppData\Local\Packages\" + (Get-AppxPackage -Name "*Ubuntu20*").PackageFamilyName + "\LocalState\ext4.vhdx"
PS D:\WSL> Get-ChildItem -Path $path | fl @{Label="SizeGb"; Expression={$_.Length / 1Gb}}

SizeGb : 35.8193359375

方法1:压缩空间

参考 reduce the size of the VHD file using the Optimize-VHD cmdlet (from the Hyper-V PowerShell module),需要先确保Hyper-V已安装。

启用 Hyper-V

进入设置 控制面板 | 程序和功能 | 启用或关闭 windows 功能

启用后应该需要重启电脑。

optimize-vhd

打开 已启用Hyper-Vpowershell (管理员权限):

1
2
3
4
5
6
7
PS D:\WSL> wsl --shutdown

PS D:\WSL> optimize-vhd -Path $path -Mode full

PS D:\WSL> Get-ChildItem -Path $path | fl @{Label="SizeGb"; Expression={$_.Length / 1Gb}}

SizeGb : 35.7119140625

有时候可以压缩到几个Gb,有时候会像这样没什么效果。看情况,如果压缩效果满意的话也可以到此为止。

迁移 WSL

默认的WSL映像是存储在C盘的,如果该盘符分配空间不多而WSL又增长过快的话,将它移动到其他盘应该是个不错的选择。

首先,创建目标目录。比如准备迁移到D:\WSL
powershell中:

1
2
3
4
5
6
7
8
9
10
11
PS C:\Users\chao> cd D:
PS D:\> mkdir WSL


目录: D:\


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2023/8/23 11:10 WSL

导出该系统映像

powershell中:

1
2
3
PS D:\WSL> wsl --export Ubuntu-20.04 D:\WSL\ubuntu_20.04.tar
正在导出,这可能需要几分钟时间。
操作成功完成。

注销原系统

1
2
3
PS D:\WSL> wsl --unregister Ubuntu-20.04
正在注销。
操作成功完成。

导入到新的位置

1
2
3
PS D:\WSL> wsl --import Ubuntu-20.04 D:\WSL\ D:\WSL\ubuntu_20.04.tar
正在导入,这可能需要几分钟时间。
操作成功完成。

默认情况下系统的访问账号是root,为了与先前的体验保持一致,可以设置默认用户。
powershell中:

1
2
3
4
5
PS D:\WSL> cd $env:USERPROFILE\AppData\Local\Microsoft\WindowsApps
PS C:\Users\ciao\AppData\Local\Microsoft\WindowsApps> .\ubuntu2004.exe config --default-user chao
PS C:\Users\ciao\AppData\Local\Microsoft\WindowsApps> wsl -d Ubuntu-20.04
(base) ╭─chao@CHAOSMATX in /mnt/c/Users/ciao/AppData/Local/Microsoft/WindowsApps
$

完好如初!