1. WSL2 装完 Ubuntu 后,为什么一定要迁移到新盘
WSL2 安装 Ubuntu 这件事本身不复杂,微软商店点一下就能跑起来。真正让人头疼的是后面:默认情况下,Ubuntu 的虚拟磁盘文件ext4.vhdx会落在C:\Users\你的用户名\AppData\Local\Packages\...下面。这个文件会随着你装依赖、拉代码、跑构建不断膨胀,几十 GB 是常态。系统盘一旦被吃满,Windows 更新失败、休眠文件写不进去、各种奇怪的卡顿都会冒出来。
所以这篇要解决的是一个完整链路:在 Windows 上把 WSL2 和 Ubuntu 装好,把发行版整体迁移到非系统盘(比如 D 盘),再用 VS Code 的 Remote-WSL 打通编辑和调试,最后把模型请求的 endpoint 统一指向 TaoToken,让本地开发环境里的 AI 辅助能力也能用同一套 Key 管理。适合谁?适合在 Windows 上做后端、算法、数据工程,又不想被系统盘空间和零散 API Key 折腾的开发者。
迁移这件事的核心逻辑其实很朴素:WSL2 的每个发行版本质上就是一个虚拟磁盘文件,迁移 = 把这个文件从 C 盘搬到 D 盘,然后让 WSL 知道新位置在哪。早期大家用 LxRunOffline 这个第三方工具来做,现在 WSL 官方自带的wsl --export和wsl --import已经能覆盖绝大多数场景,而且更稳。我会把两种方式都讲清楚,你可以按自己的 WSL 版本选。
先确认你的环境。打开 PowerShell(建议用管理员身份,后面有些操作需要权限),执行:
wsl -l -v正常输出类似:
NAME STATE VERSION * Ubuntu-22.04 Running 2这里要盯两个点:VERSION必须是 2,NAME记住,后面导入导出都用它。如果显示 1,先转过来:
wsl --set-version Ubuntu-22.04 2如果wsl -l -v直接报错说没有已安装的发行版,那说明你还没装 Ubuntu,先去微软商店搜 Ubuntu 22.04 LTS 装上,首次启动会让你设用户名和密码,设完再回来。
迁移前有个必须做的动作:彻底关掉 WSL,否则文件被占用,导出会失败或者导出不完整。
wsl --shutdown执行完再wsl -l -v,STATE 应该全是 Stopped。这一步别偷懒,我见过太多人卡在这里,报「文件正在被另一进程使用」。
2. TaoToken 前置准备:统一 Key 与 endpoint 的接入思路
在动手迁移之前,先把模型接入这条线理清楚,因为后面 VS Code 里的配置会用到。本地开发环境里,AI 辅助工具越来越多:有的插件走 OpenAI 兼容接口,有的走 Anthropic 接口,有的自己一套。每个工具单独配 Key、单独记 endpoint,时间一长就是一团乱麻。TaoToken 在这里扮演的角色,是提供一个统一的入口,把 Key 和 endpoint 收敛到一处管理。
你需要先拿到两样东西:一个 API Key,和一个 Base URL。Key 在控制台的 API Keys 页面创建,Base URL 统一是https://taotoken.net/api。注意这个地址后面不带斜杠,也不带/v1,具体路径由各工具自己拼。这一点很关键,很多 401 和 404 就是因为把/v1重复拼了。
创建 Key 的入口在这里:
https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite拿到 Key 之后,先别急着往各种工具里塞。我的习惯是先在终端里用 curl 验证一次,确认 Key 和 endpoint 是通的,再去配编辑器。这样出问题的时候,能快速判断是「Key 本身有问题」还是「某个工具的配置写错了」。
验证命令长这样:
curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer 你的API_KEY" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "只回复两个字:通了"}], "max_tokens": 20 }'如果返回的 JSON 里有choices数组,并且message.content是「通了」,说明链路没问题。如果返回 401,检查 Key 有没有复制全、有没有多余空格;如果返回 404,检查 URL 是不是多拼了/v1或者少了/v1。这个验证动作建议每换一个环境都做一次,成本很低,但能省掉大量排查时间。
关于模型 ID,TaoToken 支持多种模型,具体可用列表在文档里能查到。你在配置工具时填的model字段,要和文档里列出的 ID 完全一致,大小写敏感。我一般会先在模型对话页面手动试一次,确认某个模型 ID 可用,再写进配置文件。
模型对话入口:
https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite接入文档在这里,配置格式、可用模型、常见问题都有:
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite把这两步做完,你手里就有了一个可用的 Key 和一个确认能通的 endpoint。接下来迁移 Ubuntu、配 VS Code,都会围绕这套东西展开。
3. 可复制配置:导出导入迁移 Ubuntu 与 wsl.conf、settings.json 片段
迁移分两条路,我建议优先用官方命令,LxRunOffline 作为备选。
3.1 官方 export/import 方式(推荐)
先关 WSL:
wsl --shutdown然后导出。假设你的发行版叫Ubuntu-22.04,导出到 D 盘一个临时位置:
wsl --export Ubuntu-22.04 D:\wsl-backup\ubuntu2204.tar这个 tar 文件大小和你当前 Ubuntu 占用空间差不多,导出过程可能几分钟,取决于你装了多少东西。导出完成后,注销原来的发行版:
wsl --unregister Ubuntu-22.04注意,unregister会删掉原发行版,所以导出必须成功之后再执行。执行完wsl -l -v里就没有这个发行版了。
接着导入到新位置。先建好目标目录,比如D:\WSL\Ubuntu-22.04:
mkdir D:\WSL\Ubuntu-22.04 wsl --import Ubuntu-22.04 D:\WSL\Ubuntu-22.04 D:\wsl-backup\ubuntu2204.tar --version 2导入完成后启动:
wsl -d Ubuntu-22.04这里有个坑:用--import导入的发行版,默认登录用户是 root,而不是你原来设的用户。想恢复成普通用户,需要在 Ubuntu 里改默认用户。先查你的用户名,然后编辑/etc/wsl.conf:
sudo vi /etc/wsl.conf写入:
[user] default=你的用户名 [boot] systemd=truesystemd=true这一行看需求,如果你要用 systemd 管理的服务(比如 docker、某些数据库),就打开;不需要可以去掉。改完在 PowerShell 里wsl --shutdown再启动,默认用户就生效了。
3.2 LxRunOffline 方式(备选)
如果你用的是比较老的 WSL 版本,或者官方命令报错,可以用 LxRunOffline。先确认 WSL 版本是 2:
wsl -l -v停掉 WSL:
wsl --shutdown查看已安装发行版:
.\LxRunOffline.exe list迁移:
.\LxRunOffline.exe move -n Ubuntu-22.04 -d D:\WSL\Ubuntu-22.04验证新位置:
.\LxRunOffline.exe get-dir -n Ubuntu-22.04如果报「拒绝访问」,给目标目录授权:
icacls D:\WSL\Ubuntu-22.04 /grant "Administrator:(OI)(CI)(F)"然后重启 LxssManager:
net stop LxssManager net start LxssManager3.3 VS Code settings.json 配置片段
迁移完,装 VS Code 的 WSL 扩展(在扩展市场搜 WSL,微软官方那个)。装好后左下角会出现绿色远程连接图标,点它选「Connect to WSL」,就能连进 Ubuntu。
为了让远程开发体验顺一点,在 Ubuntu 里的 VS Code 用户设置(~/.vscode-server/data/Machine/settings.json或者通过命令面板打开 Remote 设置)加上这些:
{ "remote.WSL.fileWatcher.polling": true, "files.watcherExclude": { "**/.git/objects/**": true, "**/node_modules/**": true, "**/dist/**": true, "**/.venv/**": true }, "terminal.integrated.defaultProfile.linux": "bash", "editor.formatOnSave": true, "remote.extensionKind": { "ms-python.python": ["workspace"] } }fileWatcher.polling打开是因为 WSL2 跨文件系统监听有时不灵,轮询虽然费一点 CPU,但能保证热重载不抽风。watcherExclude把大目录排除掉,能明显降低内存占用。
如果你在 VS Code 里用 Continue、Cline 这类插件接模型,它们的配置里通常有 Base URL、API Key、Model 三个字段,填法就是:
{ "baseUrl": "https://taotoken.net/api", "apiKey": "你的API_KEY", "model": "gpt-4o-mini" }Base URL 不要带/v1,插件一般会自己拼。Model ID 用文档里确认过的。
4. 验证请求:从 WSL 内发起调用并确认成功结果
配置写完,必须验证。验证分两层:先确认 WSL 网络能通,再确认模型请求能返回。
先在 Ubuntu 终端里测网络:
curl -I https://taotoken.net/api如果返回 HTTP 状态码(比如 200、401、404 都算通),说明 DNS 和网络没问题。如果卡住或者报Could not resolve host,检查 WSL 的 DNS 配置。WSL2 默认会继承 Windows 的 DNS,但有时会抽风。可以在/etc/wsl.conf里加:
[network] generateResolvConf = true然后wsl --shutdown重启。
网络通了之后,在 WSL 里跑一次完整的模型请求:
curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer 你的API_KEY" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "用一句话说明 WSL2 是什么"}], "max_tokens": 100 }'成功的话,你会看到类似这样的返回:
{ "id": "chatcmpl-xxx", "object": "chat.completion", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "WSL2 是 Windows 上运行 Linux 内核的轻量级虚拟化环境。" }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 18, "completion_tokens": 22, "total_tokens": 40 } }看到choices里有内容,就说明从 WSL 到 TaoToken 的整条链路是通的。这一步过了,再去 VS Code 插件里配,基本不会出问题。
如果你用的是 Claude Code 这类工具,它的配置方式不太一样,通常是通过环境变量或者配置文件指定 endpoint。Claude Code 的接入方式在文档里有专门说明,配置时同样注意 Base URL 和 Key 的填法。Coding Plan 适合长期编码场景,如果你打算把 AI 辅助常态化用在日常开发里,可以了解一下:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite验证通过后,建议把这条 curl 命令存成一个脚本,比如~/check-api.sh,以后换环境或者怀疑 Key 失效时,跑一下就知道。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
迁移和接入过程中,报错基本集中在几个地方。我把真实遇到过的整理出来,对照着查。
401 Unauthorized。最常见的原因是 Key 复制时带了空格或者换行。从网页复制 Key 时,很容易把末尾的换行也带进去。解决方法是把 Key 放进环境变量,用的时候引用变量,避免手打出错:
export TAOTOKEN_KEY="你的API_KEY" curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_KEY" \ ...如果确认 Key 没问题还是 401,检查是不是把 Key 用在了错误的 endpoint 上,或者 Key 被禁用/额度耗尽。
local proxy failed。这个报错通常出现在 VS Code 插件里,意思是插件尝试走本地代理但失败了。原因可能是插件配置里填了http://127.0.0.1:xxxx这样的代理地址,但本地并没有代理在跑。解决方法是把插件配置里的代理项清空,让它直连。如果你确实需要代理,确保代理服务在 WSL 里能访问到(注意 WSL2 访问 Windows 宿主的地址不是 127.0.0.1,而是宿主的 WSL 网关 IP)。
Error reading choices / reading 'choices'。这个报错说明代码在解析返回 JSON 时,找不到choices字段。根因通常是返回的根本不是正常的 completion 响应,而是一个错误对象。比如返回了{"error": {"message": "..."}},代码却按成功响应去读choices,就崩了。排查方法是先把原始返回打印出来看:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TAOTOKEN_KEY" \ -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"hi"}]}' | jq .用jq格式化后,错误信息一目了然。常见触发原因是 model ID 写错、请求体格式不对、或者 max_tokens 超限。
OAuth 相关报错。有些工具(比如某些 CLI)默认走 OAuth 登录流程,而不是 API Key。如果你在配置里填了 API Key 却仍然被要求 OAuth,检查工具是否有「使用 API Key」的选项,或者是否需要设置特定的环境变量来跳过 OAuth。Claude Code 这类工具在接入第三方 endpoint 时,通常需要显式指定 base URL 和 auth token,具体字段名以文档为准。
迁移后默认用户变 root。前面提过,wsl --import后默认用户是 root。除了改/etc/wsl.conf,还要确认你的用户目录还在。如果导入前用户是ubuntu,导入后/home/ubuntu应该还在,只是登录用户变了。改完 wsl.conf 记得wsl --shutdown再进。
VS Code 连不上 WSL。先确认 WSL 扩展装了,再确认wsl -l -v里发行版是 Running 状态。如果 VS Code 一直转圈,试试在命令面板执行「WSL: Reopen in WSL」,或者重启 VS Code。有时候是~/.vscode-server目录权限问题,删掉重连会重新下载。
文件监听不生效。在 WSL2 里改文件,Windows 侧的热重载没反应,或者反过来。这是跨文件系统监听的经典问题。前面 settings.json 里的fileWatcher.polling就是治这个的。如果还不行,把项目放在 WSL 的文件系统里(/home/你的用户名/...),而不是/mnt/c/...,性能会好很多。
排查的核心思路就一条:先确认网络通,再确认 Key 对,再确认请求格式对,最后才怀疑工具配置。按这个顺序,大部分问题五分钟内能定位。
6. 把 Key 和 endpoint 收敛到一处,长期开发更省心
迁移 Ubuntu 到新盘,解决的是空间和性能问题;用 VS Code Remote-WSL,解决的是编辑体验问题;把模型 endpoint 统一到 TaoToken,解决的是 Key 管理和多工具配置分散的问题。这三件事单独看都不复杂,但串起来之后,你的 Windows 开发环境会变得干净很多:系统盘不再被虚拟磁盘吃掉,代码在 Linux 环境里跑,AI 辅助工具共用一套 Key。
我自己的习惯是,每配一个新工具,先跑一遍那条 curl 验证命令,确认 Key 和 endpoint 没问题,再写进配置文件。这样出问题的时候,能立刻分清是工具的问题还是接入的问题。另外,/etc/wsl.conf和 VS Code 的 settings.json 建议纳入版本管理,换机器或者重装的时候直接拉下来用,省得重新踩一遍坑。
如果你还没创建 Key,从这里开始:
https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite配置过程中遇到格式问题,文档里有各工具的完整示例:
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite想先手动试试模型效果,用模型对话页面最直接:
https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite长期在 WSL 里做编码和 Agent 开发的话,Coding Plan 的额度模型更适合日常高频使用:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite最后留一个实用技巧:把常用的 WSL 操作写成 PowerShell 函数,比如wsl-restart一键 shutdown 再启动,wsl-backup一键导出当前发行版。迁移和备份这件事,做得越顺手,你越愿意定期做,环境也就越不容易出问题。