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

相关推荐
孞㐑¥1 小时前
Linux之Socket 编程 UDP
linux·服务器·c++·经验分享·笔记·网络协议·udp
M4K04 小时前
Linux百度网盘优化三板斧
linux
好奇的菜鸟5 小时前
如何在 Ubuntu 24.04 (Noble) 上使用阿里源
linux·运维·ubuntu
bcbobo21cn5 小时前
初步了解Linux etc/profile文件
linux·运维·服务器·shell·profile
望获linux5 小时前
【实时Linux实战系列】CPU 隔离与屏蔽技术
java·linux·运维·服务器·操作系统·开源软件·嵌入式软件
0wioiw06 小时前
C#基础(项目结构和编译运行)
linux·运维·服务器
2401_873587827 小时前
Linux常见指令以及权限理解
linux·运维·服务器
Arthurmoo7 小时前
Linux系统之MySQL数据库基础
linux·数据库·mysql
李洋-蛟龙腾飞公司7 小时前
HarmonyOS NEXT应用元服务常见列表操作分组吸顶场景
linux·运维·windows
链上Sniper7 小时前
智能合约状态快照技术:实现 EVM 状态的快速同步与回滚
java·大数据·linux·运维·web3·区块链·智能合约