前言
在使用Windows Subsystem for Linux (WSL) 的过程中,会遇到一个问题:随着时间的推移,VHDX 文件会不断增大,即使已经删除了大量的文件。这是因为文件系统在删除文件后,并不会立即释放这些空间,而是标记这些块为可回收,等待回收机制来清理它们。
问题描述
在使用Windows的Linux子系统时,遇到了一个Ubuntu的WSL实例,经过一段时间的使用,发现这个VHDX文件的体积已经变得非常大,甚至超过了实际使用的容量,磁盘已经变红,发出了警告。同时也有通过Windows的文件管理器访问
\\wsl.localhost\Ubuntu\root
进行了相关清理操作,但是Windows的磁盘空间不曾减少!
问题分析
Linux子系统有更改存储路径,存储在
D:\VM\Ubuntu\ext4.vhdx
文件中,可以明显发现这个文件大小非常巨大,它就是磁盘变红告警的罪魁祸首!
文件系统特性:
ext4是一个 Linux 原生的文件系统,而 Windows 并不直接支持它。Windows子系统 (WSL) 使用一个虚拟硬盘文件 (VHDX) 来模拟 Linux 环境。
空间回收问题:
当在WSL中删除文件时,这些文件在Linux环境中被标记为已删除,但实际上数据仍然存在于VHDX文件中。Windows并不知道这些文件已经被删除,所以VHDX文件的大小不会自动缩小。
文件系统和磁盘映像的差异:
文件系统删除文件时,它只是移除了文件的引用,但数据块可能仍然保留。
VHDX是一个磁盘映像,它不会自动调整大小来反映文件系统的变化。
解决方案
1.标记回收
启动WSL的实例,如Ubuntu子系统,使用
fstrim
命令来通知文件系统哪些块是可以回收的,以root权限运行以下命令
bash
sudo fstrim /
2.关闭所有Linux子系统
bash
wsl --shutdown
3.压缩VHDX
可以使用Windows自带的磁盘管理工具
Optimize-VHD
进行手动压缩VHDX,以管理员权限打开PowerShell
,执行以下命令:
bash
Optimize-VHD -Path 'D:\VM\Ubuntu\ext4.vhdx' -Mode Full
执行上述命令后,可以在PowerShell中看到如下类似的磁盘空间压缩进度条,当压缩完毕后可以发现ext4.vhdx虚拟硬盘文件空间将大幅减小!