解决删除文件后 WSL2 磁盘空间不释放的问题

今天突然发现 C 盘快满了,想起来之前把 Docker 容器的数据持久化到了 WSL2 的某个目录下,于是就想着把不需要的文件清理了。但清理完毕之后我发现 C 盘的剩余空间并没有变大,非常的奇怪。后来我在网上搜索了很久,终于找到了原因和解决方法。

1 分析原因

不同于 WSL1WSL2 本质上是虚拟机,所以 Windows 会自动创建 vhdx 后缀的虚拟磁盘文件作为存储。这个 vhdx 后缀的虚拟磁盘文件特点是可以自动扩容,但是一般不会自动缩容。一旦有很多文件把它“撑大”,即使把这些文件删除它也不会自动“缩小”。所以删除文件后还需要我们手动进行压缩才能释放磁盘空间。

2 如何操作

2.1 找到并确定要压缩的虚拟磁盘文件

首先,我们搜索并找到 ext4.vhdx 文件。
我的 WSL2 有如下的 Linux distributions:

➜  wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-20.04           Running         2
  docker-desktop         Running         2
  docker-desktop-data    Running         2

我搜索到的 ext4.vhdx 文件l路径如下:

  • C:\Users\richa\AppData\Local\Docker\wsl\data\ext4.vhdx
  • C:\Users\richa\AppData\Local\Docker\wsl\distro\ext4.vhdx
  • C:\Users\richa\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx

由于我这里 C 盘空间不足主要是 Ubuntu-20.04 删除文件后 ext4.vhd 没有缩容引起的,所以只压缩了它的 ext4.vhdx
如果出现删除 Docker 镜像、删除 Docker 容器后磁盘占用没有缩小,应该也可以类比操作。

2.2 备份虚拟磁盘文件所属的 Linux distribution(可选)

PowerShell 中执行:

# 关闭 WSL2 中的 linux distributions
wsl --shutdown
# 备份指定的 Linux distribution 到指定的位置
wsl --export Ubuntu-20.04 D:\Ubuntu-20.04.tar

如果后续步骤出现错误,可以从备份的文件中恢复。本人后续步骤并没有出现错误,所以并没有实践恢复的操作。
有需要的读者可以参考:wsl2-backup-and-restore-images-using-import-and-export

2.3 压缩虚拟磁盘文件

PowerShell 中执行:

# 关闭 WSL2 中的 linux distributions
wsl --shutdown
# 运行管理计算机的驱动器的 DiskPart 命令
diskpart

在新打开的 DiskPart 命令窗口中执行:

# 选择虚拟磁盘文件
select vdisk file="C:\Users\richa\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx"
# 压缩文件
compact vdisk
# 压缩完毕后卸载磁盘
detach vdisk

上述操作执行完毕,WSL2 删除文件后空出来的磁盘空间就被释放了。

你可能感兴趣的:(解决删除文件后 WSL2 磁盘空间不释放的问题)