一、问题
之前使用 WSL Ubuntu 进行过开发板的 Yocto 项目编译,占用空间达到了 70GB 多的空间。后来进行了项目迁移,删除了 WSL 中的所有文件,但是从 Windows 查看空间占用却没有减少:
占用依然是 70 多,查阅发现 vhdx 文件不会自动收缩,其大小会根据历史使用量增长。
二、解决方案
方案一
目前常见的方法是使用 diskpart 工具进行,它会重新计算实际有效数据的大小,并尝试释放未使用的空间,但具体效果取决于文件系统的空闲块是否被“清零”。
在 PowerShell 中输入命令:
(1)关闭 WSL
wsl --shutdown
(2)打开 diskpart
diskpart
(3)找到对应的 vhdx 文件,依次执行
select vdisk file="C:\Users\<用户名>\AppData\Local\Packages\<DistroPackage>\LocalState\ext4.vhdx"
attach vdisk readonly # 只读模式挂载
compact vdisk # 压缩操作
detach vdisk
exit
compact vdisk 会扫描虚拟磁盘,仅保留实际存储数据的区块,但前提是未使用的空间必须被显式填充为零(例如通过 dd if=/dev/zero)。如果删除文件后未清零,这些空间可能仍被视为“已占用”。
方案二(彻底)
WSL export 通常用于更改 WSL 的安装目录或打包到其他电脑中使用。使用 WSL export 命令可以重新计算实际文件内容的大小并导出,而不是直接复制 vhdx 的原始大小。
(1)删除 /tmp 文件夹内的临时文件,我的大概删了 20 个 G
sudo rm -rf /tmp/*
(2)关闭 WSL
wsl --shutdown
(3)在创建时可能会修改名字,查看已安装的 WSL
wsl -l -v
显示:
(4)根据这个名字,导出为 tar 包:
wsl --export Ubuntu ./ubuntu.tar
我这里是放在了当前目录,建议放在磁盘的根目录,导出时方便些,我这里是 E 盘的根目录。
(5)删除当前的系统
wsl --unregister Ubuntu
此时可以看到,vhdx 文件已经删除了,剩下的文件如果需要更改安装目录,可以全部删除。
(6)导入到新的文件夹
wsl --import Ubuntu-22.04 F:\wsl_ubuntu22.04\ E:\ubuntu.tar --version 2
这里 Ubuntu-22.04 是新的系统名称,可以自行设置;F:\wsl_ubuntu22.04\ 是导入目录,就是要保存的目标文件夹;E:\ubuntu.tar 是导出的 tar 包;--version 2 设置 WSL 的版本。
(7)删除导出的 tar 包,查看导出结果
wsl -l
导出后的大小只有 3G:
(8)启动系统
启动后默认会以 ROOT 用户登录,可以先查看原始用户是否存在:
ls /home
如果存在,则新建 /etc/wsl.conf 文件:
vi /etc/wsl.conf
写入:
[user]
default = xxx
这里填入自己的用户,然后重启 WSL:
wsl --shutdown
如果没有用户,那就新建一个,并且使用上面的方式设置默认登录。