先问一句你的C盘是不是又飘红了Windows下装WSL这几年我遇到最多的问题不是“WSL怎么装”而是“WSL把C盘吃光了怎么办”。每次执行完wsl --shutdown我看着那个几十GB的ext4.vhdx文件发呆好久明明Linux里没装几个软件虚拟磁盘怎么就能长这么大后来折腾了无数次才知道WSL扩容和Windows普通分区扩容完全是两码事里面藏了很多细节。这篇我把WSL磁盘扩容的完整思路、底层原理、实操命令和踩坑记录全部捋清楚。无论你是虚拟磁盘上限不够想直接放大还是C盘空间不足想把整个WSL迁到D盘又或者是扩容后发现df -h没有变化都能在这篇里找到对应解法。全程按实践顺序写命令可以直接复制适合所有不想在这件事上浪费半天时间的WSL用户。1. 先搞清楚扩容对象WSL的“硬盘”到底藏在哪1.1 ext4.vhdx那个体积惊人的“大文件”很多人一直以为WSL装在Windows里就是一堆文件夹直到C盘告警才发现真正的大户是一个叫ext4.vhdx的文件。这个文件就是WSL的整个虚拟磁盘WSL2里的Ubuntu、Debian、openSUSE等发行版所有Linux文件系统数据都封装在这个VHDX文件里。默认情况下它藏在这里C:\Users\你的用户名\AppData\Local\Packages\具体的发行版包名不同目录也不一样。比如Ubuntu 24.04通常是C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu24.04LTS_xxxxx\LocalState\ext4.vhdx我第一次找这个文件的时候在Packages目录里足足翻了一分钟。最快的方式不是在资源管理器里一层层点而是直接在PowerShell里执行Get-ChildItem -Path $env:LOCALAPPDATA\Packages -Filter ext4.vhdx -Recurse | Select-Object FullName, {NSizeGB;E{[math]::Round($_.Length/1GB,2)}}这条命令会把所有发行版的VHDX位置和实际大小一次性列出来很直观。看到那个动辄30GB、50GB的文件你就明白C盘为什么不够用了。1.2 为什么没装几个软件C盘却被吃光WSL的VHDX默认是动态增长的虚拟磁盘不是一次性占满空间的。你刚装完发行版时这个文件可能只有几百MB。但用着用着它会一点点变大而且有几个情况会让它疯涨Docker Desktop挂到WSL里时镜像、容器、volumes全存在WSL的文件系统里overlay2目录能轻松吃掉十几GB。开发依赖比较重的项目node_modules、Python虚拟环境、CUDA和PyTorch等包一装就是好几个GB。编译缓存、日志、apt缓存这些“看不见的垃圾”在WSL里越堆越多而你在Windows的“磁盘清理”里根本看不到它们。最关键的是你在WSL里删掉文件后VHDX文件不会自动缩小。它可以只增不减除非你手动做compact操作。这就是很多人反复清理Linux内部空间C盘却一点没变少的根本原因。搞清楚这一点后扩容的思路就清晰了要么把这个VHDX文件本身的上限调大要么把它整个挪到别的盘顺便给C盘减负。2. 扩容前必须搞懂的三件事2.1 VHDX是动态增长的虚拟磁盘先理解VHDX是个什么东西用生活类比很简单它就像一个能自动变大的行李箱。你往里面装衣服箱子会跟着撑大你把衣服拿出来箱子却不会自动缩小需要手动压一压才恢复体积。在箱子里能装多少衣服取决于箱子的“标称容量”箱子实际占了家里多少地面才是C盘上真正占用的空间。WSL2默认给这个箱子的标称容量通常很大有些版本是256GB较新的版本默认上限是1TB。所以日常使用中大多数人遇到的不是“WSL提示磁盘满”而是“C盘被VHDX实际占用撑爆了”。当然也有另一种情况虚拟磁盘上限设置得比较小Linux里才用了几十GB就提示No space left on device这就真正需要扩容了。两种情况的处理路径完全不同。前者优先考虑迁移或者清理后者优先考虑直接放大VHDX。2.2 扩容是“两层空间”的事这是最容易踩坑的地方。WSL扩容要同时做两件事第一层Windows侧把VHDX文件的上限调大比如从200GB扩到512GB。这一步让“行李箱标称容量”变大但行李箱本身还没有变鼓。第二层Linux侧把分区和文件系统扩展到新的容量也就是在Linux里执行growpart和resize2fs。这一步才是真正让Linux系统“看到”并“用上”新增空间的关键。只做第一层、不做第二层的后果就是你在WSL里执行df -h磁盘大小跟扩容前一模一样。我自己就犯过这个错expand完VHDX回到WSL发现没变化还以为命令没生效后来才意识到还要resize文件系统。2.3 动磁盘前的备份最佳姿势是什么扩容操作本身风险不算高但任何对虚拟磁盘的操作都有翻车可能尤其是在Windows更新、磁盘驱动或PowerShell模块出问题时。我的建议是操作前至少做一次导出备份。WSL的备份命令很简单wsl --shutdown wsl --export Ubuntu D:\backup\ubuntu.tar注意导出的tar文件会非常大和WSL里实际使用空间相当。如果C盘已经没空间了导出文件一定要放到别的盘比如D盘。导出耗时取决于数据量几十GB可能要等十几分钟到半小时中间别去动终端。注意如果磁盘空间真的很紧张导出前先在Linux里做一次清理。把apt缓存、包管理器缓存、旧的Docker镜像清一遍删之前先给WSL“瘦身”再导出备份压力会小很多。因为导出的是整个文件系统垃圾越多导出越久越占空间。另外新版WSL还支持直接导出为VHDX格式wsl --export Ubuntu D:\backup\ubuntu.vhdx --vhd我个人觉得普通用户用tar格式就够了通用性更好VHDX格式更适合后面想直接用import-in-place注册的场景一会细说。3. 实操扩容两条能落地的路线3.1 路线一diskpart直接放大VHDX适用情况C盘本身空间还够只是WSL内部的虚拟磁盘上限不够或者是想给df -h里已经满掉的空间续命。操作速度最快不用等导出导入。第一步完全关闭WSL。注意不是关闭窗口而是把所有发行版都停掉wsl --shutdown然后确认所有发行版都变成Stopped状态wsl -l -v看到State一列全是Stopped之后再继续。如果还有Running可能是后台进程占用先关掉相关程序再执行一次wsl --shutdown。第二步用diskpart扩展VHDX。在PowerShell里执行diskpart进入diskpart交互环境后依次输入select vdisk fileC:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu24.04LTS_xxxxx\LocalState\ext4.vhdx expand vdisk maximum524288 detach vdisk exit这里maximum524288的单位是MB也就是512GB。如果原来是256GB想扩到512GB就是512 * 1024 524288。想扩到1TB就写1048576。数字按需算别把单位搞错不少人在这里把MB和GB搞混导致容量翻倍或减半。expand vdisk之前不需要attach。如果系统提示虚拟磁盘正被占用说明WSL没完全停掉。diskpart执行成功会显示“DiskPart successfully expanded the VHDX file”。如果用的是家庭版Windows没有Hyper-V模块Resize-VHD这个PowerShell命令可能用不了diskpart反而是最通用的方案。第三步也是很多教程漏掉的一步回到WSL里扩展文件系统。这一步放到第4节专门讲。3.2 路线二导出导入顺手把WSL搬到D盘适用情况C盘已经飘红没有空间给VHDX“长大”或者你想把整套Linux环境从C盘搬到D盘长期使用。这种方式相当于“重新部署”一个WSL发行版效果是换了家顺便把容量也重置了。流程分四步第一步备份当前环境wsl --shutdown wsl --export Ubuntu D:\backup\ubuntu.tar第二步注销当前发行版。这里要特别注意注销会移除当前注册的WSL实例但不会删除你导出的tar文件wsl --unregister Ubuntu执行完这一步原来C盘里的ext4.vhdx会被删除C盘空间立刻释放。这也是很多人说的“卸载WSL”最干净的方式。第三步重新导入到目标目录wsl --import Ubuntu D:\WSL\Ubuntu D:\backup\ubuntu.tar --version 2这里D:\WSL\Ubuntu是新的安装位置可以自己指定。导入需要几分钟完成后D:\WSL\Ubuntu\ext4.vhdx就是新的虚拟磁盘了。注意wsl --import导入的发行版默认用户会变成root而且默认不会把之前的默认用户恢复。这个坑在第5节里详细讲怎么修。第四步进入WSL扩展文件系统同样是第4节的内容因为导入的镜像文件系统大小通常还是原来的分区大小。如果之前导出用的是VHDX格式新版WSL还支持直接注册wsl --import-in-place Ubuntu D:\backup\ubuntu.vhdx这种方式不需要解包tar注册速度很快但前提是你导出的就是VHDX文件。我叫它“极简迁移方案”适合已经把WSL环境折腾到极度满意、不想动任何文件系统配置的读者。3.3 两条路线怎么选直接说结论我做了一个对比表方便你对号入座场景推荐路线原因C盘空间充足但WSL内部磁盘上限不够diskpart扩VHDX快不用重新导入风险最低C盘空间不足需要给C盘腾位置导出导入到D盘一次性解决C盘压力顺便备份想换个更大的固态盘继续用WSL导出导入迁移和扩容一步到位只是虚拟磁盘上限不够C盘还有几十GB剩余diskpart扩VHDX省时间不需要重新配置默认用户电脑是新装的WSL里没啥重要数据直接wsl --unregister后重装比扩容更快更干净选路线时最重要的判断依据其实是C盘剩余空间。C盘都红了就别想着diskpart扩容了因为扩展VHDX文件本身不会释放任何空间只是修改一个数字。先把WSL迁走才是真正给C盘续命。4. 文件系统扩容让WSL真正用上新增空间4.1 用lsblk和df确认当前的“感量”不管走哪条路线扩容操作中都有一天避不开进入WSL执行文件系统扩展。先别急着敲命令先看清楚当前系统里磁盘的情况。进入WSL后执行df -h lsblkdf -h看的是文件系统使用情况lsblk看的是块设备和分区结构。WSL2里VHDX虚拟磁盘一般显示为/dev/sdb分区是/dev/sdb1挂载在/下。如果你看到的是/dev/sda也别慌不同环境和驱动版本下盘符会有差异以lsblk为准。重点看两列SIZE和AVAILABLE。如果VHDX已经expand过了但df -h显示根分区还是原来的大小说明分区和文件系统还没扩展到新空间。这时候就需要growpart和resize2fs上场。4.2 growpart resize2fs完整操作以典型的/dev/sdb1为例完整操作流程如下第一步检查文件系统完整性有错误先修复sudo e2fsck -f /dev/sdb1如果文件系统没问题这一步会快速跳过。如果有错误它会提示你是否修复选yes即可。这一步不是可选项直接resize一个不健康的文件系统有丢数据风险。第二步扩展分区sudo growpart /dev/sdb 1这里的意思是把/dev/sdb磁盘的第1个分区扩展到磁盘末尾。如果系统提示growpart: command not found需要先安装工具# Ubuntu/Debian sudo apt update sudo apt install cloud-guest-utils -y # CentOS/RHEL sudo yum install cloud-utils-growpart -y第三步扩展文件系统sudo resize2fs /dev/sdb1这条命令会把ext4文件系统扩展到整个分区。执行完再次运行df -h你会发现根分区大小已经变成expand时设置的目标容量了。整个过程从执行到结束通常不到一分钟比在Windows上扩展分区快多了。这里有个细节我的VHDX上限改了但Linux系统里文件系统是ext4还是xfs决定了最后一步命令不同。ext4用resize2fsxfs用xfs_growfs /。默认Ubuntu是ext4AlmaLinux、CentOS等很多RHEL系默认xfs。4.3 CentOS/其他发行版特供命令既然热搜词里频繁出现“centos7 根目录扩容”这里单独把CentOS系的操作写一下。CentOS默认用的文件系统很可能是xfs所以流程是sudo yum install cloud-utils-growpart -y sudo growpart /dev/sdb 1 sudo xfs_growfs /xfs_growfs /表示把根文件系统扩展到最大可用大小。执行成功后同样用df -h确认。Debian系和Ubuntu类似用resize2fs就行。如果是openSUSE之类的发行版先看文件系统类型df -T /确认再选对应的grow命令。如果你在扩容时发现分区是LVM逻辑卷比如CentOS分区结构里有/dev/mapper/cl-root这种路径那还需要多两步先pvresize扩展物理卷再lvresize扩展逻辑卷最后再扩展文件系统。WSL2默认环境很少用LVM但如果你手动配置过或者导入了完整的CentOS镜像就需要先确认一下。5. 扩容路上踩过的坑和我最后的救场5.1 没停WSL就操作虚拟磁盘被占用这个坑我踩得特别透彻。最早一次我跑到Windows Terminal里敲diskpart输入select vdisk后系统提示“虚拟磁盘服务错误虚拟磁盘正在使用中”。当时我一脸茫然明明终端窗口都关了。后来才明白关掉WSL终端窗口并不等于停止WSL发行版。很多服务进程、后台任务还在跑VHDX一直被系统锁定。正确的姿势是先执行wsl --shutdown再用wsl -l -v确认所有发行版State为Stopped。甚至有时候你以为停了但Windows里的某些程序还挂着WSL会话比如Docker Desktop那就要把Docker Desktop整个退掉再试。如果确认没有WSL进程还是报占用可以重启一次Windows再操作别硬刚。我试过硬刚很多次结果都是失败告终。5.2 导出导入后默认用户变成root使用wsl --import重新导入发行版的人十个里有八个会遇到这个情况登录进去发现用户名是root之前的用户名和密码全都不好使了。原因是--import导入的发行版不会保留旧的默认用户配置。解决办法很简单在WSL里创建或修改/etc/wsl.conf[user] default你的用户名改完执行wsl --shutdown重启WSL生效。如果导入后发现系统里根本没有原来的用户目录了先用root登录手动创建用户再设置默认用户useradd -m -s /bin/bash 你的用户名 chown -R 你的用户名:你的用户名 /home/你的用户名顺便把sudo权限也加上不然很多命令跑不了。另外还有一种更快的临时解法用发行版对应的exe设置默认用户比如Ubuntuubuntu.exe config --default-user 你的用户名但推荐优先用wsl.conf因为新版本WSL对这套方式支持更标准。5.3 删了文件C盘空间不返还这是很多人测出“扩容后C盘也没变大”的迷惑性原因之一。你在WSL里删了文件VHDX文件大小不会自动缩回去。那怎么把“瘦身”后的空间还给C盘方法一diskpart手动压缩。先停止WSL然后wsl --shutdown diskpart select vdisk fileC:\...\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exitcompact会把VHDX里未使用的空间清零并压缩文件就变小了。注意compact要求磁盘必须只读挂载所以一定要加readonly别乱写。压缩后C盘可能多出来几个GB甚至十几GB效果很明显。方法二用新版WSL的“稀疏VHD”功能。如果你的WSL版本支持可以执行wsl --manage Ubuntu --set-sparse true开启后VHDX会自动回收未使用的空间不用每次手动compact。但要注意Hyper-V等虚拟机软件对稀疏VHD的兼容性不如普通VHDX稳这个功能看个人取舍。5.4 常见问题与排查速查表问题原因解决办法diskpart expand报“磁盘正在使用”WSL还在Running或Docker占用wsl --shutdown后确认所有发行版Stopped退出Docker Desktopexpand成功但WSL里df -h没变化没有扩展Linux分区/文件系统执行growpart /dev/sdb 1resize2fs /dev/sdb1growpart: command not found系统没有安装cloud-guest-utilsUbuntu安装cloud-guest-utilsCentOS安装cloud-utils-growpart导入后默认用户是root导入不保留旧的默认用户配置配置/etc/wsl.conf的[user]字段重启WSLxfs文件系统用resize2fs报错文件系统类型不是ext4用df -T /确认类型xfs改用xfs_growfs /VHDX越来越大C盘空间被吃光动态磁盘不自动回收用diskpart的compact vdisk手动压缩或开启sparse导入的发行版systemd起不来新版WSL默认没有开启systemd在/etc/wsl.conf里设置[boot] systemdtrue扩容后发现WSL进不去分区表或文件系统扩展出错先e2fsck -f修复再重新growpart不要重复执行多余命令这些坑我基本都踩过一遍尤其在文件系统类型搞混这个问题上曾经把一台xfs的WSL当ext4处理执行resize2fs直接报错吓出一身冷汗。其实只要先查类型再动手整个过程是很稳的。最后聊点实际体会。我个人现在的习惯是首次装好WSL后直接把VHDX上限设置成自己短期内够用的值比如512GB然后定期在Linux里清理apt缓存和Docker废弃镜像再用compact vdisk把空间还给C盘。这样一来C盘空间吃紧的概率大大降低。如果哪天新项目需要大量数据需要迁移就直接导出导入到数据盘根本不用纠结C盘。扩容这个事本质上就是“Windows层扩大容器Linux层扩大文件系统最后检查空间”顺序别乱命令别漏。希望这篇能让你的WSL不再成为C盘杀手。