wsl2虚拟磁盘扩容需先关闭wsl,用diskpart扩展vhdx上限,再在linux内用resize2fs同步文件系统;默认上限常为256gb/512gb,删除文件不自动收缩,须手动扩容才能解决“no space left on device”。

当你在Windows 11的WSL2中训练大模型、构建Docker镜像或处理GB级数据集时,突然弹出“No space left on device”错误,说明当前VHDX虚拟磁盘已触达上限——这个上限默认是1TB,但很多用户实际只分配了256GB或512GB,且Linux端删除文件不会自动收缩VHDX物理体积。
确认当前VHDX大小与使用状态
先打开PowerShell(无需管理员权限),执行以下命令查看真实占用:
wsl -d Ubuntu-22.04 df -h /(将Ubuntu-22.04替换为你实际的发行版名称)
重点看“Size”列:若显示为256G/512G/1T,就是当前VHDX上限;再对比“Use%”,超过95%即需扩容。注意:这个Size不是Windows上ext4.vhdx文件的实际大小,而是WSL内核识别的逻辑容量上限。
接着查Windows端该文件物理路径:Get-ChildItem $env:LOCALAPPDATA\Packages\*Ubuntu*\LocalState\ext4.vhdx | Select-Object FullName, @{Name="SizeGB";Expression={[math]::Round($_.Length/1GB,2)}}。若这里显示32GB但df显示256G,说明VHDX已满但尚未写满——这是典型“逻辑满、物理未满”状态,必须扩容上限才能继续写入。
用diskpart扩展VHDX虚拟大小
方法一:手动diskpart流程(兼容所有WSL版本)
① 以管理员身份打开PowerShell,执行:wsl --shutdown。这一步必须做,否则diskpart会提示“VHD被占用”。
② 获取你的发行版完整包名:Get-AppxPackage -Name "*Ubuntu*" | Select PackageFamilyName。输出类似CanonicalGroupLimited.Ubuntu22.04onWindows_79rhkp1fndgsc,复制整段。
③ 拼出VHDX完整路径:$path = "$env:LOCALAPPDATA\Packages\$(Get-AppxPackage -Name '*Ubuntu*' | Select -Expand PackageFamilyName)\LocalState\ext4.vhdx",然后运行echo $path确认路径存在且无乱码。
④ 启动diskpart:diskpart → 等待出现DISKPART>提示后,逐行输入:
Select vdisk file="$path"
detail vdisk
记下“虚拟大小”值(如256 GB),换算成MB:256 × 1024 = 【262144】。你要扩到的新值必须严格大于它,比如扩到512GB就填524288。
expand vdisk maximum=524288
exit
在WSL内同步文件系统尺寸
启动你的WSL发行版,例如:wsl -d Ubuntu-22.04。
执行lsblk,找到根分区设备名(通常是/dev/sdb或/dev/sdc,不是/dev/sda)。若不确定,运行mount | grep ext4,输出中on / type ext4前面的设备就是目标。
运行sudo resize2fs /dev/sdb(把/dev/sdb替换成你查到的实际设备)。这一步将ext4文件系统扩展到VHDX新上限,耗时取决于磁盘大小,512GB约需1–3分钟。
最后验证:df -h /。Size列应已更新为512G,且Available值明显增加。











