跳到主要内容

WSL 备份、导出与迁移

WSL 的文件系统默认常常落在系统盘里。刚开始问题不大,但当你装了很多开发环境、模型、缓存和数据集后,它很容易变成 C 盘里的“隐形大户”。

这篇文档主要解决两类需求:

  • 给现有 WSL 实例做完整备份
  • 把 WSL 实例从默认位置迁移到其他磁盘

先分清三个动作

虽然命令都和 wsl --exportwsl --import 有关,但它们的目的不同:

  • 备份:导出成一个 .tar 文件,保留快照
  • 恢复:把 .tar 重新导入成一个新的 WSL 实例
  • 迁移:导出后注销旧实例,再导入到新位置

迁移本质上就是“备份 + 删除旧实例 + 按新位置恢复”。

1. 先确认你要操作的发行版

在 Windows PowerShell 中查看当前实例列表:

wsl -l -v

重点确认两件事:

  • 目标发行版名称
  • 它是不是你当前默认使用的发行版

后面的命令里会用 <DistroName> 表示这个名字。

2. 导出前先关掉 WSL

严格来说,某些场景下 export 可以在实例运行时执行,但为了尽量减少不一致状态,我更建议先停掉 WSL:

wsl --shutdown

这样做的好处是:

  • 文件系统状态更一致
  • 不会导出到一半还在写数据
  • 后续迁移步骤也更清晰

3. 导出完整备份

准备一个你想保存备份的目录,例如:

New-Item -ItemType Directory -Force -Path D:\WSL\backup | Out-Null

执行导出:

wsl --export <DistroName> D:\WSL\backup\<DistroName>-backup.tar

例如:

wsl --export Ubuntu D:\WSL\backup\Ubuntu-backup.tar

这个 .tar 文件就是完整备份。只要它还在,你就可以在同一台机器或另一台机器上重新导入。

4. 从备份恢复为一个新实例

如果你只是想测试恢复是否成功,最稳妥的做法是先恢复成一个新名字,而不是直接覆盖旧实例。

先准备安装目录:

New-Item -ItemType Directory -Force -Path D:\WSL\Ubuntu-Restore | Out-Null

再执行导入:

wsl --import Ubuntu-Restore D:\WSL\Ubuntu-Restore D:\WSL\backup\Ubuntu-backup.tar --version 2

此时你会得到一个新的发行版 Ubuntu-Restore

进入测试:

wsl -d Ubuntu-Restore

5. 把实例迁移到其他磁盘

如果你的目标不是“多恢复一个实例”,而是“把原来的实例从 C 盘搬走”,流程通常如下:

  1. wsl --shutdown
  2. wsl --export <DistroName> <BackupTarPath>
  3. wsl --unregister <DistroName>
  4. wsl --import <DistroName> <NewInstallPath> <BackupTarPath> --version 2

对应示例:

wsl --shutdown
wsl --export Ubuntu D:\WSL\backup\Ubuntu-backup.tar
wsl --unregister Ubuntu
wsl --import Ubuntu D:\WSL\Ubuntu D:\WSL\backup\Ubuntu-backup.tar --version 2

其中第 3 步最危险,因为:

wsl --unregister Ubuntu

会直接删除当前注册的那个实例。如果导出文件还没确认可用,不要急着做这一步。

6. 导入后恢复默认用户

很多人迁移后第一反应是“为什么打开就变成 root 了”。这是导入后的常见现象,不代表数据丢了。

如果你的原用户仍然存在,只是默认登录用户变成了 root,可以在导入后的实例里写 wsl.conf

sudo nano /etc/wsl.conf

写入:

[user]
default=<your_linux_user>

保存后,在 Windows 中执行:

wsl --shutdown

再重新进入发行版,默认用户通常就恢复了。

7. 迁移后怎么验证

不要只看到“能启动”就结束,至少做这几项检查:

wsl -d <DistroName> -- bash -lc "whoami && pwd && df -h /"

再在实例内部确认:

ls ~
echo $HOME

如果你之前在 WSL 里运行过服务或装过工具,还应该顺手再检查:

  • 常用目录是否还在
  • SSH、conda、Docker 等配置是否还在
  • 项目代码、缓存和数据集是否都在预期位置

8. 怎么确认现在到底放在哪个盘

导入后的实例位置由 wsl --import 时的安装目录决定。

如果你是迁移到:

D:\WSL\Ubuntu

那么相关虚拟磁盘和实例数据就会在这个目录下,而不再落回原先的系统默认位置。

常见问题

1. 导入后名字为什么变了

wsl --import 的第一个参数就是新注册实例的名字。你传什么,它就以什么名字出现在 wsl -l -v 里。

2. 能不能不注销旧实例,直接原地覆盖

不建议这样想。WSL 的迁移更适合按“导出一个新副本,再决定是否删旧实例”的思路做,这样回滚最简单。

3. .tar 文件很大怎么办

这是正常现象。WSL 备份本质上就是整个文件系统快照。做迁移时,务必预留足够空间,不要在磁盘只剩一点余量时开始操作。

4. 为什么要先恢复成新实例再删旧实例

因为这样最稳妥。只要你先验证恢复成功,就不会在 unregister 之后才发现备份文件不可用。

一个更稳妥的实际顺序

如果数据很重要,我更建议实际操作时按下面顺序:

  1. 导出备份
  2. 先导入成 Ubuntu-Restore 这类测试实例
  3. 确认能登录、数据完整
  4. 再决定是否注销原实例
  5. 最后按正式名称重新导入到目标路径

这个顺序比“导出完立刻注销”更慢一点,但容错率高很多。

关联阅读