【日常开发】 VSCode Remote SSH 在 Ubuntu 18.04 (GLIBC 2.27) 上的解决方案

VSCode Remote SSH 在 Ubuntu 18.04 GLIBC 2.27上的解决方案

    • 背景
    • 解决思路
    • 第一步:检查编译依赖
    • [第二步:非 root 编译安装 GLIBC 2.28](#第二步:非 root 编译安装 GLIBC 2.28)
    • [第三步:安装 patchelf](#第三步:安装 patchelf)
    • [第四步:准备 libstdc++ 和 libgcc](#第四步:准备 libstdc++ 和 libgcc)
    • [第五步:patch VSCode node 二进制](#第五步:patch VSCode node 二进制)
    • [第六步:跳过 VSCode GLIBC 版本预检查](#第六步:跳过 VSCode GLIBC 版本预检查)
    • 第七步:持久化配置
    • 遇到的问题与解决
      • [问题 1:configure 报错 GLIBC cannot be compiled without optimization](#问题 1:configure 报错 GLIBC cannot be compiled without optimization)
      • [问题 2:make install 没有写入权限](#问题 2:make install 没有写入权限)
      • [问题 3:patchelf 后 node 报错缺少 libstdc++](#问题 3:patchelf 后 node 报错缺少 libstdc++)
    • [问题 4:patchelf 后 node 报错缺少 libgcc_s](#问题 4:patchelf 后 node 报错缺少 libgcc_s)
      • [问题 5:VSCode 连接直接报错不给 patch 机会](#问题 5:VSCode 连接直接报错不给 patch 机会)
      • [问题 6:VSCode 反复下载覆盖 node](#问题 6:VSCode 反复下载覆盖 node)
      • [问题 7:用 ld 运行静态链接的 CLI 导致 Segfault](#问题 7:用 ld 运行静态链接的 CLI 导致 Segfault)
    • 最终自动化脚本
    • 原理总结
    • 参考

背景

VSCode 1.121.0+ 要求远程服务器 GLIBC >= 2.28,而 Ubuntu 18.04 自带 GLIBC 2.27,导致无法连接。在AI 的加持了 方案验证通过,记录下遇到的问题。

系统环境:

  • OS: Ubuntu 18.04
  • GLIBC: 2.27
  • 用户: 非 root
  • VSCode: 1.121.0 (commit f6cfa2ea)

解决思路

问题:VSCode Server 需要 GLIBC 2.28,系统只有 2.27

方案:

  1. 非 root 用户本地编译安装 GLIBC 2.28
  2. 用 patchelf 修改 VSCode node 二进制的动态链接器路径
  3. 创建 /tmp/vscode-skip-server-requirements-check 跳过版本预检查

第一步:检查编译依赖

复制代码
gcc --version
make --version

第二步:非 root 编译安装 GLIBC 2.28

下载源码

复制代码
cd /tmp
wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz
tar -xf glibc-2.28.tar.gz

编译安装到用户目录

复制代码
mkdir /tmp/glibc-build
cd /tmp/glibc-build

/tmp/glibc-2.28/configure \
    --prefix=/home/$USER/opt/glibc-2.28 \
    --disable-werror

make -j$(nproc)
make install

验证安装

复制代码
ls ~/opt/glibc-2.28/lib/
# 应该看到 libc.so.6, ld-linux-x86-64.so.2 等
~/opt/glibc-2.28/lib/libc.so.6 --version
# 应该输出 GNU C Library 2.28

第三步:安装 patchelf

复制代码
# 下载预编译版本
mkdir -p /tmp/bin
wget -O /tmp/bin/patchelf \
    https://github.com/NixOS/patchelf/releases/download/0.18.0/patchelf-0.18.0-x86_64.tar.gz

# 如果下载的是 tar.gz
cd /tmp
wget https://github.com/NixOS/patchelf/releases/download/0.18.0/patchelf-0.18.0-x86_64.tar.gz
tar -xf patchelf-0.18.0-x86_64.tar.gz
cp bin/patchelf /tmp/bin/patchelf
chmod +x /tmp/bin/patchelf

# 验证
patchelf --version

第四步:准备 libstdc++ 和 libgcc

VSCode node 还依赖 libstdc++ 和 libgcc_s,需要复制到 glibc-2.28/lib:

c 复制代码
# 复制 libstdc++
cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25 ~/opt/glibc-2.28/lib/
ln -sf ~/opt/glibc-2.28/lib/libstdc++.so.6.0.25 \
       ~/opt/glibc-2.28/lib/libstdc++.so.6

# 复制 libgcc_s
cp /lib/x86_64-linux-gnu/libgcc_s.so.1 ~/opt/glibc-2.28/lib/

# 验证
ls -la ~/opt/glibc-2.28/lib/ | grep -E "stdc|gcc"

第五步:patch VSCode node 二进制

c 复制代码
# VSCode 下载 server 后 patch node
COMMIT="f6cfa2ea2403534de03f069bdf160d06451ed282"
NODE_PATH=~/.vscode-server/cli/servers/Stable-${COMMIT}/server/node

patchelf \
  --set-rpath ~/opt/glibc-2.28/lib \
  --set-interpreter ~/opt/glibc-2.28/lib/ld-linux-x86-64.so.2 \
  ${NODE_PATH}

# 验证
${NODE_PATH} -v

第六步:跳过 VSCode GLIBC 版本预检查

VSCode CLI 在启动 server 前会检查系统 GLIBC 版本,通过创建特定文件跳过:

c 复制代码
touch /tmp/vscode-skip-server-requirements-check

原理: 在 VSCode CLI 二进制的字符串中发现这个路径,说明官方预留了跳过检查的机制。

第七步:持久化配置

c 复制代码
cat >> ~/.bashrc << 'EOF'

# VSCode Remote SSH GLIBC 修复
touch /tmp/vscode-skip-server-requirements-check
find ~/.vscode-server/cli/servers/ -name "node" | while read f; do
    patchelf \
      --set-rpath ~/opt/glibc-2.28/lib \
      --set-interpreter ~/opt/glibc-2.28/lib/ld-linux-x86-64.so.2 \
      "$f" 2>/dev/null
done
EOF


遇到的问题与解决

问题 1:configure 报错 GLIBC cannot be compiled without optimization

原因: 在源码目录内执行了 configure

解决: 必须在单独的 build 目录执行

c 复制代码
# 错误做法
cd /tmp/glibc-2.28
./configure  # ❌

# 正确做法
mkdir /tmp/glibc-build
cd /tmp/glibc-build
/tmp/glibc-2.28/configure  # ✅

问题 2:make install 没有写入权限

原因:非 root 用户无法写入系统目录

解决:--prefix=/home/$USER/opt/glibc-2.28 安装到用户目录

c 复制代码
/tmp/glibc-2.28/configure \
    --prefix=/home/$USER/opt/glibc-2.28 \  # ✅ 用户目录
    --disable-werror

问题 3:patchelf 后 node 报错缺少 libstdc++

错误:error while loading shared libraries: libstdc++.so.6: No such file or directory

原因: patchelf 修改了 rpath 后只从 ~/opt/glibc-2.28/lib 加载库,但该目录没有 libstdc++

解决:

复制代码
# 查找系统的 libstdc++
ls -la /usr/lib/x86_64-linux-gnu/libstdc++*
# lrwxrwxrwx libstdc++.so.6 -> libstdc++.so.6.0.25
# -rw-r--r-- libstdc++.so.6.0.25

# 复制实体文件 + 创建符号链接
cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25 ~/opt/glibc-2.28/lib/
ln -sf ~/opt/glibc-2.28/lib/libstdc++.so.6.0.25 \
       ~/opt/glibc-2.28/lib/libstdc++.so.6

问题 4:patchelf 后 node 报错缺少 libgcc_s

错误:error while loading shared libraries: libgcc_s.so.1: No such file or directory

解决:cp /lib/x86_64-linux-gnu/libgcc_s.so.1 ~/opt/glibc-2.28/lib/

问题 5:VSCode 连接直接报错不给 patch 机会

c 复制代码
error This machine does not meet prerequisites
- find GLIBC >= v2.28.0 (but found v2.27.0 instead)
exitCode==207==

原因: VSCode CLI 在启动 server 前做了 GLIBC 版本预检查,直接拒绝,node 根本没有被执行

解决: 通过分析 CLI 二进制字符串找到官方跳过机制

c 复制代码
# 分析 CLI 二进制,发现关键字符串
strings ~/.vscode-server/code-f6cfa2ea... | grep -i "skip"
# 输出:/tmp/vscode-skip-server-requirements-check

# 创建该文件即可跳过检查
touch /tmp/vscode-skip-server-requirements-check

问题 6:VSCode 反复下载覆盖 node

原因: node 启动失败后,VSCode 认为安装损坏,删除 servers 目录重新下载,形成死循环

解决: 两步并行

先创建 skip 文件让 VSCode 跳过预检查

下载完成后立即 patch node

c 复制代码
# 监控脚本(另开终端)
while true; do
  find ~/.vscode-server/cli/servers/ -name "node" | while read f; do
    patchelf \
      --set-rpath ~/opt/glibc-2.28/lib \
      --set-interpreter ~/opt/glibc-2.28/lib/ld-linux-x86-64.so.2 \
      "$f" 2>/dev/null && echo "patched: $f"
  done
  sleep 1
done

问题 7:用 ld 运行静态链接的 CLI 导致 Segfault

c 复制代码
# 错误尝试
~/opt/glibc-2.28/lib/ld-linux-x86-64.so.2 \
  ~/.vscode-server/code-f6cfa2ea... # Segmentation fault

原因: VSCode CLI 是静态链接的,自带运行时,用外部 ld 加载会冲突

c 复制代码
ldd ~/.vscode-server/code-f6cfa2ea...
# statically linked  ← 静态链接,不需要 patch

最终自动化脚本

c 复制代码
cat > ~/fix-vscode.sh << 'EOF'
#!/bin/bash
# VSCode Remote SSH GLIBC 修复脚本
# 适用于 Ubuntu 18.04 (GLIBC 2.27)

GLIBC_LIB=~/opt/glibc-2.28/lib

# 1. 跳过 VSCode GLIBC 预检查
touch /tmp/vscode-skip-server-requirements-check
echo "✓ 已创建 skip 文件"

# 2. patch 所有 VSCode server node
find ~/.vscode-server/cli/servers/ -name "node" | while read f; do
    patchelf \
      --set-rpath $GLIBC_LIB \
      --set-interpreter $GLIBC_LIB/ld-linux-x86-64.so.2 \
      "$f" 2>/dev/null && echo "✓ patched: $f"
done

echo "完成!"
EOF

chmod +x ~/fix-vscode.sh

# 加入 .bashrc 开机自动执行
echo 'bash ~/fix-vscode.sh' >> ~/.bashrc

原理总结

c 复制代码
VSCode 连接流程(修复后):

Windows VSCode
    │
    ▼ SSH 连接
远程服务器
    │
    ▼ 运行 ~/.vscode-server/code-xxx(静态链接,不受 GLIBC 限制)
    │
    ▼ 检查 /tmp/vscode-skip-server-requirements-check ← 文件存在,跳过检查
    │
    ▼ 下载并解压 vscode-server-linux-x64.tar.gz
    │
    ▼ 运行 server/node(已被 patchelf 修改为使用 ~/opt/glibc-2.28)
    │
    ▼ 连接成功 ✅

参考

相关推荐
相思难忘成疾5 小时前
Ubuntu 入门:安装、网络、软件一站式教程
linux·网络·ubuntu
培风图楠7 小时前
vscode初始配置环境后无法编译
ide·vscode·编辑器
Kay_Liang8 小时前
VirtualBox NAT 网络实现三台虚拟机互联踩坑实录
网络·windows·笔记·ubuntu·网络安全
相思难忘成疾9 小时前
Linux 网络服务综合实战:双机搭建 NFS+DNS+LNMP 博客平台
linux·运维·服务器·ssh·rhce
晨晖29 小时前
项目上传到gitee的两种方式,ssh和https
https·gitee·ssh
bestlanzi10 小时前
使用vscode 搭建Java 开发环境
ide·vscode·编辑器
大唐游子10 小时前
wsl安装高版本ubuntu(24.04)
linux·ubuntu
2501_920047031 天前
openclaw在ubuntu系统的安装
linux·运维·ubuntu·openclaw
xiaobobo33301 天前
vscode+clangd打开头文件发现某些标识符不识别为“白色”语言模型识别为C++
vscode·识别头文件错误·标识符为白色·语言模型识别错误