元数据
| id | wsl-no-space-left | 收录 | 2026-08-29 |
|---|---|---|---|
| 问题域 | 编码代理与终端 | 主题分组 | 容器与 WSL |
| 适用工具 | wsl · 外部工具 | ||
症状
WSL 里解压/编译/写入大文件时报 `No space left on device`,但:
```
$ df -h /
/dev/sdd 1007G 190G 766G 20% / # 明明还有 766G 可用
$ dd if=/dev/zero of=/tmp/x.bin bs=1M count=5120 conv=fsync
dd: IO error: No space left on device # 写 ~2.7G 就失败
```
特征:df 显示可用空间充足(甚至 80% 空闲);失败点随机(解压到不同文件);
用户第一反应是"我明明有空间"([microsoft/WSL#1665](https://github.com/microsoft/WSL/issues/1665) 原话 I do have enough space on my device)。
原因
WSL2 的 ext4 文件系统建在**动态扩张的 vhdx 虚拟磁盘**上:`df` 显示的是虚拟容量(默认最大 1TB 级),
不是宿主盘上 vhdx 文件的实际大小。当 WSL 内写入需要 vhdx 物理扩张,而 vhdx 所在的宿主盘
(默认 C 盘,或迁移后的盘)剩余空间不足时,扩张失败 → 内核返回 ENOSPC。
于是出现「df 显示有空间、实际写不进去」的悖论。相关经典 issue:
[microsoft/WSL#1665](https://github.com/microsoft/WSL/issues/1665)(随机 ENOSPC)、#4699(372 comments:删了文件 vhdx 也不还给宿主)。
解法
1. **先定位 vhdx 在哪个盘**:注册表 `HKCU\Software\Microsoft\Windows\CurrentVersion\Lxss\{GUID}` 的 BasePath,
或 PowerShell `Get-ChildItem "$env:LOCALAPPDATA\Packages\*\LocalState\ext4.vhdx"`;
2. **看宿主盘剩余**:`Get-PSDrive` 检查 vhdx 所在盘 Free——本机实测 D 盘只剩 9GB 时 WSL 内写 2.7G 就 ENOSPC。
清宿主盘空间(回收站/大文件/其他发行版 vhdx)即可立即恢复;
3. **让 vhdx 归还空间(治本,删了文件不缩盘)**:
- 新 WSL(2.4.4+):`wsl --shutdown` 后 `wsl --manage <发行版> --set-sparse true`,vhdx 稀疏化,删除文件自动还空间;
- 老版本:`wsl --shutdown` + 管理员 diskpart `compact vdisk`(或 Hyper-V `Optimize-VHD`);
4. **换大盘**:`wsl --export <发行版> <文件.tar>` → 新位置 `wsl --import <发行版> <目录> <文件.tar>`(注意 import 后默认 root 用户/默认发行版要重设,可 `wsl --set-default`);
5. **防患**:docker-desktop 等发行版也各自占 vhdx;大文件放 /mnt/c(直通宿主盘,不占 vhdx),
或把 vhdx 容量上限调小(`wsl --resize` 部分版本支持)。
验证证据
- 本地实测(2026-08-29,WSL Ubuntu,vhdx 在 D:\WSL\Ubuntu,宿主 D 盘仅剩 9GB):
- 基线:df 显示 766G 可用 / vhdx 文件 194.90GB / D 盘 Free 9.0GB;
- 复现:dd 写 5GB 在 ~2.7GB 处报 `IO error: No space left on device`,随后 `df -h /` 仍显示 766G 可用;
- 机制核对:D 盘 Free 9GB(vhdx 无物理空间可扩),df 是虚拟容量——与 #1665 症状同款;
- 清理:删除部分文件后 df 恢复,D 盘 Free 不变、vhdx 大小不变(删除不还空间,即 #4699 诉求点);
- 未实测(需管理员/重启,如实标注):diskpart compact、--set-sparse、--export/--import 迁移。
- 实测复现日志(2026-08-29)
来源与证据
素材来源:https://github.com/microsoft/WSL/issues/1665
验证证据:Evidence details kept locally (2026-08-29)