如何将 WSL2 镜像无损迁移至非系统盘

本文首发于我的个人博客:Better Mistakes

版权声明:本文为原创文章,转载请附上原文出处链接及本声明。

由于技术迭代较快,文章内容可能随时更新(含勘误及补充)。为了确保您看到的是最新版本,并获得更好的代码阅读体验,请访问:

🍭 原文链接https://bfmhno3.github.io/tutorial/wsl2-image-migration-guide/

目录

  • [1 引言](#1 引言)
    • [1.1 笔者环境](#1.1 笔者环境)
  • [2 准备工作](#2 准备工作)
    • [2.1 确认当前安装状态](#2.1 确认当前安装状态)
    • [2.1 确定原镜像及目标路径](#2.1 确定原镜像及目标路径)
    • [2.2 建立新的位置](#2.2 建立新的位置)
  • [3 迁移镜像](#3 迁移镜像)
    • [3.1 导出原 WSL 分发](#3.1 导出原 WSL 分发)
    • [3.2 将压缩包导入新位置](#3.2 将压缩包导入新位置)
    • [3.3 恢复默认用户](#3.3 恢复默认用户)
    • [3.4 设置为默认分发并清理善后](#3.4 设置为默认分发并清理善后)
  • [4 总结](#4 总结)
  • 参考资料

1 引言

随着开发环境的日益庞大,默认安装在 C:\ 盘的 WSL2 (Windows Subsystem for Linux) 镜像体积也会不断膨胀。本文将分享如何通过命令行操作,将 WSL 迁移至 E:\ 盘乃至其他盘符,彻底释放系统盘空间。

1.1 笔者环境

名称 版本
Windows 11 Pro 25H2 26200.8037
PWSH 7.5.5
WSL 2.6.3.0
Ubuntu 22.04 LTS
Ubuntu 24.04 LTS

注意 :这里的 PWSH 并不是指 Windows 系统内置的经典 PowerShell,而是跨平台的开源项目 PowerShell Core。下文中使用 PowerShell 指代系统默认版本,PWSH 指代开源版本。

2 准备工作

2.1 确认当前安装状态

如果你还没有安装镜像,或想查看当前支持的发行版,可以使用以下命令:

bash 复制代码
# 查看支持的在线发行版
wsl --list --online

# 安装 Ubuntu 镜像
wsl --install Ubuntu-22.04
wsl --install Ubuntu-24.04

在终端输入以下命令,查看当前已安装的发行版:

bash 复制代码
wsl -l -v

2.1 确定原镜像及目标路径

WSL2 的虚拟磁盘文件通常为 ext4.vhdx。你可以使用强大的文件搜索工具 Everything 来定位它们。不同版本的 Ubuntu 默认安装路径可能略有不同。

镜像 原始路径
Ubuntu 22.04 LTS C:\Users\<your_windows_username>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_...\LocalState
Ubuntu 24.04 LTS C:\Users\<your_windows_username>\AppData\wsl\{UUID}

可以看到这里两者的路径有着细微差别,Ubuntu 22.04 LTS 安装在 Local\Packages 下,而 Ubuntu 24.04 LTS 却安装在 Local 同级的 wsl 下。

具体原因犹未可知,笔者暂时没有时间去查阅官方文档,但是并不影响后续步骤以及日常使用。

2.2 建立新的位置

在上一步中已经获取到了原始的位置,根据笔者的风格,迁移之后的镜像路径应该尽可能维持原来的目录结构,但是笔者还是做了一点细微的修改,迁移路径具体如下:

镜像 迁移路径
Ubuntu 22.04 LTS E:\Users\<your_windows_username>\AppData\wsl\ubuntu2204
Ubuntu 24.04 LTS E:\Users\<your_windows_username>\AppData\wsl\ubuntu2404

请在后续的命令行中将 <your_windows_username> 替换为你的实际 Windows 用户名。

在新版的 PWSH 中可以直接使用以下命令创建目录:

powershell 复制代码
mkdir -p E:\Users\<your_windows_username>\AppData\wsl\ubuntu2204\
mkdir -p E:\Users\<your_windows_username>\AppData\wsl\ubuntu2404\

或者以下命令(支持在 PowerShell 中使用):

powershell 复制代码
New-Item -Path E:\Users\<your_windows_username>\AppData\wsl\ubuntu2204\ -ItemType Directory
New-Item -Path E:\Users\<your_windows_username>\AppData\wsl\ubuntu2404\ -ItemType Directory

3 迁移镜像

3.1 导出原 WSL 分发

在进行导出操作前,强烈建议先停止 WSL2 中的所有工作并彻底关闭所有正在运行的 WSL 实例以防止数据损坏:

bash 复制代码
wsl --shutdown

接着,将现有的系统状态导出为 .tar 压缩包:

bash 复制代码
wsl --export Ubuntu-22.04 E:\Users\<your_windows_username>\AppData\wsl\ubuntu2204.tar
wsl --export Ubuntu-24.04 E:\Users\<your_windows_username>\AppData\wsl\ubuntu2404.tar

3.2 将压缩包导入新位置

使用 wsl --import 命令将刚才导出的 .tar 文件导入到我们在 E 盘创建的新目录中。为了方便区分,我们将导入后的新实例命名为小写的 ubuntu2204ubuntu240

bash 复制代码
wsl --import ubuntu2204 E:\Users\<your_windows_username>\AppData\wsl\ubuntu2204 E:\Users\amara\AppData\wsl\ubuntu2204.tar
wsl --import ubuntu2404 E:\Users\<your_windows_username>\AppData\wsl\ubuntu2404 E:\Users\amara\AppData\wsl\ubuntu2404.tar

利用 wsl --import,你可以将同一个 .tar 包导入多次并赋予不同名称,从而实现多开同一个发行版。虽然在隔离环境方面类似于 Docker,但 WSL2 原生支持 WSLg,可以直接运行 Linux 图形化应用,这在某些桌面开发场景下比 Docker 更具优势。

3.3 恢复默认用户

导入完成并启动新的分发后,你可能会发现默认登录用户变成了 root。我们需要将其改回你原本的 Linux 用户名。如果你的分发并没有发现此类问题,可以跳过本节。

进入新的 WSL 实例:

bash 复制代码
wsl ~ -d ubuntu2204

使用 nano 编辑器修改 WSL 配置文件(如果你更习惯图形化界面,也可以执行 apt update && apt install gedit -y 后使用 gedit):

bash 复制代码
sudo nano /etc/wsl.conf

在文件中添加或修改以下内容(将 <your_linux_username> 替换为你在 WSL 中的用户名):

ini 复制代码
[user]
default=<your_linux_username>

保存并退出:依次按下 Ctrl + X,输入 Y 确认保存,最后按 Enter 退出。

退出当前 WSL 会话,并在 Windows 终端中重启改实例使配置生效:

bash 复制代码
# 终止实例
wsl --terminate ubuntu2204
# 重新进入验证用户是否恢复正常
wsl ~ -d ubuntu2204

3.4 设置为默认分发并清理善后

如果一切验证无误,将新的实例设置为系统的默认 WSL 分发:

bash 复制代码
wsl --set-default ubuntu2404

确认无误后,就可以卸载 C 盘中的旧分发了:

bash 复制代码
wsl --unregister Ubuntu-22.04
wsl --unregister Ubuntu-24.04

最后,删除存放在 E 盘的过渡文件 .tar 压缩包以释放空间。此时再次执行 wsl -l -v,你应该能看到干净清爽的列表了。

4 总结

迁移安装最大的好处就是能显著减小 C 盘的存储压力。不过,如果你的物理磁盘总容量本身较小(比如只有 512GB 单盘),笔者依然更推荐直接重装系统并只保留一个 C 盘分区,统一管理存储空间。

此外,根据微软官方文档的建议,为了获得最佳的文件 I/O 性能,进行 Linux 相关的开发时,请务必将项目文件直接存储在 WSL 的 Linux 文件系统(如 ~ 目录下),而不是跨文件系统存储在 Windows 盘符(如 /mnt/c)中。

参考资料

  1. Installing Ubuntu on /mnt/d with WSL
  2. install-latex-guide-zh-cn (附录B.5 迁移 WSL 的安装位置)

📢 写在最后

如果你觉得这篇文章对你有帮助,欢迎到我的个人博客 Better Mistakes 逛逛。

在那里我归档了更多高质量的技术文章,也欢迎通过 RSS 订阅我的最新动态!