mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
711 字
2 分钟
WSL2 磁盘膨胀急救与预防
2026-05-06

0. 前言#

在 WSL2 里解压大型数据集(如 S3DIS、ShapeNet)时,Windows C 盘可能在几分钟内直接爆满。这不是中毒,而是 WSL2 的 ext4.vhdx 虚拟磁盘在动态增长但不会自动收缩。本文给出完整的急救流程和长期预防方案。


1. 紧急修复:压缩虚拟磁盘(你现在的位置)#

假设你已经进了 DISKPART> 并且成功 select vdisk,继续执行:

Terminal window
attach vdisk readonly
compact vdisk
detach vdisk
exit

完整流程回顾:

Terminal window
# 1. 确保 WSL2 完全关闭(否则 vhdx 被占用,attach 会报错)
wsl --shutdown
# 2. 以管理员身份打开 PowerShell,进入 diskpart
diskpart
# 3. 选择虚拟磁盘(路径因人而异,按 Tab 补全或去 LocalState 里找)
select vdisk file="C:\Users\HW\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx"
# 4. 挂载为只读 → 压缩 → 卸载
attach vdisk readonly
compact vdisk
detach vdisk
exit

效果compact vdisk 会把 ext4 文件系统里已删除但虚拟磁盘未释放的块回收,C 盘通常能瞬间腾出 5~30GB


2. 如果 compact 后还不够:fstrim + 重建#

有时 compact 回收不彻底,因为 ext4 本身也没把空闲块标记为 discard。在 WSL2 Ubuntu 里先执行:

sudo fstrim /

然后退出 WSL2,在 PowerShell 里再执行一次 compact vdisk

终极方案(数据保命)

Terminal window
# 1. 把当前系统导出到 D 盘(备份)
wsl --export Ubuntu D:\wsl-backup\ubuntu.tar
# 2. 注销当前系统(会清空 ext4.vhdx,C 盘彻底释放)
wsl --unregister Ubuntu
# 3. 从备份重建到 D 盘(可选,或新建一个干净的)
mkdir D:\wsl
wsl --import Ubuntu D:\wsl\Ubuntu D:\wsl-backup\ubuntu.tar --version 2

这样 WSL2 的虚拟磁盘直接住在 D 盘,再也不占 C 盘


3. 为什么 WSL2 会吃光 C 盘#

机制说明
动态增长WSL2 的 ext4.vhdx 按需膨胀,你往 /home/ 写 10GB,它就长 10GB
不自动收缩你在 Linux 里 rm -rf 删了 10GB,.vhdx 文件体积不会变小
单文件上限默认可以膨胀到 256GB 或 1TB(取决于 WSL 版本),直到把 C 盘撑爆
回收依赖必须靠 fstrim + diskpart compact 手动回收,或者 .wslconfig 限制上限

4. 长期预防:数据该放哪#

铁律:大文件永远不要放在 WSL2 的 /home// 下。

存放位置路径是否占 C 盘速度推荐度
WSL2 内部 /home/~/projects/data爆 C 盘最快(ext4)❌ 仅放代码和 conda 环境
Windows D 盘/mnt/d/Dataset/不占中等(9P 协议)数据集首选
外置硬盘/SSD/mnt/e/Dataset/不占取决于 USB 速度✅ 超大数据集
WSL2 外部 ext4 盘/mnt/wsl/data不占⭐ 高级方案

推荐实践:

# 在 WSL2 里创建软链接,假装数据集在家目录
ln -s /mnt/d/Dataset ~/dataset
# 以后所有代码都用 ~/dataset,实际在 D 盘
cd ~/dataset/S3DIS

限制 WSL2 虚拟磁盘上限(治本):

在 Windows 用户目录创建 C:\Users\HW\.wslconfig,写入:

[wsl2]
memory=16GB
processors=8
localhostForwarding=true
# 关键:限制虚拟磁盘最大 100GB,防止失控

注意:wsl --shutdown 后重启生效。这个配置不会帮你自动 compact,只是设天花板。


5. 数据集下载的正确姿势#

以后下载 S3DIS、ShapeNet 这种 GB 级数据:

# 错误:下载到 WSL2 内部,C 盘爆炸
cd ~/projects/pointcloud/data
wget https://.../dataset.zip # ❌ 不要这样
# 正确:下载到 Windows D 盘,WSL2 只读
cd /mnt/d/Dataset
wget https://.../dataset.zip # ✅ 这样
unzip dataset.zip -d /mnt/d/Dataset/S3DIS/

如果代码要求数据必须在 data/ 子目录,创建符号链接

cd ~/projects/pointcloud/Pointnet_Pointnet2_pytorch
ln -s /mnt/d/Dataset/S3DIS data/s3disk_link

6. 日常清理命令(每周跑一次)#

# 在 WSL2 Ubuntu 里
sudo apt autoremove -y
sudo apt clean
conda clean --all -y
pip cache purge
sudo fstrim /

然后退出,在 PowerShell 里:

Terminal window
wsl --shutdown
diskpart
select vdisk file="C:\Users\HW\AppData\Local\Packages\...\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

7. 总结#

问题解法
C 盘突然爆红wsl --shutdowndiskpartcompact vdisk
防止再次爆红数据集放 /mnt/d/,代码放 /home/
彻底根治.wslconfig 限制上限,或 wsl --import 到 D 盘
日常维护fstrim + conda clean + 定期 compact

WSL2 是开发神器,但它的存储模型是”只进不出”的饕餮。理解 ext4.vhdx 的增长机制,把重数据隔离到 Windows 盘,才能长期稳定使用。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

WSL2 磁盘膨胀急救与预防
https://fredsblog-2dc.pages.dev/posts/note-linux-wsl2-deskboom/
作者
Fredzhe
发布于
2026-05-06
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时