WSL2 (Manjaro) 环境下 Google Antigravity AI服务网络连接与环境配置问题

背景

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 安装基础依赖

需要安装 gogitmake 以及 base-devel 编译工具链:

Bash 复制代码
sudo pacman -Syu go git make base-devel

1.2 可能需要处理 WSL2 系统更新导致的崩溃 (E_UNEXPECTED)

在执行 pacman -Syu 进行全系统升级时,可能会更新 glibcsystemd 等核心组件。在 WSL2 环境下,这可能导致 Windows 宿主机的 WSL 服务进程与 Linux 子系统状态不一致,抛出 Wsl/Service/E_UNEXPECTED 错误或"灾难性故障",导致无法进入终端。

解决方案:

  1. 强制关闭 WSL 子系统:

    在 Windows PowerShell 中执行:

    PowerShell 复制代码
    wsl --shutdown
  2. 更新 WSL 内核(关键步骤):

    新版的 Linux 核心库可能依赖较新的 WSL 组件,需手动更新:

    PowerShell 复制代码
    wsl --update
  3. 清理旧版 Server 缓存:

    系统恢复后,旧的 VS Code Server 或 Antigravity Server 二进制文件可能与新的 glibc 不兼容,需手动清理:

    Bash 复制代码
    rm -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

主要修改以下两项参数:

  1. http_proxy :指向 Windows 宿主机的代理端口(镜像模式下即为 127.0.0.1)。
  2. 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 替换与脚本注入

进入目标目录后,执行以下操作:

  1. 备份原程序

    Bash 复制代码
    mv language_server_linux_x64 language_server_linux_x64.bak
  2. 创建 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" "$@"
  3. 赋予执行权限

    Bash 复制代码
    chmod +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。

    解决方法:

    Bash 复制代码
    sudo chown -R $(whoami):$(whoami) ~/.gemini ~/.antigravity-server
  • Windows 代理设置:务必确保 Windows 端代理软件(Clash/v2rayN)开启了"允许局域网连接 (Allow LAN)"。检查 WSL2 网络模式为 Mirrored 并配合 代理软件(Clash/v2rayN)不开启虚拟网卡(TUN)模式。


参考

相关推荐
yuhaiqun19893 小时前
Typora 技能进阶:从会写 Markdown 到玩转配置 + 插件高效学习笔记
经验分享·笔记·python·学习·学习方法·ai编程·markdown
方始终_4 小时前
用Spec-kit踩完3个坑后才明白,Constitution才是真正的起点!
ai编程·cursor
喝牛奶的小蜜蜂5 小时前
微信小程序|云环境共享-使用指南
前端·微信小程序·ai编程
用户4099322502126 小时前
Vue3动态样式控制:ref、reactive、watch与computed的应用场景与区别是什么?
后端·ai编程·trae
这儿有一堆花7 小时前
将 AI 深度集成到开发环境:Gemini CLI 实用指南
人工智能·ai·ai编程
磊磊磊磊磊7 小时前
一周做了个文章排版工具,分享下如何高效省钱用AI!
ai编程·产品·cursor
_OP_CHEN7 小时前
用极狐 CodeRider-Kilo 开发俄罗斯方块:AI 辅助编程的沉浸式体验
人工智能·vscode·python·ai编程·ai编程插件·coderider-kilo
岁月宁静8 小时前
软件开发工程师如何借助 AI 工具进行软件自测
前端·ai编程·测试
我家领养了个白胖胖8 小时前
向量化和向量数据库redisstack使用
java·后端·ai编程