解决Windows的Linux子系统WSL中的虚拟硬盘文件VHDX空间占用庞大与回收问题

前言

在使用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虚拟硬盘文件空间将大幅减小!

相关推荐
夜光小兔纸17 分钟前
-bash: lsof: command not found
linux·运维·oracle
要好好养胃42 分钟前
1-7makefile
linux·服务器·前端
重生之我在20年代敲代码1 小时前
【Linux第一弹】Linux基础指令(上)
linux·运维·服务器
ljh5746491192 小时前
linux vim 撤销 回退操作
linux·运维·vim
要好好养胃3 小时前
2-1文件描述符
linux·服务器
振宇i3 小时前
golang安装(1.23.6)
linux·运维·服务器
abstract学习3 小时前
zookeeper
linux·zookeeper·apache
赵民勇3 小时前
‌Debian 包版本号比较规则详解
linux·debian
万兜鍪:>4 小时前
线程(Thread)
linux·c语言·vscode·学习
要好好养胃4 小时前
1-3压缩命令
linux·服务器·数据库