WSL迁移出C盘:ext4.vhdx虚拟磁盘的完整导出导入与空间释放指南
2026/9/16 5:47:11 网站建设 项目流程

C盘又红了。相信不少人和我一样,第一反应是去翻C:\Users下的缓存和临时文件,清完了没两天又满了,最后逐一排查才发现,真正的大户是 WSL——尤其是 WSL2,它会慢慢“吞”掉几十甚至上百GB。很多人想直接把 WSL 从 C 盘拖到 D 盘,却卡在“系统提示文件被占用”“不知道哪些文件能移”“迁移完默认用户变成 root”这些细节上。这篇文章就把 WSL 迁出 C 盘的完整流程、背后原理和常见坑一次讲清楚,适合已经装好 WSL、但被 C 盘空间折腾得不行、又不想重装系统的开发者参考。

1. 迁移前先弄清 WSL 的“家底”:它到底把什么放在了 C 盘

想迁移,先得知道 WSL 在 C 盘存了什么东西。很多人以为 WSL 是“装在 Windows 里的一个 Linux 程序”,删了重装就行,但这会丢掉所有 Linux 内部的数据和配置。实际上,WSL 的发行版数据全部打包在一个虚拟磁盘文件里,搞清楚这一点,后续操作就顺理成章了。

1.1 发行版本体:一个不断膨胀的 ext4.vhdx

WSL1 和 WSL2 的存储机制完全不同。WSL1 是系统调用翻译层,文件直接落在 Windows 目录里,散落一地;WSL2 则是跑在一个轻量级虚拟机里,整个 Linux 文件系统被封装成一个ext4.vhdx虚拟磁盘文件。

默认情况下,每个从 Microsoft Store 安装的发行版,都会在 C 盘用户目录下建一个独立的包文件夹,路径大致是:

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

不同发行版对应的包名不一样,Ubuntu 是CanonicalGroupLimited开头,Kali 是KaliLinux,Debian 是TheDebianProject。你不需要记得这些完整路径,直接在 PowerShell 里执行下面这段命令,就能列出所有ext4.vhdx的位置和大小:

Get-ChildItem -Path "C:\Users\$env:USERNAME\AppData\Local\Packages" -Recurse -Filter "ext4.vhdx" -ErrorAction SilentlyContinue | Select-Object FullName, @{N='SizeGB';E={[math]::Round($_.Length / 1GB, 2)}}

你会看到这个文件可能有十几到几十GB。它就是你 Linux 里的/home/etc/usr、所有源码、数据库、conda 环境的全部家当。迁移 WSL 的本质,就是把这个 vhdx 挪到别的盘,并让 Windows 正确识别到它。

1.2 Docker Desktop 的数据也会占 C 盘

如果你的 Docker Desktop 使用的是 WSL2 后端(默认就是),那还要注意:Docker 的镜像、容器、卷数据也存在 WSL 的发行版里,通常对应docker-desktopdocker-desktop-data这两个发行版,它们的 vhdx 路径同样在 C 盘的 Packages 目录下。

所以迁移之前,我建议你先执行wsl -l -v,把所有发行版列出来看看,别只盯着 Ubuntu 一个。很多人迁完了 Ubuntu,发现 C 盘空间只腾出来一半,另一半在 docker-desktop 那边,还得再搞一轮。

wsl -l -v

输出类似:

NAME STATE VERSION * Ubuntu-22.04 Running 2 docker-desktop Stopped 2 docker-desktop-data Stopped 2

如果你的核心痛点是 Docker 镜像太多,那你也得决定,是连 docker-desktop-data 一起迁,还是干脆把不需要的 docker 发行版注销掉。这个问题在迁移前就要想清楚,不要导到一半才发现目标盘空间不够。

1.3 为什么不能直接剪切 ext4.vhdx

很多人会问:那我直接把这个 vhdx 文件剪切到 D 盘,然后在原来的位置建个快捷方式行不行?答案是:系统不一定认你这一套。

WSL 发行版的注册信息保存在 Windows 注册表里,具体位置是:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss

