711 字
2 分钟
WSL2 磁盘膨胀急救与预防
0. 前言
在 WSL2 里解压大型数据集(如 S3DIS、ShapeNet)时,Windows C 盘可能在几分钟内直接爆满。这不是中毒,而是 WSL2 的 ext4.vhdx 虚拟磁盘在动态增长但不会自动收缩。本文给出完整的急救流程和长期预防方案。
1. 紧急修复:压缩虚拟磁盘(你现在的位置)
假设你已经进了 DISKPART> 并且成功 select vdisk,继续执行:
attach vdisk readonlycompact vdiskdetach vdiskexit完整流程回顾:
# 1. 确保 WSL2 完全关闭(否则 vhdx 被占用,attach 会报错)wsl --shutdown
# 2. 以管理员身份打开 PowerShell,进入 diskpartdiskpart
# 3. 选择虚拟磁盘(路径因人而异,按 Tab 补全或去 LocalState 里找)select vdisk file="C:\Users\HW\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx"
# 4. 挂载为只读 → 压缩 → 卸载attach vdisk readonlycompact vdiskdetach vdiskexit效果:compact vdisk 会把 ext4 文件系统里已删除但虚拟磁盘未释放的块回收,C 盘通常能瞬间腾出 5~30GB。
2. 如果 compact 后还不够:fstrim + 重建
有时 compact 回收不彻底,因为 ext4 本身也没把空闲块标记为 discard。在 WSL2 Ubuntu 里先执行:
sudo fstrim /然后退出 WSL2,在 PowerShell 里再执行一次 compact vdisk。
终极方案(数据保命):
# 1. 把当前系统导出到 D 盘(备份)wsl --export Ubuntu D:\wsl-backup\ubuntu.tar
# 2. 注销当前系统(会清空 ext4.vhdx,C 盘彻底释放)wsl --unregister Ubuntu
# 3. 从备份重建到 D 盘(可选,或新建一个干净的)mkdir D:\wslwsl --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=16GBprocessors=8localhostForwarding=true# 关键:限制虚拟磁盘最大 100GB,防止失控注意:
wsl --shutdown后重启生效。这个配置不会帮你自动 compact,只是设天花板。
5. 数据集下载的正确姿势
以后下载 S3DIS、ShapeNet 这种 GB 级数据:
# 错误:下载到 WSL2 内部,C 盘爆炸cd ~/projects/pointcloud/datawget https://.../dataset.zip # ❌ 不要这样
# 正确:下载到 Windows D 盘,WSL2 只读cd /mnt/d/Datasetwget https://.../dataset.zip # ✅ 这样unzip dataset.zip -d /mnt/d/Dataset/S3DIS/如果代码要求数据必须在 data/ 子目录,创建符号链接:
cd ~/projects/pointcloud/Pointnet_Pointnet2_pytorchln -s /mnt/d/Dataset/S3DIS data/s3disk_link6. 日常清理命令(每周跑一次)
# 在 WSL2 Ubuntu 里sudo apt autoremove -ysudo apt cleanconda clean --all -ypip cache purgesudo fstrim /然后退出,在 PowerShell 里:
wsl --shutdowndiskpartselect vdisk file="C:\Users\HW\AppData\Local\Packages\...\LocalState\ext4.vhdx"attach vdisk readonlycompact vdiskdetach vdiskexit7. 总结
| 问题 | 解法 |
|---|---|
| C 盘突然爆红 | wsl --shutdown → diskpart → compact vdisk |
| 防止再次爆红 | 数据集放 /mnt/d/,代码放 /home/ |
| 彻底根治 | .wslconfig 限制上限,或 wsl --import 到 D 盘 |
| 日常维护 | fstrim + conda clean + 定期 compact |
WSL2 是开发神器,但它的存储模型是”只进不出”的饕餮。理解 ext4.vhdx 的增长机制,把重数据隔离到 Windows 盘,才能长期稳定使用。
部分信息可能已经过时









