背景
Google Antigravity 是 Google 推出的下一代 Agent-first 集成开发环境(IDE)。其核心智能体服务(Agent Service)后端组件 language_server_linux_x64 采用 Go 语言编写。
在 WSL2 环境下使用 Antigravity 时,可能存在一个典型的网络连接问题:Go 语言编写的静态编译程序通常不遵循系统环境变量(如 HTTP_PROXY)或 Proxychains 的劫持。这导致在开启系统代理的情况下,IDE 的 AI 功能仍然无法连接服务器,出现连接超时或无响应的情况。
本文详细记录了在 WSL2 (Manjaro发行版) 下,利用 graftcp 工具通过 ptrace 机制强制接管 Go 程序网络流量的解决方案,并解决了在此过程中遇到的系统更新崩溃及服务持久化问题。
1. 系统环境准备与修复
在开始配置网络工具前,需要确保 WSL2 环境的基础依赖完整。
1.1 安装基础依赖
需要安装 go、git、make 以及 base-devel 编译工具链:
Bash
sudo pacman -Syu go git make base-devel
1.2 可能需要处理 WSL2 系统更新导致的崩溃 (E_UNEXPECTED)
在执行 pacman -Syu 进行全系统升级时,可能会更新 glibc 和 systemd 等核心组件。在 WSL2 环境下,这可能导致 Windows 宿主机的 WSL 服务进程与 Linux 子系统状态不一致,抛出 Wsl/Service/E_UNEXPECTED 错误或"灾难性故障",导致无法进入终端。
解决方案:
-
强制关闭 WSL 子系统:
在 Windows PowerShell 中执行:
PowerShellwsl --shutdown -
更新 WSL 内核(关键步骤):
新版的 Linux 核心库可能依赖较新的 WSL 组件,需手动更新:
PowerShellwsl --update -
清理旧版 Server 缓存:
系统恢复后,旧的 VS Code Server 或 Antigravity Server 二进制文件可能与新的 glibc 不兼容,需手动清理:
Bashrm -rf ~/.vscode-server # 或 rm -rf ~/.antigravity-server
2. 编译与安装 Graftcp
鉴于常规代理工具失效,我们采用 graftcp。它通过 ptrace 追踪系统调用,能有效处理 Go 程序的 TCP 连接。
2.1 源码编译
Bash
# 回到用户主目录
cd ~
git clone https://github.com/hmgle/graftcp.git
cd graftcp
# 编译
make
2.2 安装至系统
Bash
sudo make install
sudo make install_systemd
sudo systemctl daemon-reload
安装完成后,二进制文件位于 /usr/local/bin/,配置文件位于 /etc/graftcp-local/。
3. 代理服务配置
为了使 WSL2 内的流量正确转发至 Windows 宿主机的代理软件(如 Clash/v2rayN),建议将 WSL2 网络模式设置为 Mirrored (镜像模式) 。
3.1 修改 Graftcp 配置文件
编辑配置文件:
Bash
sudo nano /etc/graftcp-local/graftcp-local.conf
主要修改以下两项参数:
- http_proxy :指向 Windows 宿主机的代理端口(镜像模式下即为
127.0.0.1)。 - select_proxy_mode :强制指定为
only_http_proxy,避免自动探测失败。
配置示例:
Ini,TOML
## graftcp-local configuration
## 监听地址
listen = :2233
## 这里填写 Windows 代理软件的 HTTP 端口 (例如 7897 或 10808)
http_proxy = 127.0.0.1:7897
## 强制使用 HTTP 代理模式
select_proxy_mode = only_http_proxy
3.2 启动并设置开机自启
Antigravity 启动时依赖该后台服务。务必设置为开机自启,否则重启 WSL 后服务将中断导致 Antigravity 会遇到报错: Antigravity server crashed unexpectedly. Please restart to fully restore AI features
Bash
# 启动服务并设置为开机自启
sudo systemctl enable --now graftcp-local
# 验证状态 (应为 active running)
sudo systemctl status graftcp-local
4. 实施 Wrapper 脚本替换
这是解决问题的核心步骤。我们需要找到 Antigravity 的核心二进制文件,将其替换为一个 Wrapper 脚本。该脚本将通过 graftcp 启动原程序,并注入必要的环境变量。
4.1 定位目标文件
Antigravity 更新频繁,且路径包含随机哈希值。使用以下命令定位当前版本的 language_server_linux_x64:
Bash
bash
find ~/.antigravity-server -name "language_server_linux_x64"
# 示例路径输出:
# /home/user/.antigravity-server/bin/[HASH_VALUE]/extensions/antigravity/bin/language_server_linux_x64
4.2 替换与脚本注入
进入目标目录后,执行以下操作:
-
备份原程序:
Bashmv language_server_linux_x64 language_server_linux_x64.bak -
创建 Wrapper 脚本:
新建 language_server_linux_x64 文件,写入以下内容:
Bash#!/bin/bash # Graftcp 安装路径 GRAFTCP_BIN="/usr/local/bin/graftcp" LOG_FILE="/tmp/antigravity_wrapper.log" echo "[$(date)] Wrapper启动. 参数: $@" >> "$LOG_FILE" # 关键环境变量优化 # 1. 强制使用系统 CGO 解析 DNS,避免 Go 原生解析器在代理环境下解析失败 export GODEBUG=netdns=cgo # 2. 强制关闭 HTTP/2,解决 Go HTTP/2 客户端在代理转发时的断流/EOF问题 export GODEBUG=$GODEBUG,http2client=0 # 使用 graftcp 启动原程序 exec "$GRAFTCP_BIN" "$0.bak" "$@" -
赋予执行权限:
Bashchmod +x language_server_linux_x64
4.3 验证
重启 Antigravity IDE。在 WSL 终端中监控日志:
Bash
tail -f /tmp/antigravity_wrapper.log
若出现 "Wrapper启动" 字样且 AI 功能恢复正常,即表示配置成功。
5. 自动化维护脚本
由于 Antigravity 具有自动更新机制,更新后会生成新的哈希目录,导致上述手动修改失效。为此,编写一个自动化脚本来检测并修复新版本。
5.1 编写检测脚本
创建 ~/fix_antigravity.sh:
Bash
#!/bin/bash
TARGET_DIR="$HOME/.antigravity-server"
GRAFTCP_BIN="/usr/local/bin/graftcp"
WRAPPER_MARKER="# WRAPPER_BY_USER"
# 遍历所有 server 目录
find "$TARGET_DIR" -type f -name "language_server_linux_x64" 2>/dev/null | while read -r BIN_PATH; do
# 检查是否已处理
if grep -q "$WRAPPER_MARKER" "$BIN_PATH"; then
continue
fi
echo "[检测到新版本] 正在修复: $BIN_PATH"
# 备份逻辑
if [ ! -f "${BIN_PATH}.bak" ]; then
mv "$BIN_PATH" "${BIN_PATH}.bak"
else
# 若存在 bak 但主文件未被标记,说明发生了覆盖更新
mv "$BIN_PATH" "${BIN_PATH}.bak"
fi
# 写入脚本
cat > "$BIN_PATH" <<EOF
#!/bin/bash
$WRAPPER_MARKER
GRAFTCP_BIN="$GRAFTCP_BIN"
LOG_FILE="/tmp/antigravity_wrapper.log"
echo "[($(date)] Wrapper启动 (自动修复版)..." >> "$LOG_FILE"
export GODEBUG=netdns=cgo,http2client=0
exec "$GRAFTCP_BIN" "$0.bak" "$@"
EOF
chmod +x "$BIN_PATH"
echo "✅ 修复完成!"
done
赋予权限:
Bash
chmod +x ~/fix_antigravity.sh
5.2 集成至 Shell 启动项
为了实现无感修复,将其加入 .zshrc 或 .bashrc,使其在每次打开终端时静默运行:
Bash
# 在 .zshrc 末尾添加
nohup ~/fix_antigravity.sh >/dev/null 2>&1 &
或者也可以使用 Crontab 定时任务(比如每小时检查一次) 如果不常开终端,可以让系统每小时自动检查一次。打开定时任务编辑:
Bash
crontab -e
# 添加一行:
0 * * * * /home/username/fix_antigravity.sh
为了验证脚本好不好用,可以手动运行一次看看:
Bash
~/fix_antigravity.sh
如果它什么都没输出,说明目前所有版本都已经修复好了。如果它输出了 [检测到新版本] 正在修复...,说明它成功捕捉到了漏网之鱼。
6. 其他注意事项
-
权限问题:如果在后续启动 Antigravity 时遇到报错:
Antigravity server crashed unexpectedly. Please restart to fully restore AI features,可能是因为之前使用 sudo 运行过某些命令导致 ~/.gemini 或 ~/.antigravity-server 目录权限归属为 root。解决方法:
Bashsudo chown -R $(whoami):$(whoami) ~/.gemini ~/.antigravity-server -
Windows 代理设置:务必确保 Windows 端代理软件(Clash/v2rayN)开启了"允许局域网连接 (Allow LAN)"。检查 WSL2 网络模式为 Mirrored 并配合 代理软件(Clash/v2rayN)不开启虚拟网卡(TUN)模式。