以前在复现一些基于Linux系统的项目时,一直在使用 WSL2 这个工具,然而近期在使用过程中发现了一个很头疼的问题——WSL安装系统时,默认只会直接安装在 C 盘(包括Docker-desktop),久而久之便会占用大量的 C 盘空间,并且如果直接通过系统的命令行进行删除操作,并不会直接释放占用的 C 盘空间。

这对我这种对硬盘空间极为焦虑的人十分不友好,也算是误打误撞发现了硬盘莫名其妙爆红的元凶……在查阅了一些网上大佬们的解决方案后,也是顺利解决了,在此记录一下这次清理的过程。

0 系统环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
wsl --version

WSL 版本: 2.6.0.0
内核版本: 6.6.87.2-1
WSLg 版本: 1.0.66
MSRDC 版本: 1.2.6228
Direct3D 版本: 1.611.1-81528511
DXCore 版本: 10.0.26100.1-240331-1435.ge-release
Windows: 10.0.26100.6584

lsb_release -a

No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.5 LTS
Release: 22.04
Codename: jammy

1. 找出占用空间的文件(夹)

网上很多教程都是通过压缩的方法解决,但是没有先清理 wsl 中的垃圾,实测一点毛用没有=-=

这里我是这样逐步找出占用空间较大的文件,在 Ubuntu 中运行以下指令

1
sudo du -h --max-depth=1 --exclude=/proc --exclude=/mnt/* / | sort -rh

2. 删除不必要的文件与文件夹

可以看到根目录/总共用了159G,主要大头在 root 用户下的文件夹中以及 statistical (这是之前某次参加比赛使用的文件夹,里面存放了许多模型预训练权重,因此占用空间较大,时间一久把他给忘记了…..现在他的使命也完成了,直接进行删除~),将相关无用文件夹进行 rm -rf 操作后,再查看一下 root 文件夹下,可以发现接下来的重头戏就是 .cache 缓存的清理了。

其中 Pip 缓存可以通过以下指令安全删除

1
pip cache purge

其他缓存根据个人使用和需求可以进行自行删除


3. 使用 DiskPart 压缩磁盘

1
2
3
4
5
6
7
8
9
10
11
12
# 依次运行以下指令

# 先再Windows命令行中关闭 wsl
wsl --shutdown

diskpart
# 下面需要找出占用空间较大的磁盘文件,以下是我的目录
select vdisk file="C:\Users\ROG\AppData\Local\Docker\wsl\main\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

清理到这里就完成了,以下是清理前后的对比:


4. 将 WSL 迁移至其他盘

4.1 准备工作

先通过以下操作查看 wsl 中虚拟机状态,注意接下来的操作需要确保系统为关闭状态,可以使用 wsl --shutdown 来关闭 wsl。

1
2
3
4
wsl -l -v

NAME STATE VERSION
* Ubuntu Stopped 2

4.2 导出/恢复备份

在 E 盘创建一个目录用来存放新的WSL,比如我创建了一个 E:\Ubuntu_WSL

1
2
3
4
5
6
# 导出原系统的备份
wsl --export Ubuntu E:\Ubuntu_WSL\Ubuntu.tar
# 确定在此目录下可以看见备份Ubuntu.tar文件之后,注销原有的wsl
wsl --unregister Ubuntu
# 恢复备份文件
wsl --import Ubuntu E:\Ubuntu_WSL E:\Ubuntu_WSL\Ubuntu.tar

此时打开 wsl ,可以发现已经可以正常使用了。