3 minute read

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 盘创建的新目录中。为了方便区分,我们将导入后的新实例命名为小写的 ubuntu2204ubuntu240

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)中。

参考资料

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

Comments