被 WSL2 的虚拟磁盘塞爆 C 盘这事儿,我猜不少人都经历过。打开资源管理器一看,C:\Users\<用户名>\AppData\Local\Packages\...\LocalState\ext4.vhdx 动辄几十上百 GB,而且你越折腾 Docker、conda、编译项目,它就长得越离谱。更麻烦的是,你在 WSL 里面删了数据,这个 vhdx 文件也不会自动缩回去,空间被白白占着。想要彻底解决,最干净的办法就是把整个 WSL 发行版迁移到非系统盘,同时还应该把 Windows 的虚拟内存页文件(pagefile.sys)一起挪走,双管齐下,C 盘才能真正瘦下来。
本文我会把迁移的完整流程、两条主流迁移路线、迁移后的配置修复,以及常见报错梳理一遍。不管你是手里装着 Ubuntu 24.04、Debian 还是其他发行版,下面这套操作方法都通用。读完你不仅能动手完成迁移,还会理解每个命令背后到底做了什么,以后遇到类似问题也不用发怵。
1. 先弄清楚 C 盘空间到底被什么吃掉了
1.1 不只是“装了个 Linux 子系统”这么简单
很多人对 WSL2 的认知还停留在“Windows 里能跑 Linux 命令”这个层面,觉得它就是一个模拟器或者一个普通应用。但实际上,WSL2 自从采用了轻量级虚拟机架构之后,整个发行版的文件系统是完整存放在一个虚拟磁盘文件里的。这个文件就是 ext4.vhdx,一般是 Windows 自动创建并管理的。
这个 vhdx 文件的特点是动态增长。你刚装完发行版那会儿,它可能只有 1GB 多;你用 apt 装了几百个软件包,它可能涨到 10GB;你再拉几个 Docker 镜像、创建一批 conda 环境,它轻轻松松突破 50GB。最坑的是,你在 WSL 内部执行 rm -rf 删了一堆东西,磁盘空间确实释放了,但 vhdx 文件不会自动收缩——这个文件在 Windows 眼里依然是那 50GB。
1.2 系统盘的容量永远是“看起来够用,用起来紧张”
大多数电脑出厂时,C 盘就那么 256GB 或者 512GB,Windows 系统本身占去一部分,浏览器缓存、微信聊天文件、软件安装包这些再蚕食一大部分。WSL2 的虚拟磁盘如果放任不管,就会进一步挤占系统盘所剩无几的空间。更麻烦的是,C 盘一旦满了,Windows 更新可能失败、软件无法安装、甚至系统出各种莫名其妙的卡顿。所以把 WSL 挪到非系统盘,本质上不是“优化”,而是一种必要的资源管理。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动手之前先摸清底细:迁移前必做的三件事
2.1 检查当前 WSL 版本和发行版状态
迁移前首先要确认你当前装了什么发行版、它们各自处于什么状态。打开 PowerShell 或者 Windows Terminal,执行:
powershell复制wsl -l -v
输出大致长这样:
code复制 NAME STATE VERSION
* Ubuntu-24.04 Running 2
看到 VERSION 是 2 就放心了,绝大多数情况下我们迁移的都是 WSL2 发行版。同时,STATE 如果是 Running,迁移之前必须把它关掉,不然文件被占用,导出会报错。
2.2 留出足够的临时空间
这一步很多人会忽略,导致迁移中途翻车。核心原因是:wsl --export 导出的 tar 包需要空间,wsl --import 导入后的新 vhdx 也需要空间。我建议这样估算:
- 先看一下当前
