今天突然发现 C
盘快满了,想起来之前把 Docker
容器的数据持久化到了 WSL2
的某个目录下,于是就想着把不需要的文件清理了。但清理完毕之后我发现 C
盘的剩余空间并没有变大,非常的奇怪。后来我在网上搜索了很久,终于找到了原因和解决方法。
1 分析原因
不同于 WSL1
,WSL2
本质上是虚拟机,所以 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
删除文件后空出来的磁盘空间就被释放了。
相关文章
暂无评论...