前言
在使用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权限运行以下命令
sudofstrim /2.关闭所有Linux子系统
wsl--shutdown3.压缩VHDX
可以使用Windows自带的磁盘管理工具
Optimize-VHD进行手动压缩VHDX,以管理员权限打开PowerShell,执行以下命令:
Optimize-VHD-Path'D:\VM\Ubuntu\ext4.vhdx'-ModeFull执行上述命令后,可以在PowerShell中看到如下类似的磁盘空间压缩进度条,当压缩完毕后可以发现ext4.vhdx虚拟硬盘文件空间将大幅减小!
注意
如果遇到如下异常:
PS C:\Users\Administrator>Optimize-VHD-Path'D:\VM\Ubuntu\ext4.vhdx'-ModeFull Optimize-VHD:由于找不到某个对象,Hyper-V 尝试在计算机“DESKTOP-AAAAAA”上访问该对象时遇到错误。请验证该计算机上的虚 拟机管理服务是否正在运行。 所在位置 行:1 字符:1+ Optimize-VHD-Path'D:\VM\Ubuntu\ext4.vhdx'-ModeFull + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:ObjectNotFound:(:)[Optimize-VHD], VirtualizationException + FullyQualifiedErrorId:ObjectNotFound,Microsoft.Vhd.PowerShell.Cmdlets.OptimizeVhd这是因为Hyper-V 虚拟机管理服务没有运行。需要先启动服务,再执行 VHD 优化。
Start-Service vmms