如果你跟我一样,日常开发环境就是 Windows 上加一套 WSL 的 Ubuntu,那你迟早会撞上同一个问题:C 盘又快满了。WSL 默认会把整个发行版塞进系统盘,一个 ext4.vhdx 文件随随便便几十个 G。平时装个 CUDA、跑两个 Docker 容器、再编译几轮 Node 或者 Rust 项目,磁盘占用就像滚雪球。把 WSL 从 C 盘搬到其他磁盘,不是可做可不做的优化,而是很多人的刚需。
这篇文章我会把 WSL 的存储机制、迁移方案的取舍、完整操作步骤、迁移后的优化和踩坑记录全部分享出来。整理的工具和命令都是我在实际环境中验证过的,照着做基本不会翻车。适合被 C 盘空间折腾到头大的 WSL 用户,也适合刚装完系统想从一开始就规划好磁盘布局的新手。
1. 先搞明白:WSL 为什么占 C 盘,迁移前要准备什么
1.1 WSL1 与 WSL2 的存储差异
先说一个很多人混淆的概念:WSL 1 和 WSL 2 在存储上完全是两套逻辑。
WSL 1 是类似 API 映射的兼容层,Linux 的文件系统直接落在 Windows 目录里,你看到的那个发行版文件夹就是一个真实的目录树。WSL 2 则完全不同,它跑在一个轻量级虚拟机上,整个 Ubuntu 的文件系统被封装进一个虚拟磁盘文件里,这个文件就是常说的 ext4.vhdx。你在 Ubuntu 里执行 ls -l 看到的所有文件、安装的每个包、跑过的每个容器数据,全都在这个 vhdx 内部。
这个虚拟磁盘默认放在当前用户的 LocalAppData 目录下,具体路径类似:
code复制C:\Users\<你的用户名>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu...\LocalState\ext4.vhdx
不同渠道安装的 Ubuntu 前缀会有差异,但位置都在 Packages 目录里。我见过不少人以为 WSL 就是个普通的 Linux 工具,卸载掉数据就没了。实际上 WSL 的发行版数据独立性很强,卸载 App 不等于删除虚拟磁盘。这既是好事(数据不容易误删),也是麻烦(空间不知不觉被吃光)。
1.2 为什么 vhdx 会越用越大,删除文件却不缩小
WSL 2 的虚拟磁盘默认是动态扩展的。什么意思?它一开始创建的物理文件很小,比如 2 个 G,随着你在里面写数据,文件会逐渐变大,但一旦你删除了里面的文件,这个 vhdx 物理文件却不会自动缩小回来。
我举个实际场景:你在 Ubuntu 里下载了一个 10 GB 的数据集跑算法,用完以后 rm -rf 删掉了。你以为磁盘空间回来了,看看 C 盘你会发现还是少了 10 个 G。原因就是 vhdx 文件已经在物理上扩展到了对应大小,虚拟磁盘不会因为文件系统内的删除操作自动收缩。
这一点直接决定了迁移的时候不能简单粗暴地复制 vhdx 了事。如果你把已经膨胀到 30 GB 的 vhdx 直接搬去 D 盘,那这 30 GB 依然被占用着。正确做法是先把虚拟磁盘压缩到合理大小再迁移,或者迁移后做一次压缩。后面的实操部分我会讲这一步怎么处理。
1.3 迁移前检查清单
动手之前,先花五分钟确认几件事,能避免后面很多麻烦。
第一,确认你的 WSL 版本和发行版名称。
code复制wsl -l -v
这个命令会列出所有已安装的发行版和版本号,比如 Ubuntu、Ubuntu-22.04、Debian 等。不同机器上发行版名称可能不一样,后续所有命令里的名字都必须和这里显示的一致,粘贴复制的时候千万别改。
第二,确认 WSL 本身的版本。
code复制wsl --version
新版 WSL 会有独立的版本号,支持 --vhd 参数和 wsl --manage 指令。老版本先执行 wsl --update 升级。
第三,确认目标磁盘的文件系统和剩余空间。
WSL 的磁盘文件也遵守 Windows 的基本规则,NTFS 格式下没有任何问题,FAT32 不推荐,因为单文件大小限制会导致迁移失败。建议目标盘至少留出和当前 WSL 占用同等大小的空间,最好再富余 20% 左右。导出时还会生成一个临时备份文件,这个文件也需要空间,记得把这块也计算进去。
第四,重要数据先备份。
虽然迁移过程本身不会丢数据,但是任何磁盘操作都有风险。特别重要的项目、数据库数据、配置文件,建议先在 Ubuntu 里打包一份放到 Windows 目录下,或者推送到远端仓库。这一步花不了几分钟,但能救你一次。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 三种搬家方案,为什么我推荐 export/import
2.1 方案一:wsl --manage --move,最快但有前提
新版 WSL(0.67.0 以上)提供了一个看起来最直接的命令:
code复制wsl --manage Ubuntu --move D:\WSL\Ubuntu
这一条命令就能把发行版移动到新路径,速度很快,
