1. 开始前,必读的三件事
① 你要搬的其实只是「一个文件」
WSL2 把整个 Linux 系统(你的项目、装的软件、配置、SSH 密钥)都装在 ext4.vhdx 这一个虚拟磁盘文件里
。所谓迁移,就是把这个文件挪到 F 盘,并让 WSL 知道它搬去哪了。只要文件完整过去,数据就完整过去。
② 绝对不要用文件资源管理器「剪切 / 粘贴」
手动搬 .vhdx 会丢失注册表项和分发元数据,导致 WSL 完全识别不出这个实例,甚至损坏文件系统
。必须用下面的命令行方式。
③ 全程只有一处不可逆风险
wsl --unregister 会永久删除原发行版的数据、设置和已装软件
。所以本手册把它放在「备份确认无误」之后,且有备份兜底。
2. 第一步:做一次完整备份(别跳过)
这一步哪怕一切顺利也用不上,但 72 GB 的东西,多一层保险不亏
。
打开 PowerShell(普通权限即可,不必管理员)
,逐条执行:
perl
powershell
# ① 先建好存放备份的文件夹
mkdir F:\wsl_backup
# ② 彻底关闭 WSL(必须!否则导出不完整)
wsl --shutdown
# ③ 确认已经关掉
wsl -l -v
第 ③ 步的输出应该看到 Ubuntu-22.04 的 STATE 是 Stopped
。不是 Stopped 就别往下做,导出前必须先终止并关闭 WSL,否则 tar 包可能不完整。
bash
powershell
# ④ 导出为 tar 备份包
wsl --export Ubuntu-22.04 F:\wsl_backup\ubuntu2204_backup.tar
- 耐心等:72 GB 可能需要十几分钟到半小时,屏幕会像卡住一样,这是正常的。
- 完成后检查
F:\wsl_backup\ubuntu2204_backup.tar是否存在、大小是否在 50 GB 以上。 - ✅ 看到这个文件且体积合理,才可以继续。
3. 第二步:确认你的 WSL 支不支持「一条命令搬家」
css
powershell
wsl --version
wsl --help
在 wsl --help 的输出里找有没有 --move。
- 有
--move→ 走下面的 路线 A(推荐,最省事) - 没有
--move→ 走 路线 B
不同来源对最低版本要求说法不一(2.0.4 / 2.3.11 等)
,唯一可靠的判断标准就是
wsl --help里实际列出了--move。如果没列出来,先执行wsl --update升级再试。
4. 路线 A:一条命令搞定(推荐)
用官方 --move 命令的好处是:发行版名字不变、默认用户不变、所有配置不变 ,你那些写死了 Ubuntu-22.04 的脚本一个字都不用改
。它会直接移动 .vhdx 文件并自动更新注册表,几乎不丢数据、速度也最快。而且是从 WSL 2.3.11 起微软引入的官方方案,不再需要导出注销导入那套。
务必先关闭 WSL,避免文件被锁定
:
perl
powershell
# ① 关闭
wsl --shutdown
# ② 确认状态是 Stopped
wsl -l -v
# ③ 执行迁移
wsl --manage Ubuntu-22.04 --move F:\Ubuntu_System
执行时会看到什么: 一条进度条,几十 GB 大概十几秒到几分钟
。
关于目标目录: 有的版本会自动创建目录
,有的版本要求目标目录不存在或为空。所以不要提前手动去建 F:\Ubuntu_System,让命令自己处理;如果报「目录已存在」,就把这个空目录删掉再重跑。
然后跳到 第 6 步:验证。
5. 路线 B:导出 / 注销 / 导入(--move 不可用时用)
⚠️ 这条路会「换个名字重新注册发行版」------如果只按原样操作,你可能需要重新确认一遍配置
。按下面的步骤走就行。
bash
powershell
# ① 关闭 WSL
wsl --shutdown
wsl -l -v # 确认 Stopped
# ② 建目标目录
mkdir F:\Ubuntu_System
# ③ 给目标目录授予当前用户的完全控制权限(避免导入后报「拒绝访问」)
icacls "F:\Ubuntu_System" /grant "%USERNAME%:(F)" /t
# ④ 从备份导入(复用第 2 步导出的 tar)
wsl --import Ubuntu-22.04 F:\Ubuntu_System F:\wsl_backup\ubuntu2204_backup.tar --version 2
导入后必须处理的两件事:
- 恢复默认用户(导入后默认会变成 root 登录):
arduino
powershell
Ubuntu-2204 config --default-user ganjunhao
如果这条命令提示找不到,就进入 WSL 编辑 /etc/wsl.conf,加上:
ini
ini
[user]
default=ganjunhao
然后 wsl --shutdown 再重新进入
。
- 设为默认发行版:
arduino
powershell
wsl --set-default Ubuntu-22.04
6. 第六步:验证迁移结果
bash
powershell
# ① 确认发行版还在、还是默认(带 *)
wsl -l -v
# ② 进入 Ubuntu
wsl -d Ubuntu-22.04
# ③ 进去后确认身份没变
whoami
df -h
逐项对照:
wsl -l -v里Ubuntu-22.04存在、VERSION是 2whoami显示的是ganjunhao,不是 root(是 root 就回看第 5 步的修法)df -h正常显示磁盘- 打开你常用的项目,能编译能跑
- Docker 能起来(如果你用 Docker)、ssh 能连
再打开「此电脑」,看 C 盘容量是不是回来了约 72 GB。
7. 第七步:顺手瘦身(建议做)
迁移不会自动压缩已经膨胀的磁盘,只是换了个位置
。所以趁现在压一次,把腾出来的空间留在 F 盘而不是又还回 C 盘:
arduino
powershell
wsl --shutdown
wsl --manage Ubuntu-22.04 --set-sparse true
注意 :如果第 3 步发现你的 WSL 不支持 --move,这一条可能也不支持,跳过即可,不影响迁移本身。
8. 出问题怎么办(排查表)
表格
| 现象 | 原因 | 处理 |
|---|---|---|
wsl --export 报错 / 卡住 |
WSL 没完全关闭 | 重跑 wsl --shutdown,确认 wsl -l -v 是 Stopped |
| 报「无法找到指定分发版」 | 名字写错 | 用 wsl -l -v 里的准确名称,一个字都不能差 |
| 「无法将磁盘附加到 WSL2:拒绝访问」 | 目标目录权限不足 | 重跑第 5 步的 icacls 命令给目录授权 |
| 迁移后登录成了 root | 导入方式的固有后遗症 | 用 config --default-user 你的用户名 或改 /etc/wsl.conf |
--move 报「目标目录已存在」 |
有的版本要求目录为空 | 删掉这个空目录,或在命令里换成别的目录名 |
| 「找不到 --move / 版本过旧」 | WSL 版本太老 | wsl --update 升级后再试 |
9. 万一失败,怎么退回去
你第 2 步导出的 F:\wsl_backup\ubuntu2204_backup.tar 就是「后悔药」:
r
powershell
wsl --import Ubuntu-22.04 F:\Ubuntu_System F:\wsl_backup\ubuntu2204_backup.tar --version 2
这套导出/导入流程本身就是标准的「备份---恢复」机制,适合用来把 WSL 环境存下来
。
建议:备份 tar 包至少保留一到两周,确认新环境稳定后再删(它占 70 GB 左右)。
10. 最终检查清单
动手前
- 备份 tar 已生成,大小合理
wsl -l -v显示发行版名为Ubuntu-22.04、VERSION 为 2- F 盘空间足够(你的 575 GB 完全够)
- 已确认
wsl --help里有没有--move
动手时
- 已执行
wsl --shutdown并确认 Stopped - 如果开了 Docker Desktop,已先退出
动手后
wsl -l -v能看到发行版且仍是默认whoami是你原来的用户名,不是 root- 项目能编译 / Docker 能起 / ssh 能连
- C 盘释放了约 72 GB
- 已执行
--set-sparse true瘦身
一句话总结
先备份 → wsl --shutdown → wsl --manage Ubuntu-22.04 --move F:\Ubuntu_System → 验证 → 压缩瘦身。
有 --move 就用它,没有就走导出/注销/导入。