WSL 发行版迁移与目录统一管理指南

适用场景:将散落在不同路径(如 C 盘默认目录、D 盘根目录)的 WSL 发行版统一迁移到指定父目录下的独立子目录中,便于备份、管理和空间监控。


一、前置检查

1.1 查看当前所有发行版状态

wsl --list --verbose

预期输出示例:

  NAME                    STATE           VERSION
  docker-desktop          Stopped         2
  {Distro-Name-A}         Running         2
* {Distro-Name-B}         Stopped         2

注意:如果目标发行版状态为 Running,必须先停止后再操作。

1.2 查看实际存储路径

Get-ChildItem "HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss" `
  | Get-ItemProperty `
  | Select-Object DistributionName, BasePath

预期输出示例:

DistributionName     BasePath
----------------     --------
docker-desktop       \\?\C:\Users\{UserName}\AppData\Local\Docker\wsl\main
{Distro-Name-A}      D:\
{Distro-Name-B}      D:\WSL\{Distro-Name-B}

说明:{Distro-Name-A} 的文件直接散落在 D:\ 根目录,需要迁移到子目录中统一管理。


二、迁移步骤

2.1 停止目标发行版

wsl -t {Distro-Name-A}

2.2 导出为 tar 备份

wsl --export {Distro-Name-A} D:\{Distro-Name-A}-backup.tar

参数说明

  • {Distro-Name-A}:要迁移的发行版名称
  • D:\{Distro-Name-A}-backup.tar:备份文件存放路径,建议放在非目标目录的临时位置

2.3 注销旧实例(⚠️ 危险操作)

wsl --unregister {Distro-Name-A}

警告:此操作会永久删除该发行版的原始虚拟磁盘(ext4.vhdx)和注册表信息。务必确认 2.2 导出成功 且备份文件存在后再执行。

2.4 创建统一管理的子目录并重新导入

# 创建目标子目录
mkdir D:\WSL\{Distro-Name-A}

# 导入到新位置
wsl --import {Distro-Name-A} D:\WSL\{Distro-Name-A} D:\{Distro-Name-A}-backup.tar --version 2

参数说明

  • --version 2:强制使用 WSL 2 后端(推荐)
  • D:\WSL\{Distro-Name-A}:新的统一父目录下的子目录

2.5 验证迁移结果

# 查看发行版列表
wsl --list --verbose

# 查看存储路径是否已变更
Get-ChildItem "HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss" `
  | Get-ItemProperty `
  | Select-Object DistributionName, BasePath

预期输出:

DistributionName     BasePath
----------------     --------
docker-desktop       \\?\C:\Users\{UserName}\AppData\Local\Docker\wsl\main
{Distro-Name-A}      D:\WSL\{Distro-Name-A}
{Distro-Name-B}      D:\WSL\{Distro-Name-B}

2.6 清理临时备份文件

确认发行版能正常启动且数据完整后,删除备份:

Remove-Item D:\{Distro-Name-A}-backup.tar

三、迁移后的目录结构

D:\WSL\
├── {Distro-Name-A}\
│   └── ext4.vhdx
├── {Distro-Name-B}\
│   ├── ext4.vhdx
│   └── ...
└── (其他发行版)

所有发行版均位于 D:\WSL\ 下的独立子目录中,物理磁盘文件(ext4.vhdx)互不干扰,便于单独备份、压缩或迁移。


四、可选:恢复默认登录用户

通过 wsl --import 导入的发行版默认以 root 身份登录。若之前设置了普通用户,需重新指定:

{Distro-Name-A} config --default-user {UserName}

验证:

wsl -d {Distro-Name-A}
whoami
# 预期输出:{UserName}

五、重要注意事项

5.1 不建议迁移 docker-desktop

发行版 是否建议迁移 原因
自定义发行版(如 Ubuntu、Debian) ✅ 可以 通过 wsl --export/import 完全可控
docker-desktop ❌ 不建议 由 Docker Desktop 管理,迁移后可能导致容器、镜像丢失,或 Docker Desktop 无法识别路径

docker-desktop 占用 C 盘空间过大,应在 Docker Desktop 设置 → Resources → WSL Integration 中调整磁盘位置,而非手动 wsl --import

5.2 磁盘空间预留

  • 导出前确保目标盘有 发行版当前占用空间 × 2 的剩余空间(一份原文件 + 一份 tar 备份)
  • 导入完成后,WSL 会自动将 ext4.vhdx 精简为实际使用大小,但备份期间需要双倍空间

5.3 备份文件完整性

导出后建议校验文件大小,避免导出失败:

Get-Item D:\{Distro-Name-A}-backup.tar | Select-Object Length

正常应为 数百 MB 到数十 GB(视发行版数据量而定)。若只有几百字节,说明导出失败,需检查网络或磁盘权限。


六、快速命令速查表

目的 命令
停止发行版 wsl -t {Distro-Name}
导出备份 wsl --export {Distro-Name} D:\backup.tar
注销旧实例 wsl --unregister {Distro-Name}
导入到新目录 wsl --import {Distro-Name} D:\WSL\{Distro-Name} D:\backup.tar --version 2
设置默认用户 {Distro-Name} config --default-user {UserName}
查看存储路径 Get-ChildItem "HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Get-ItemProperty | Select-Object DistributionName, BasePath`

七、常见问题

Q1:迁移后启动报错 Error: 0x80040326

原因ext4.vhdx 文件损坏或导出不完整。
解决:重新执行导出 → 注销 → 导入流程,确保导出过程中发行版处于 Stopped 状态。

Q2:迁移后找不到之前安装的软件或数据

原因wsl --export 导出的是完整文件系统,数据不会丢失。若缺失,可能是导入了错误的 tar 包。
解决:检查 wsl --list 中是否存在同名旧实例,或从备份 tar 重新导入。

Q3:能否直接剪切 ext4.vhdx 到新目录?

不推荐。WSL 通过注册表记录 BasePath,直接剪切文件会导致注册表路径与实际文件位置不一致,启动时报错。必须通过 wsl --export/import 流程操作。

posted @ 2026-06-09 09:27  RK5123153  阅读(10)  评论(0)    收藏  举报