每个发行版对应一个以 GUID 命名的子键,里面记录了发行版名称、版本(1 还是 2)、以及最重要的BasePath——也就是它认为的“发行版数据目录”。当你启动 WSL 时,系统会按注册表里的BasePath去找ext4.vhdx,而不是智能地全盘扫描。

所以单纯剪切文件而不改注册表,启动时大概率会报找不到发行版,或者干脆显示发行版已损坏。而直接改注册表也不是不行,但风险高、容易把环境搞出不可逆的问题。最稳妥、被官方认可的做法,就是用wsl --export导出成备份文件,再通过wsl --import导入到新位置。这套流程对新手来说也是最不容易翻车的。

1.4 迁移前预检:空间、文件系统、备份

动手之前,花两分钟确认三件事:

检查项要求说明
目标盘可用空间≥ 当前 vhdx 实际大小 + 5GB导出 tar 时可能还会占用空间,留足余量
目标盘文件系统NTFS 或 ReFSFAT32 单文件不能超过 4GB,vhdx 动辄几十GB,不行
C 盘临时空间尽量保留与 vhdx 大小相近的空间导出 tar 默认会先写在你指定的路径;如果 C 盘实在不够,就把 tar 直接导出到 D 盘

另外,迁移虽然不会主动破坏数据,但谁也不能保证断电、系统更新、磁盘故障这些意外不会发生。我建议在正式操作前,先用导出命令生成一份完整的 tar 备份,这本身就是迁移流程的第一步,同时也是一份保命备份。导出完成后,如果后续每一步都顺利,这份 tar 还可以作为日常备份留存;如果出了岔子,也可以随时用它在任意盘符恢复,相当于给自己的 Linux 环境上了一道保险。

2. 主线操作:wsl --export 与 wsl --import 的完整迁移链路

到这一步,你只要照着命令敲就能完成迁移。我用一个名为Ubuntu-22.04的发行版作为示例,你自己的发行版名字以wsl -l -v输出为准。需要注意,WSL 命令不区分大小写,但发行版名称是精确匹配的,建议直接复制控制台里的名字。

2.1 第一步:确认当前发行版名字和状态

打开 PowerShell 或 Windows Terminal,先执行:

wsl -l -v

把输出里要迁移的发行版名称记下来。如果名称里有空格(比如Ubuntu-22.04没有,但某些自定义发行版可能有),后面所有命令里都要用双引号包住这个名字。

同时确认这个发行版当前是 Running 还是 Stopped。一般来说,只要你的终端里没开着 WSL 会话,它可能是 Running,也可能因为后台服务(比如 Docker、VS Code Remote-WSL)被唤醒。别急,下一步专门处理它。

2.2 第二步:彻底关闭所有 WSL 会话

很多人的习惯是关掉终端窗口就算完,但 WSL2 的后台进程并不会因为你关窗口就立刻退出。如果你在 Linux 里跑了 node、python 或者 systemd 服务,整个虚拟机会继续保持运行状态。直接在这个状态下操作,轻则导出文件不完整,重则导致 vhdx 文件被锁定。

正确姿势是执行:

wsl --shutdown

然后等两三秒,再执行一次:

wsl -l -v

确保目标发行版状态是Stopped。如果发现还是 Running,可以在任务管理器里看看有没有wslhost.exevmmemWSL进程,或者再执行一次wsl --shutdown。这一步是整条链路的地基,地基没打牢,后面会很难受。

2.3 第三步:导出为 tar 备份

现在可以导出发行版了。在 PowerShell 里执行:

wsl --export "Ubuntu-22.04" "D:\wsl-backup\ubuntu-22.04.tar"

这里我把 tar 直接放到了 D 盘,免得 C 盘空间雪上加霜。注意:D:\wsl-backup这个目录要提前建好,否则命令会报路径不存在。导出时间取决于你的 vhdx 大小和磁盘速度,我迁过一个 30GB 的发行版,大概花了 10 多分钟,过程中控制台没有进度条,看着像卡住,但只要没报错,耐心等就行。

