将 WSL2 从 C 盘迁移到其他硬盘

环境: Windows 11 + WSL2 + Ubuntu 22.04 目的: 将占用 C 盘 211 GB 的 WSL 虚拟磁盘迁移到其他硬盘,彻底释放 C 盘空间


背景

WSL2 默认将虚拟磁盘文件(ext4.vhdx)存储在 C 盘,路径为:

C:\Users\<用户名>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_<hash>\LocalState\ext4.vhdx

随着在 WSL 内安装工具、存放项目文件,这个文件会不断膨胀。本文记录了将一个占用 211 GB 的 Ubuntu 22.04 实例完整迁移到 F 盘的全过程。


前置准备

  • 目标硬盘有足够空闲空间,建议至少是当前 vhdx 大小的 2 倍(需要临时存放 tar 备份)
  • PowerShell 以普通用户权限运行即可,无需管理员
  • 迁移期间 WSL 会关闭,正在运行的任务请提前保存

步骤总览

查看发行版名称 → 关闭 WSL → 导出 tar → 注销原版 → 导入新位置 → 修复用户 → 验证清理

详细步骤

Step 1:查看当前发行版名称

wsl --list --verbose

输出示例:

  NAME                   STATE           VERSION
* Ubuntu-22.04           Running         2
  podman-machine-default Stopped         2

记下要迁移的发行版名称,本文为 Ubuntu-22.04。带 * 号的是默认发行版。


Step 2:关闭 WSL

wsl --shutdown

⚠️ 必须先关闭 WSL,否则 vhdx 文件被占用,导出会失败。


Step 3:导出为 tar 文件(备份)

在目标盘创建存放目录,然后执行导出:

# 先建好目录
mkdir F:\WSL

# 导出
wsl --export Ubuntu-22.04 F:\WSL\ubuntu22.tar

导出过程中会显示文件大小和进度,完成后提示”操作成功完成”。

💡 tar 文件大小与 vhdx 相近,确保目标盘有足够空间再执行。


Step 4:注销原发行版

wsl --unregister Ubuntu-22.04

⚠️ 执行后 C 盘的 ext4.vhdx 会被立即删除,请确认 Step 3 的 tar 文件已成功生成再执行!


Step 5:导入到新位置

wsl --import Ubuntu-22.04 F:\WSL\Ubuntu22 F:\WSL\ubuntu22.tar --version 2

参数说明:

参数 说明
Ubuntu-22.04 发行版名称,可以和原来保持一致
F:\WSL\Ubuntu22 新 vhdx 的存放目录,会自动创建
F:\WSL\ubuntu22.tar Step 3 导出的备份文件
--version 2 使用 WSL2

Step 6:恢复默认登录用户

导入后默认以 root 登录,需要改回原来的普通用户。

方法一(推荐):

ubuntu2204 config --default-user 你的用户名

方法二: 在 WSL 内编辑配置文件:

sudo tee /etc/wsl.conf <<EOF
[user]
default=你的用户名
EOF

💡 用户名替换为实际的 Linux 用户名,可在迁移前用 whoami 命令确认。


Step 7:验证并清理

进入 WSL 验证迁移结果:

wsl ~

在 WSL 内确认用户名和文件完整性:

whoami      # 确认不是 root
ls ~        # 确认个人文件都在

确认一切正常后,删除临时 tar 文件释放空间:

del F:\WSL\ubuntu22.tar

✅ 迁移完成!C 盘释放了与原 vhdx 等量的空间,本例释放了约 211 GB


常见问题

Q:迁移后 VSCode Remote WSL 还能用吗?

可以。VSCode 通过发行版名称识别 WSL,只要名称不变,重新连接后一切正常。

Q:迁移后 vhdx 没有缩小怎么办?

WSL 内删除文件后 vhdx 不会自动缩小。可以用以下命令手动压缩(需要管理员 PowerShell):

wsl --shutdown

# 进入 diskpart
diskpart

在 diskpart 中依次执行:

select vdisk file="F:\WSL\Ubuntu22\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

Q:可以同时运行多个不同位置的 WSL 实例吗?

可以。用 --import 时指定不同的名称和目录即可,WSL 支持同时管理多个发行版,位置互不影响。