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

相关推荐
siriuuus42 分钟前
Linux 网络配置解析、IP地址配置及常用网络命令
linux·网络
ZYMFZ43 分钟前
Linux 防火墙 Iptables
linux·运维·服务器
口嗨农民工2 小时前
linux 时间相关的命令
linux·运维·服务器
evo-master2 小时前
网络编程-HTTP
linux·网络
轻松Ai享生活3 小时前
一文搞懂应用程序 core dump 和内核 core dump
linux
云飞云共享云桌面3 小时前
1台电脑10个画图设计用怎么实现
linux·运维·服务器·网络·数据库·自动化·电脑
小MarkK3 小时前
[Ubuntu][mount]ubuntu电脑挂载新硬盘
linux·ubuntu·电脑·mount·硬盘挂载
艾莉丝努力练剑3 小时前
【Linux】初始Linux:从计算机历史发展、操作系统历史脉络的角度详谈Linux相关的话题,附Linux安装和用户创建(环境准备)详解
linux·运维·服务器·经验分享
l1t4 小时前
how to build tbox xml into the demo
xml·linux·c语言·parser·tbox
努力学习的小廉4 小时前
深入了解linux系统—— 线程池
linux·运维·服务器