Problem entry · machine-readable · 编码代理与终端

WSL 里报 No space left on device,但 df 显示还有大量空间

本页嵌入 #trove-entity JSON(本条目全量结构化数据);全库数据见 /agent/trove.json。

元数据

idwsl-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)