如何将 WSL2 镜像无损迁移至非系统盘
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 确认当前安装状态
如果你还没有安装镜像,或想查看当前支持的发行版,可以使用以下命令:
# 查看支持的在线发行版
wsl --list --online
# 安装 Ubuntu 镜像
wsl --install Ubuntu-22.04
wsl --install Ubuntu-24.04
在终端输入以下命令,查看当前已安装的发行版:
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 中可以直接使用以下命令创建目录:
mkdir -p E:\Users\<your_windows_username>\AppData\wsl\ubuntu2204\
mkdir -p E:\Users\<your_windows_username>\AppData\wsl\ubuntu2404\
或者以下命令(支持在 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 实例以防止数据损坏:
wsl --shutdown
接着,将现有的系统状态导出为 .tar 压缩包:
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 盘创建的新目录中。为了方便区分,我们将导入后的新实例命名为小写的 ubuntu2204 和 ubuntu240:
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 实例:
wsl ~ -d ubuntu2204
使用 nano 编辑器修改 WSL 配置文件(如果你更习惯图形化界面,也可以执行 apt update && apt install gedit -y 后使用 gedit):
sudo nano /etc/wsl.conf
在文件中添加或修改以下内容(将 <your_linux_username> 替换为你在 WSL 中的用户名):
[user]
default=<your_linux_username>
保存并退出:依次按下 Ctrl + X,输入 Y 确认保存,最后按 Enter 退出。
退出当前 WSL 会话,并在 Windows 终端中重启改实例使配置生效:
# 终止实例
wsl --terminate ubuntu2204
# 重新进入验证用户是否恢复正常
wsl ~ -d ubuntu2204
3.4 设置为默认分发并清理善后
如果一切验证无误,将新的实例设置为系统的默认 WSL 分发:
wsl --set-default ubuntu2404
确认无误后,就可以卸载 C 盘中的旧分发了:
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)中。
Comments