1. 为什么需要迁移WSL2到非系统盘?
很多开发者第一次接触WSL2时,都会直接从微软商店安装Ubuntu发行版。默认情况下,系统会把所有文件存放在C盘的隐藏目录里。随着使用时间增长,你会发现C盘空间莫名其妙被吃掉几十GB。我去年就遇到过C盘只剩3GB的窘况,连Windows更新都提示空间不足。
WSL2的磁盘占用主要来自三个方面:首先是基础系统文件,Ubuntu 20.04初始安装大约占用1.5GB;其次是apt安装的软件包,像Python全家桶、Docker这些开发环境轻松吃掉5GB+;最可怕的是项目数据,比如训练机器学习模型时生成的临时文件,我曾经有个TensorFlow项目单数据集就占了20GB。
更麻烦的是,WSL2使用的是动态扩容的虚拟硬盘(ext4.vhdx),这个文件会随着使用不断膨胀,但不会自动收缩。即便删除了里面的文件,虚拟硬盘占用的物理空间也不会释放。有次我清理了Ubuntu里10GB的缓存文件,回到Windows查看vhdx文件大小纹丝不动。
2. 迁移前的准备工作
2.1 检查当前WSL状态
首先打开PowerShell(管理员权限),运行:
wsl -l -v这个命令会列出所有已安装的WSL发行版及其状态。确认你要迁移的Ubuntu 20.04处于"Stopped"状态。如果显示"Running",需要先执行:
wsl -t Ubuntu-20.04接着查看当前虚拟硬盘的位置和大小:
Get-ChildItem "C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited*\LocalState\*.vhdx" | Select-Object FullName,Length记下这个vhdx文件的路径,稍后导出时会用到。我的机器上显示大小是27.8GB,而实际Ubuntu系统只用到了15GB左右。
2.2 准备目标存储位置
在目标盘(比如D盘)创建存放目录。建议路径不要包含中文和空格:
mkdir D:\WSL\Ubuntu2004考虑到未来可能安装多个WSL实例,可以建立层级目录结构。我个人的习惯是按发行版和用途分类:
D:\WSL ├── Ubuntu2004 ├── Ubuntu2204 └── Kali注意:确保目标分区有足够剩余空间。建议至少保留原vhdx文件1.5倍的可用空间,以防导出过程中需要临时存储。
3. 完整迁移操作步骤
3.1 导出现有系统镜像
在PowerShell执行导出命令,这相当于给WSL系统做个快照:
wsl --export Ubuntu-20.04 D:\WSL\temp.tar这个过程可能会持续5-15分钟,取决于你的系统大小。我的27GB镜像用了约8分钟完成导出,生成的temp.tar文件大小是14GB。
3.2 导入到新位置
关键命令来了:
wsl --import Ubuntu-20.04-new D:\WSL\Ubuntu2004 D:\WSL\temp.tar --version 2参数说明:
Ubuntu-20.04-new是新实例的名称(后续可以改名)D:\WSL\Ubuntu2004是目标路径temp.tar是上一步导出的镜像--version 2指定使用WSL2
导入完成后,立即删除临时文件释放空间:
del D:\WSL\temp.tar3.3 设置默认用户
导入的新实例默认以root身份登录,需要修改注册表设置默认用户。新建reg文件并写入以下内容:
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{你的分发版ID}] "DefaultUid"=dword:000003e8分发版ID可以通过命令获取:
wsl -l -v然后在注册表编辑器中找到对应项,将"DefaultUid"值改为你的用户UID(十进制1000对应十六进制3E8)。
4. 迁移后的优化配置
4.1 清理旧系统
确认新系统运行正常后,可以卸载原系统释放C盘空间:
wsl --unregister Ubuntu-20.04然后手动删除残留文件:
Remove-Item -Path "C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited*" -Recurse -Force4.2 配置快捷方式
在桌面新建快捷方式,目标位置填写:
wsl -d Ubuntu-20.04-new如果想保留原名称,可以先注销旧实例,然后重命名新实例:
wsl --unregister Ubuntu-20.04 wsl --import Ubuntu-20.04 D:\WSL\Ubuntu2004 D:\WSL\Ubuntu2004\ext4.vhdx --version 24.3 磁盘空间回收技巧
WSL2的虚拟硬盘不会自动收缩,需要手动压缩。首先在Ubuntu内运行:
sudo apt install zerofree sudo zerofree -v /dev/sda1然后在PowerShell执行:
wsl --shutdown diskpart select vdisk file="D:\WSL\Ubuntu2004\ext4.vhdx" attach vdisk readonly compact vdisk detach vdisk exit这套操作让我的vhdx文件从27GB缩小到了15GB。建议每月执行一次维护。
5. 常见问题解决方案
5.1 导入后无法启动
如果遇到错误码0x800700b7,通常是权限问题。尝试:
icacls "D:\WSL\Ubuntu2004" /grant "你的用户名":(OI)(CI)F然后重新导入镜像。
5.2 网络连接异常
迁移后可能会出现apt无法更新的情况。在Ubuntu内执行:
sudo rm /etc/resolv.conf sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf' sudo chattr +i /etc/resolv.conf5.3 性能调优建议
在.wslconfig文件中添加以下配置(位于用户目录下):
[wsl2] memory=8GB processors=4 localhostForwarding=true这可以避免WSL2占用过多主机资源,特别是当你有大内存需求时。
迁移完成后,我的C盘瞬间多出30GB空间,再也不用每天清理临时文件了。有个细节提醒大家:如果你使用Docker Desktop with WSL2,记得在设置里将新创建的WSL实例设为默认,否则它可能还会继续使用C盘空间。