如果你也是那种C盘常年爆红、装个WSL没多久就发现Linux子系统已经吃掉几十个G的人,那这篇应该能帮你省下不少事。WSL(Windows Subsystem for Linux)说白了就是Windows里跑一个原生Linux内核环境,日常做开发、跑脚本、装工具链都挺方便,但它默认把所有虚拟磁盘文件都放在C盘用户目录下,时间一长文件系统镜像能涨到20GB甚至更多。把WSL迁移至非系统盘,是释放C盘空间最彻底也最省心的做法之一。这篇文章就完整记录一遍我把WSL从C盘迁到D盘的全过程,包含原理、命令、踩坑记录和迁移完之后的优化措施,适合所有被C盘空间困扰、想彻底把WSL发行版挪走的开发者参考。
1. 迁移前必读:WSL到底把东西放在哪
1.1 WSL2的虚拟磁盘机制
不少人对WSL的理解还停留在“Windows里装了个Linux文件夹”的阶段,实际上WSL2早就不是这个玩法了。WSL2底层是一个轻量级虚拟机,整个Linux根文件系统、安装的软件、用户数据、环境变量,全部打包在一个VHDX虚拟磁盘文件里。默认安装时,这个虚拟磁盘会被放到当前用户的本地应用数据目录里,路径长这样:
text复制C:\Users\<你的用户名>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu24.04LTS_xxx\LocalState\ext4.vhdx
不同发行版在Packages下的目录名不一样,Ubuntu、Debian、Kali各自的包名都不同,但结构基本类似。那个ext4.vhdx就是整个Linux系统的大本营,只要它还在C盘,你的C盘就永远不可能清爽。
这里要特别注意一个反直觉的现象:VHDX文件只增不减。你在WSL里删除文件、卸载软件,Windows侧看到的ext4.vhdx大小并不会明显缩小,因为虚拟磁盘内部释放的空间默认不会自动回收。所以哪怕你觉得自己“没装什么东西”,用久了这个文件照样可能膨胀到三四十个G。网上经常有人问为什么C盘空间越来越少,最后排查出来都是WSL的虚拟磁盘在偷偷“虚胖”。
1.2 为什么不能直接剪切文件夹
很多人第一反应是:“那我直接把整个Packages目录剪切到D盘不就行了?”听起来很直接,但实际操作会踩出一堆坑。
原因很简单:WSL发行版注册信息不在这个文件夹里,而是写在Windows注册表中。系统启动WSL时,会先读取注册表里登记的发行版名称、安装路径、BasePath等信息,然后按照注册表指向的位置去加载VHDX。你只剪切文件、不更新注册表,重新打开WSL时它还是去找原来的C盘路径,找不到就报错,或者更糟——系统在旧路径重新初始化一个全新的空白VHDX,看起来像数据全丢了。那种“明明文件还在但WSL里一片空白”的恐慌感,体验过一次就不想体验第二次。
另外,直接复制一个正在被占用的VHDX文件也有风险。如果WSL后台进程没完全退出,VHDX可能处于挂载状态,复制出来的文件本身就是损坏的,导入时大概率会报“an error occurred while running a wsl command”之类的错误。所以手工剪切复制这条路,不建议走。
我给三种常见方案做了个对比,看完你就明白为什么推荐官方导出导入:
| 迁移方式 | 是否推荐 | 优点 | 缺点 |
|---|---|---|---|
| 直接剪切/复制Packages目录 | 不推荐 | 操作简单、无需命令 | 注册表未更新、VHDX易损坏、版本升级后目录名会变 |
| 第三方工具(如LxRunOffline) | 不推荐 | 功能多、支持改路径 | 额外依赖、兼容性风险、遇到WSL大版本更新容易失灵 |
| 官方wsl --export / --import | 强烈推荐 | 微软原生支持、稳定可靠、可顺带备份 | 需要执行几条命令,但都有固定套路 |
1.3 迁移方案选型:为什么用官方导出导入
现在WSL迁移最靠谱的方案,就是官方提供的wsl --export和wsl --import命令组合。整体思路分三步:先把WSL发行版导出成一个tar包,然后从Windows注销掉这个发行版,最后重新导入到非系统盘的指定目录。
这个方案的第一个好处是“轻”。它不用手动去碰VHDX文件,也不会动Windows注册表里那些复杂的键值,所有迁移逻辑都由WSL服务自己完成,版本兼容性最好。第二个好处是“顺”。导出过程等于给你整个Linux环境做了一次完整快照,万一迁移后出问题,保留的tar包还能随时再导入回去,相当于顺便做了一次备份。第三个好处是“净”。新导入时系统会重新生成一个VHDX文件,体积是以当前实际内容为准的,之前在C盘那个“虚胖”的虚拟磁盘等于被自然压缩了一轮。
我在决定迁移之前也犹豫过要不要用第三方工具,毕竟网上教程多、看起来一键搞定。但考虑到
