在老版本 HPC 系统上运行 Antigravity(反重力)

1. 背景

在许多科研机构的 HPC 集群中,系统环境往往比较保守,长期保持在较老版本的 Linux 发行版上。
这种环境对于传统科学计算任务来说通常没有问题,但在使用 现代远程开发工具(例如 Antigravity、Cursor 等)时,可能会遇到兼容性问题。

在尝试使用 Antigravity 连接 HPC 节点时,远端会自动安装并启动一个 remote server
然而在老版本系统中,这个 server 在启动时可能会因为系统运行库版本过旧而失败,从而导致远程开发环境无法建立。

本文提供一种解决思路。


2. 问题表现

当 Antigravity 尝试连接服务器时,日志中可能出现类似错误:

Error: installation failed.
SSH server closed unexpectedly.

查看更详细日志,可以看到远端 server 启动失败,例如:

~/.antigravity-server/bin/<server-version>/node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found
~/.antigravity-server/bin/<server-version>/node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found
~/.antigravity-server/bin/<server-version>/node: /lib64/libc.so.6: version `GLIBC_2.28' not found
Warning: valid glibc version not found. Antigravity only supports remote connections with glibc >= 2.28

从用户角度看,表现为:

  • SSH 登录看似正常
  • 但 Antigravity 无法建立远程开发环境
  • 连接过程在启动远端 server 时失败

需要注意的是:

连接流程实际上类似:

Antigravity
      │
      ▼
SSH 登录 HPC 节点
      │
      ▼
启动 ~/.antigravity-server/bin/<version>/node
      │
      ▼
系统运行库版本过旧
      │
      ▼
server 启动失败

3. 解决思路

解决方案的核心思路是:

不要在宿主机系统上启动 remote server,而是在一个更新的容器环境中启动它。

整体架构如下:

Antigravity
      │
      ▼
SSH 登录 HPC 节点
      │
      ▼
进入容器环境
      │
      ▼
在容器中启动 remote server

只要 remote server 能在容器中成功启动,后续连接通常就可以复用该 server。


4. 容器运行时选择

在 HPC 环境中,普通用户通常无法直接使用 Docker daemon。
因此更常见的选择是:

Singularity / Apptainer

它们专门为 HPC 场景设计,允许用户在不具备 root 权限的情况下运行容器。


5. 准备容器镜像

通常可以直接从 Docker Hub 获取基础系统镜像,例如 Ubuntu:

singularity pull ubuntu.sif docker://ubuntu:22.04

但在很多 HPC 环境中,计算节点无法直接访问 Docker Hub,这时会出现类似错误:

While making image from oci registry: error fetching image to cache:
failed to get checksum for docker://ubuntu:22.04:
error pinging docker registry registry-1.docker.io:
Get "https://registry-1.docker.io/v2/":
read tcp xxxx->xxxx: read: connection reset by peer

这通常说明:

  • 计算节点无法访问公网
  • Docker Hub 被网络策略限制

解决方法

可以在 本地机器下载镜像,然后上传到服务器。

例如在本地执行:

apptainer pull ubuntu.sif docker://ubuntu:22.04

然后上传到服务器,例如:

scp ubuntu.sif user@server:~/container/

最终镜像路径示例:

~/container/ubuntu.sif

6. 编写容器启动脚本

为了方便进入容器,可以创建一个启动脚本,例如:

~/container/start_container.sh

示例内容如下:

#!/bin/bash

# 初始化 module 环境(兼容非交互 shell)
if [ -f /etc/profile.d/modules.sh ]; then
    . /etc/profile.d/modules.sh
elif [ -f /usr/share/Modules/init/bash ]; then
    . /usr/share/Modules/init/bash
fi

# 补充 module 搜索路径(某些 HPC 环境需要)
module use /path/to/modulefiles 2>/dev/null || true

# 加载 Singularity
module load singularity

# 进入容器
exec singularity exec 
    --bind $HOME:$HOME 
    ~/container/ubuntu.sif 
    bash

赋予执行权限:

chmod +x ~/container/start_container.sh

脚本的主要作用:

  1. 初始化 module 环境(兼容非交互 shell)
  2. 加载 Singularity
  3. 启动 Ubuntu 容器

7. 临时修改 shell 启动流程

为了让 Antigravity 第一次启动 remote server 时进入容器,可以 临时修改 .bashrc

.bashrc 中加入:

exec ~/container/start_container.sh

此时 SSH 登录流程变为:

SSH 登录
   │
   ▼
.bashrc 执行
   │
   ▼
进入容器
   │
   ▼
Antigravity 在容器中安装 remote server

8. 第一次连接成功后发生的事情

当 Antigravity 第一次成功连接时,它会在远端创建一个目录,例如:

~/.antigravity-server

该目录包含:

.antigravity-server/
├── bin/
│   └── <server-version>/
│       ├── node
│       └── server files

remote server 就运行在这里。


9. 一个重要现象

实践中发现:

连接流程会变成:

Antigravity
   │
   ▼
SSH 登录
   │
   ▼
检测远端 server 已存在
   │
   ▼
直接复用

因此后续连接可能 不再依赖容器环境


10. 非常重要的一步

一旦第一次连接成功,必须 立即恢复 .bashrc

也就是说,将之前添加的行注释掉:

# exec ~/container/start_container.sh

否则:

  • 所有 SSH 登录都会自动进入容器
  • 普通 shell 使用会变得不方便
  • 登录终端可能直接变为容器提示符

因此正确流程是:

  1. 临时修改 .bashrc
  2. 成功连接 Antigravity
  3. 立刻恢复 .bashrc

11. 最终操作流程总结

完整流程如下:

Step 1

准备容器镜像:

~/container/ubuntu.sif

如果服务器无法访问 Docker Hub:

  • 在本地下载
  • 上传到服务器

Step 2

编写容器启动脚本:

~/container/start_container.sh

Step 3

.bashrc 中临时加入:

exec ~/container/start_container.sh

Step 4

使用 Antigravity 连接服务器一次
使其成功安装 remote server:

~/.antigravity-server

Step 5

恢复 .bashrc

# exec ~/container/start_container.sh

12. 经验总结

这次问题的关键经验包括:

  1. SSH 本身通常没有问题
  2. 失败发生在远端 server 启动阶段
  3. 老版本系统运行库可能无法满足现代开发工具需求
  4. 容器是绕过旧系统环境的有效方法
  5. 第一次成功启动 remote server 最关键
  6. remote server 一旦建立,后续连接通常会复用

13. 常用排查命令

查看 remote server 目录:

ls ~/.antigravity-server

查看 server 进程:

ps -ef | grep antigravity

删除 server(用于重新安装):

rm -rf ~/.antigravity-server

手动测试容器脚本:

~/container/start_container.sh

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:alixiixcom@163.com