有些较新的 WSL 版本支持追加--vhd参数直接导出为 vhdx 格式镜像,不过 tar 是最通用、最不容易出问题的格式,我建议新手上路就用 tar。导出完成后,可以到对应目录看看文件大小,一般会比 vhdx 略小一些,因为 tar 会对空闲块做一定程度的优化。

2.4 第四步:注销原发行版

确认 tar 文件已经完整生成之后,就进入“不可逆”的环节了。执行:

wsl --unregister "Ubuntu-22.04"

这里我要把丑话说在前面:unregister不是“从列表里拿掉入口”,而是把这个发行版的所有数据全部删除。执行完之后,C 盘那个 ext4.vhdx 文件会被删掉,注册表里对应的条目也会被清除。如果上一步没有成功导出,或者导出文件是坏的,执行这一步等于亲手删库。

只有--export成功、且你确认 tar 文件存在且大小合理之后,才能继续。

注销完成后,可以用wsl -l -v看看列表里已经没有这个发行版了,再检查一下 C 盘空间有没有释放。

2.5 第五步:在新盘符上导入

先创建目标目录:

New-Item -ItemType Directory -Path "D:\WSL\Ubuntu-22.04"

然后执行导入:

wsl --import "Ubuntu-22.04" "D:\WSL\Ubuntu-22.04" "D:\wsl-backup\ubuntu-22.04.tar" --version 2

参数从左到右分别是:发行版名称、导入目标位置、tar 文件路径、WSL 版本。这里明确指定--version 2,确保导入进来还是 WSL2,如果这一步漏了,有些旧版本默认会导入成 WSL1,文件系统行为会变。

导入命令执行完,发行版会自动启动一次,进行文件系统初始化。你可以再用wsl -l -v看看状态,确认已经注册成功,且BasePath指向了 D 盘。

2.6 第六步:修复默认用户

这是整个流程里大家抱怨最多、也最容易忽略的一步。wsl --import导入的发行版,默认登录用户是 root。很多人迁移完一打开终端,发现提示符变成了#,第一反应是“我的用户名哪去了?我的 home 目录怎么怪怪的?”

修复方法有两种。

第一种,在 Linux 内部配置。先用 root 登录,创建或修改/etc/wsl.conf

[user] default=你的用户名

然后回到 Windows,执行:

wsl --shutdown

重新打开 WSL,默认用户就恢复正常了。

第二种,如果你还记得用户名,也可以直接执行发行版自带的配置工具,比如 Ubuntu 系:

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

不同发行版的工具名不一样,而且有些发行版在 import 后这个工具不一定出现在 PATH 里,所以我个人更推荐第一种方法,写进wsl.conf最通用。

注意:wsl.conf里这个[user]小节,只在 WSL2 的较新版本里生效,操作完了一定要wsl --shutdown再重启,否则不会重新读取配置。

3. 导入后恢复现场:默认用户、目录权限与常用工具链

迁移成功的标志不只是“能打开终端”,而是你的开发环境还在、配置还在、工具链还能照样跑。这个章节就是把现场仔细检查一遍,别等用到的时候才发现少了东西。

3.1 逐个确认文件完整性与磁盘挂载

重新进入 WSL 后,先执行几个最基本的命令:

whoami pwd ls -la ~ df -h

whoami用于确认默认用户是否已恢复正常;df -h可以看到根文件系统的容量是否和迁移前一致;ls -la ~则是快速查看 home 目录下的文件有没有丢。我遇到过一次导入后目录在,但 dotfile(比如.bashrc.ssh)权限变成了-rw-r--r--,导致 SSH 直接拒绝加载私钥,提示权限太开放。所以在检查文件的时候,顺手执行一遍:

