在老版本 HPC 系统上运行 Antigravity(反重力)
1. 背景
在许多科研机构的 HPC 集群中,系统环境往往比较保守,长期保持在较老版本的 Linux 发行版上。
这种环境对于传统科学计算任务来说通常没有问题,但在使用 现代远程开发工具(例如 Antigravity、Cursor 等)时,可能会遇到兼容性问题。
在尝试使用 Antigravity 连接 HPC 节点时,远端会自动安装并启动一个 remote server 。
然而在老版本系统中,这个 server 在启动时可能会因为系统运行库版本过旧而失败,从而导致远程开发环境无法建立。
本文提供一种解决思路。
2. 问题表现
当 Antigravity 尝试连接服务器时,日志中可能出现类似错误:
vbscript
Error: installation failed.
SSH server closed unexpectedly.
查看更详细日志,可以看到远端 server 启动失败,例如:
bash
~/.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 时失败
需要注意的是:
SSH 本身是成功的,失败发生在 SSH 登录后远端 server 启动阶段。
连接流程实际上类似:
bash
Antigravity
│
▼
SSH 登录 HPC 节点
│
▼
启动 ~/.antigravity-server/bin/<version>/node
│
▼
系统运行库版本过旧
│
▼
server 启动失败
3. 解决思路
解决方案的核心思路是:
不要在宿主机系统上启动 remote server,而是在一个更新的容器环境中启动它。
整体架构如下:
markdown
Antigravity
│
▼
SSH 登录 HPC 节点
│
▼
进入容器环境
│
▼
在容器中启动 remote server
只要 remote server 能在容器中成功启动,后续连接通常就可以复用该 server。
4. 容器运行时选择
在 HPC 环境中,普通用户通常无法直接使用 Docker daemon。
因此更常见的选择是:
Singularity / Apptainer
它们专门为 HPC 场景设计,允许用户在不具备 root 权限的情况下运行容器。
5. 准备容器镜像
通常可以直接从 Docker Hub 获取基础系统镜像,例如 Ubuntu:
bash
singularity pull ubuntu.sif docker://ubuntu:22.04
但在很多 HPC 环境中,计算节点无法直接访问 Docker Hub,这时会出现类似错误:
vbnet
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 被网络策略限制
解决方法
可以在 本地机器下载镜像,然后上传到服务器。
例如在本地执行:
bash
apptainer pull ubuntu.sif docker://ubuntu:22.04
然后上传到服务器,例如:
bash
scp ubuntu.sif user@server:~/container/
最终镜像路径示例:
javascript
~/container/ubuntu.sif
6. 编写容器启动脚本
为了方便进入容器,可以创建一个启动脚本,例如:
javascript
~/container/start_container.sh
示例内容如下:
bash
#!/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
赋予执行权限:
bash
chmod +x ~/container/start_container.sh
脚本的主要作用:
- 初始化
module环境(兼容非交互 shell) - 加载 Singularity
- 启动 Ubuntu 容器
7. 临时修改 shell 启动流程
为了让 Antigravity 第一次启动 remote server 时进入容器,可以 临时修改 .bashrc。
在 .bashrc 中加入:
bash
exec ~/container/start_container.sh
此时 SSH 登录流程变为:
vbscript
SSH 登录
│
▼
.bashrc 执行
│
▼
进入容器
│
▼
Antigravity 在容器中安装 remote server
8. 第一次连接成功后发生的事情
当 Antigravity 第一次成功连接时,它会在远端创建一个目录,例如:
bash
~/.antigravity-server
该目录包含:
vbscript
.antigravity-server/
├── bin/
│ └── <server-version>/
│ ├── node
│ └── server files
remote server 就运行在这里。
9. 一个重要现象
实践中发现:
只要第一次在容器环境中成功构建并启动 remote server,后续连接通常可以复用该 server。
连接流程会变成:
vbscript
Antigravity
│
▼
SSH 登录
│
▼
检测远端 server 已存在
│
▼
直接复用
因此后续连接可能 不再依赖容器环境。
10. 非常重要的一步
一旦第一次连接成功,必须 立即恢复 .bashrc。
也就是说,将之前添加的行注释掉:
bash
# exec ~/container/start_container.sh
否则:
- 所有 SSH 登录都会自动进入容器
- 普通 shell 使用会变得不方便
- 登录终端可能直接变为容器提示符
因此正确流程是:
- 临时修改
.bashrc - 成功连接 Antigravity
- 立刻恢复
.bashrc
11. 最终操作流程总结
完整流程如下:
Step 1
准备容器镜像:
javascript
~/container/ubuntu.sif
如果服务器无法访问 Docker Hub:
- 在本地下载
- 上传到服务器
Step 2
编写容器启动脚本:
javascript
~/container/start_container.sh
Step 3
在 .bashrc 中临时加入:
bash
exec ~/container/start_container.sh
Step 4
使用 Antigravity 连接服务器一次
使其成功安装 remote server:
bash
~/.antigravity-server
Step 5
恢复 .bashrc:
bash
# exec ~/container/start_container.sh
12. 经验总结
这次问题的关键经验包括:
- SSH 本身通常没有问题
- 失败发生在远端 server 启动阶段
- 老版本系统运行库可能无法满足现代开发工具需求
- 容器是绕过旧系统环境的有效方法
- 第一次成功启动 remote server 最关键
- remote server 一旦建立,后续连接通常会复用
13. 常用排查命令
查看 remote server 目录:
bash
ls ~/.antigravity-server
查看 server 进程:
bash
ps -ef | grep antigravity
删除 server(用于重新安装):
bash
rm -rf ~/.antigravity-server
手动测试容器脚本:
bash
~/container/start_container.sh