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

相关推荐
wdfk_prog5 分钟前
[Linux]学习笔记系列 -- 内存管理与访问
linux·笔记·学习
go_bai6 分钟前
Linux-网络基础
linux·开发语言·网络·笔记·学习方法·笔记总结
糖~醋排骨17 分钟前
FW防火墙的配置
linux·服务器·网络
ZFB000118 分钟前
【麒麟桌面系统】V10-SP1 2503 系统知识——设置面板无法打开
linux·运维·kylin
2301_780943841 小时前
linux 对文件打补丁(Patch)
linux·运维·服务器
敬往事一杯酒哈1 小时前
Ubuntu 20.04 安装Anacada
linux·运维·ubuntu
Lam㊣1 小时前
服务器端口转发的方法
linux·服务器
zxnbmk1 小时前
【7】Kubernetes存储(本章知识密度较高,仅浅浅了解后续详解)
linux·云原生·容器·kubernetes
ChangYan.1 小时前
Windows命令行(cmd)下快速查找文件路径(类似Linux下find命令)
linux·运维·服务器
Hey小孩1 小时前
[个人总结] LDD3:3.字符驱动 - scull(4)
linux·驱动开发