chmod 700 ~/.ssh chmod 600 ~/.ssh/*

还要检查一下之前的固定挂载点。如果你更改过/etc/fstab或者/etc/wsl.conf里的 automount 配置,导入后这些配置文件是保留的,但如果 Windows 侧路径发生了变化(这次迁移不涉及 Windows 用户目录变化,一般没问题),还是要确认/mnt/c/mnt/d这些挂载是否正常。

3.2 VS Code Remote-WSL 与 Windows Terminal 的适配

迁移前用 VS Code 连过 WSL 的话,迁移后在 VS Code 里执行code .可能会发现它重新弹出一个新窗口,或者提示连接已断开。这是正常现象,因为 WSL 发行版的实例 GUID 变了,VS Code 需要在新的实例上重新安装 server 组件。做法是:在 VS Code 里重新“Connect to WSL”,让它重新选择一个发行版,然后打开一个 WSL 路径下的文件夹,它就会自动在新位置部署 Remote Server。

Windows Terminal 一般不用做额外配置,因为配置文件的启动命令通常是wsl.exe -d Ubuntu-22.04,它按发行版名称查找,不会因为注册表 GUID 变了就失效。但如果你在 Windows Terminal 里自定义过图标、启动目录,最好看一眼。还有个小细节:有些人的 wsl.conf 里设置了[automount] root=...或者默认工作目录的打开方式,迁移后如果之前自定义过cd起始目录,也一并确认下。

3.3 符号链接、环境变量与 systemd 服务

tar 导出导入理论上会保留 Linux 侧的符号链接和软链接(symlink),所以/usr/bin/python指向python3这类链接通常没问题。但如果你曾经在 Windows 侧用编辑器打开过 Linux 里的文件,某些文件可能被自动加上 CRLF 换行,或者权限被 Windows 侧“同化”,导致二进制文件或脚本出现异常。比如.sh脚本突然报bad interpreter,或者git提示file mode changed,多半就是权限位变化。

环境变量不用重配,因为/etc/profile.d~/.bashrc~/.zshrc这些文件都原封不动地在新 vhdx 里。systemd 也一样,如果你之前开启了systemd=true,它会随配置保留,导入后首次启动可能稍微慢一点,属于正常初始化。

3.4 Docker 内部工具链的状态检查

如果你不是在 Docker Desktop 里用 WSL,而是在 WSL 内部自己装了 docker-ce,迁移后要确认 dockerd 能正常启动。很多时候迁移本身不会破坏 Docker 的数据目录(默认在/var/lib/docker),但 daemon 配置里如果写死了某个 overlay 挂载点,可能会因为启动顺序问题短暂失败。最简单的验证方式:

service docker start docker ps

如果 Docker 是 Docker Desktop 管理的,那就要回到第 1.2 节说的:你可能还得处理 docker-desktop-data 发行版,或者至少确认 Docker Desktop 能为新迁移的发行版重新创建后端。

4. 验证与瘦身:确认 C 盘已释放,并解决 VHDX 只增不减的问题

迁移完成了,环境也恢复了,但还没到收工的时候。这一步要做的是:确认 C 盘空间真的回来了,同时解决一个很多人都会遇到的隐性坑——vhdx 文件只增不减。

4.1 迁移成功后的铁证验证

打开“此电脑”,看看 C 盘可用空间是不是比迁移前增加了几十GB。也可以直接在 PowerShell 里对比迁移前后剩余空间:

Get-PSDrive C | Select-Object Used, Free

如果 C 盘空间没有明显增加,不要急着怀疑迁移失败,先把 WSL 彻底关掉,再检查一下注册表里是否还有旧路径的残留条目,或者是否有其他发行版(特别是 docker-desktop-data)还在 C 盘。用 PowerShell 重新跑一遍第 1.1 节的查找 vhdx 命令,看看 C 盘 Packages 目录下还有没有其他ext4.vhdx

另一个容易被忽略的步骤:迁移后不要立刻删掉 D 盘的 tar 备份。我建议先在迁移后的 WSL 里正常用一两天,跑几个项目,确认数据完整、服务正常,再把 tar 删掉,或者把它转移到一个移动硬盘里长期保存。它就是你整个 Linux 环境的“系统镜像”,留着没坏处。

4.2 VHDX“只长不缩”的真相与压缩操作

问一个很多人的共同困惑:为什么我在 Linux 里删了几十个GB的文件,Windows 的磁盘剩余空间一点都没变?这其实不是 WSL 设计的缺陷,而是虚拟磁盘的特性在作怪。

ext4.vhdx是一个动态扩展的虚拟磁盘,它在 Windows 侧显示的大小是“已经实际占用的物理文件大小”,而不是文件系统内部所有块的总和。当你在 Linux 里删文件时,ext4 文件系统会把这些块标记为空闲,重新分配,但不会主动告诉 Windows“这些块我可以还给磁盘”。所以 vhdx 的物理文件大小只增不减,删文件只会让 Linux 内部多出可用空间,不会让 Windows 侧多出可用空间。

最简单的解决办法是开启稀疏文件支持,前提是 WSL 版本足够新。新版 WSL(0.67 及以上)支持:

wsl --manage "Ubuntu-22.04" --set-sparse true

这个命令会把 vhdx 标记为稀疏文件,之后删除文件时,空间会自动归还给 Windows。如果你的版本支持,建议迁移完顺手开一下。

如果版本不支持,或者开启稀疏后还是觉得空间占用太大,可以手动压缩 vhdx。先wsl --shutdown,然后以管理员身份打开 diskpart:

diskpart

在 diskpart 交互界面里依次执行:

select vdisk file="D:\WSL\Ubuntu-22.04\ext4.vhdx" attach vdisk readonly compact vdisk detach vdisk exit

整个过程和压缩 Hyper-V 虚拟磁盘的思路完全一样,原理是让 vhdx 内部的空闲块以零填充后被物理文件收缩机制释放。压缩时间取决于磁盘大小和碎片程度,几十GB的盘可能需要几分钟。压缩完回到 Windows,重新打开 WSL,一切如常。

4.3 给迁移后的环境做空间规划

迁移完成后,最好在目标盘建立清晰的目录结构,不要随手把 vhdx 扔在盘符根目录。我自己习惯这样做:

D:\WSL\ Ubuntu-22.04\ ext4.vhdx docker-desktop-data\ ext4.vhdx D:\wsl-backup\ ubuntu-22.04-2025-06-01.tar

目录分两块:一块放真实运行数据,一块放备份 tar。每次大版本升级或者重要项目变更前,导出一次 tar,命名时带上日期。这样即使后续 D 盘也出问题,你还留着可以从头恢复的种子。

如果 D 盘本身空间也不宽裕,建议用wsl --manage <发行版> --set-sparse true开启稀疏后,再定期做一次压缩巡检。这个习惯能避免 WSL 的虚拟磁盘像气球一样越吹越大。

5. 替代路线与更多方案:直接装到新盘、目录迁移、第三方工具怎么选

主线流程适合已经装好 WSL 的用户。但如果你的 WSL 还没装,或者你在纠结要不要用工具辅助,这里聊几条替代路线和它们各自的使用场景。

5.1 新装系统的“一步到位”做法

如果你还没安装 WSL,或者准备在另一台电脑上从零搭建环境,完全不用再走“先装 C 盘再迁移”的弯路。较新版本的 WSL 已经支持在安装时就指定安装目录,类似这样:

wsl --install Ubuntu-22.04 --location D:\WSL\Ubuntu-22.04

如果你的 WSL 版本支持--location参数,安装过程会直接把这个发行版的数据目录放到 D 盘,省去后续导出导入的折腾。实测下来,不同版本对--location的兼容程度不完全一致,建议先执行wsl --version确认版本,如果不支持,就按第二节的流程安装完再迁,效果一模一样。

还有一个点:通过 Store 安装的发行版更新机制,和通过wsl --import导入的发行版不一样。Store 版本可以随 Windows 更新一起更新,而 import 进来的发行版本质上是“手动注册的 tar 恢复体”,不会通过 Store 更新。如果你很在意这一点,迁移后就需要自己定期执行发行版内部的系统更新(比如sudo apt update && sudo apt upgrade),对日常使用没什么影响,但知道这个机制,免得日后疑惑“为什么我的 Ubuntu 没有收到应用商店更新”。

5.2 目录联接方案:mklink /J 的适用场景和风险

还有一个网传方案是:把ext4.vhdx剪切到 D 盘,再在原来的 C 盘路径上用管理员权限执行:

mklink /J "C:\Users\<你>\AppData\Local\Packages\Canonical...\LocalState" "D:\WSL\Ubuntu-22.04"

这样,注册表里的路径不用改,系统访问 C 盘原路径时,会自动跳到 D 盘的真实目录。这个方案的优点是速度快、不用导出导入,几十GB的 vhdx 几秒钟就能“搬家”。

但我不太推荐这个方法作为长期方案,原因是它太依赖 Windows 的目录联接稳定性了。一旦 Windows 大版本更新、WSL 包更新或系统还原,都有可能把这个联接目录重置;而且如果你不熟悉mklink /J和快捷方式的区别,以后清理 C 盘时很容易误删。所以我的结论是:这个方法适合应急,比如 C 盘只剩几个GB、连导出空间都不够的紧急情况;正常情况下,多花半小时走 export/import 是更稳妥的选择。

这里额外提一个操作技巧:如果你迁移前 C 盘空间已经告急到连导出 tar 的位置都挤不出来,可以在 D 盘先建好备份目录,直接把 tar 导出到 D 盘。这样整个过程不依赖 C 盘剩余空间,只是导出时源 vhdx 读取速度会受一些影响,无伤大雅。

5.3 第三方工具如 move-wsl、LxssManager 怎么选

网上有一些专门做 WSL 迁移的小工具,比如move-wsl,原理无非两种:要么帮你封装 export/import 流程,要么帮你改注册表配合文件移动。用是能用,但我个人对这类工具的态度是:可以了解,不必依赖。

原因有三:第一,官方wsl --export/wsl --import已经覆盖了绝大多数迁移场景,没必要为“少敲几条命令”引入一个可能有兼容性问题的第三方程序;第二,这类工具多数是个人维护,对新版 WSL、新发行版的支持不一定及时,万一在导出解析环节出了 bug,你的数据就悬了;第三,排查故障时,如果用官方命令出了问题,社区里有大量现成的解决方案可以参考,而第三方工具的报错往往只能去它的开源仓库里翻 issue。

如果你真的想用工具可视化迁移,我建议也先手动做一次 tar 导出备份,把保命底线握在自己手里,然后再用工具去尝试。数据安全永远优先于操作效率。

6. 我踩过的坑和排查思路:迁移失败时的完整复盘

最后把我也遇到过并帮朋友处理过的几个高频问题拎出来,按“问题表现 -> 排查链路 -> 解决方案”的方式复盘一遍。如果你想一次迁移成功,这一章值得重点看。

6.1 导出时报“文件名、目录名或卷标语法不正确”

这个错误是新手最容易碰到的,绝大多数时候不是你的 vhdx 坏了,而是发行版名称输入有误。比如实际名称是Ubuntu-22.04,你随手敲成了Ubuntu;或者名字里带空格,你没加引号,PowerShell 把参数切成了两段。

排查链路:

  1. 执行wsl -l -q,让它只输出纯发行版名称,避免显示里的*默认这些干扰信息。
  2. 把输出的名字原样复制到命令里,不要手打。
  3. 如果名称里确实有特殊字符,用双引号把整个名称包起来。

另外有一种情况:某些从企业镜像或离线包安装的发行版,名称中间可能带点、带下划线,比如Ubuntu-20.04-Custom。这种名字最容易在复制时漏掉后半段,建议先在记事本里粘好命令再执行。

6.2 注销前没确认导出文件完整性,等于直接删库

我见过一位朋友的惨痛经历:他执行wsl --export后看到控制台有条报错,但因为报错夹杂在大量输出里没注意,就直接接着跑wsl --unregister,结果旧数据被删除,导出的 tar 还是不完整的,整个环境的项目文件全没了。最终只能从 Git 远程仓库拉代码、用手头备份慢慢重建。

那怎么判断导出成功?最简单的方法是看 tar 文件大小。一个正常的 WSL2 发行版,不管里面实际用了多少空间,导出的 tar 一般至少有几GB。如果导出来的文件只有几十MB,大概率是不完整的。另外,Linux 工程师常用的校验做法也很简单,在 PowerShell 里计算哈希值:

Get-FileHash "D:\wsl-backup\ubuntu-22.04.tar" -Algorithm SHA256

导出完成后记录下这个哈希值,导入成功后可以重新计算一次,两者一致,基本可以确认文件传输完整。注意:如果你只在同一台机器上导出又导入,哈希值不会因为文件移动而改变,所以比对是有效的。

6.3 导入后启动报错 0x80070050、0x80370102、0x80070003

这几个常见错误码,对应的根因和解决思路差别很大。

0x80070050通常表示“文件已存在”,常见于导入目标目录里已经有一个旧的ext4.vhdx。比如你之前在 D 盘手动建了同名目录,里面可能残留了历史文件。处理方式:确认里面没有重要数据后,把目录清空,或者换一个新的目录导入。

0x80370102一般是虚拟化功能异常。迁移这个动作本身不会触发它,但如果你安装 WSL2 后操作系统更新过、或者 BIOS 里虚拟化设置被动过,导入时新建虚拟机就有可能会失败。排查时先去“启用或关闭 Windows 功能”里确认“适用于 Linux 的 Windows 子系统”和“虚拟机平台”都勾选了,再检查 BIOS 里 Intel VT-x / AMD SVM 是否开启。

0x80070003多半是路径不存在或者没有权限。比如导入目标D:\WSL\Ubuntu-22.04没建目录,或者这个目录在 OneDrive、网络驱动器这类特殊位置。WSL 的发行版数据一定要放在本地物理磁盘目录,不要放到云同步目录或网络盘上,否则虚拟机文件锁和同步服务会打架,导致各种奇怪问题。

6.4 迁移后 VS Code、资源管理器访问 \wsl$ 旧路径失效

迁移完成后,文件资源管理器地址栏里以前保存的\\wsl$\Ubuntu-22.04\home\用户这类路径,可能会提示找不到网络路径。这是因为 WSL 发行版重新注册后,实例 ID 已经变化,旧的 WSL 网络共享句柄失效了。

解决办法是删除资源管理器里旧的地址历史,重新输入:

\\wsl.localhost\Ubuntu-22.04

或者\\wsl$\Ubuntu-22.04。输入后回车,WSL 会自动映射到新的实例。如果还是不行,先执行wsl --shutdown,等几秒再重新打开资源管理器访问。

同样的逻辑也适用于 VS Code 的“Remote Explorer”。在 VS Code 左侧远程资源管理器里,如果还残留旧的 WSL target,直接刷新列表,或者点击齿轮重新选择发行版即可。这个操作不影响你 Linux 里的任何文件,只是客户端需要重新建立与 WSL 实例之间的通信通道。

6.5 迁移后想回滚,怎么安全退回 C 盘

有朋友会问:如果迁移完发现 D 盘性能不如 C 盘,或者公司换机要求保持原样,还能不能退回 C 盘?当然可以,而且你已经掌握方法了。回滚本质上就是把 export/import 流程反向跑一遍。

假设你想让Ubuntu-22.04回到 C 盘默认位置,先执行:

wsl --shutdown wsl --unregister "Ubuntu-22.04"

然后重新创建一个 C 盘指定目录并导入:

New-Item -ItemType Directory -Path "$env:LOCALAPPDATA\Packages\CustomUbuntuMigration" wsl --import "Ubuntu-22.04" "$env:LOCALAPPDATA\Packages\CustomUbuntuMigration" "D:\wsl-backup\ubuntu-22.04.tar" --version 2

导入完成后别忘了再走一遍第 2.6 节的默认用户修复流程。回滚操作本身并没什么魔法,本质上还是“导出备份 -> 注销 -> 导入新路径”这三板斧。

经过这么多次 WSL 迁移和备份实践,我现在已经养成了一个习惯:每次给 WSL 里的项目做完重大环境变更,就顺手导出一份 tar 到 D 盘备份目录。因为迁移这件事最妙的地方在于,它逼着你完成了一次完整的“系统备份 + 恢复演练”——哪怕以后 C 盘、D 盘都出问题,只要这份 tar 在,换台电脑、重新装好 WSL,一条导入命令就能把整个开发环境原地复活。从这个角度看,迁移 WSL 不只是给 C 盘腾空间,更是给你自己的数据多上了一道保险。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询