“远程主机不满足运行 VS Code 服务器的先决条件”解决

image

Visual Studio Code 从 1.99 版本停止支持过时 Linux。但是学校的服务器还在用 CentOS 7,而我没有权限更新系统。为了继续使用 VS Code 连接服务器,有两种方法:第一种是降级 VS Code 为 1.98,第二种是提供 VS Code 所需的 glibc 版本。

这里介绍如何提供 VS Code 所需的 glibc 版本。可以使用 Homebrew 或者 crosstool-NG 安装 glibc。

Homebrew

关于安装 Homebrew,参见博客:Linux 安装 Homebrew

  1. 安装 glibc 和 patchelf:

    brew install -s glibc patchelf
    
  2. 将下面的内容加入 ~/.bashrc

    export VSCODE_SERVER_CUSTOM_GLIBC_LINKER="$(brew --prefix glibc)/lib/ld-linux-x86-64.so.2"
    export VSCODE_SERVER_CUSTOM_GLIBC_PATH="$(brew --prefix glibc)/lib"
    export VSCODE_SERVER_PATCHELF_PATH="$(brew --prefix patchelf)/bin/patchelf"
    
  3. 屏蔽依赖检查(可选):

    touch /tmp/vscode-skip-server-requirements-check
    

crosstool-NG

手动安装 crosstool-NG

  1. crosstool-ng.org 下载 crosstool-NG 源码:

    wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.27.0.tar.xz
    tar -xJf crosstool-ng-*.tar.xz && rm crosstool-ng-*.tar.xz
    cd crosstool-ng*
    
  2. 编译并安装:

    mkdir build && cd build
    ../configure --prefix="$HOME/.local"
    make -j$(nproc)
    make install
    export PATH="$HOME/.local/bin:$PATH"
    
  3. 生成 sysroot:

    mkdir toolchain && cd toolchain
    wget -O .config https://raw.githubusercontent.com/microsoft/vscode-linux-build-agent/refs/heads/main/x86_64-gcc-10.5.0-glibc-2.28.config
    unset LD_LIBRARY_PATH CPATH  # 清理环境变量
    ct-ng build
    

    配置文件来自 vscode-linux-build-agent | GitHub

或者构建 Docker 镜像

  1. 构建镜像:

    Dockerfile:

    FROM ubuntu:latest
    
    RUN apt-get update && \
        apt-get install -y gcc g++ gperf bison flex texinfo help2man make libncurses5-dev \
                python3-dev autoconf automake libtool libtool-bin gawk wget bzip2 xz-utils \
                unzip patch rsync meson ninja-build && \
        apt-get clean
    RUN wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.27.0.tar.xz && \
        tar -xJf crosstool-ng-*.tar.xz && \
        rm crosstool-ng-*.tar.xz && \
        cd crosstool-ng-* && \
        ./configure --prefix=/opt/crosstool-ng && \
        make && \
        make install && \
        rm -rf crosstool-ng-*
    RUN useradd ct-ng && \
        mkdir /toolchain && \
        chown ct-ng:ct-ng /toolchain
    ENV PATH=/opt/crosstool-ng/bin:$PATH
    USER ct-ng
    WORKDIR /toolchain
    
    docker build -t crosstool-ng .
    
  2. 生成 sysroot:

    docker run -it --name crosstool-ng bash
    wget -O .config https://raw.githubusercontent.com/microsoft/vscode-linux-build-agent/refs/heads/main/x86_64-gcc-10.5.0-glibc-2.28.config
    ct-ng build
    exit
    sudo docker cp crosstool-ng:/toolchain/x86_64-linux-gnu .
    docker rm -f crosstool-ng
    

安装 patchelf

下载最新的 patchelf 分发:

wget https://github.com/NixOS/patchelf/releases/download/0.18.0/patchelf-0.18.0-x86_64.tar.gz
tar -xzf patchelf-*-x86_64.tar.gz -C ~/.local
rm patchelf-*-x86_64.tar.gz

替换 glibc

  1. 将构建产物 x86_64-linux-gnu 上传到 CentOS 7 的 ~/.local/opt 目录。

    rsync -aP x86_64-linux-gnu HOST:.local/opt/
    
  2. 将下面的内容加入 ~/.bashrc

    export VSCODE_SERVER_CUSTOM_GLIBC_LINKER="$HOME/.local/opt/x86_64-linux-gnu/x86_64-linux-gnu/sysroot/lib/ld-2.28.so"
    export VSCODE_SERVER_CUSTOM_GLIBC_PATH="$HOME/.local/opt/x86_64-linux-gnu/x86_64-linux-gnu/sysroot/lib"
    export VSCODE_SERVER_PATCHELF_PATH="$HOME/.local/bin/patchelf"
    

参考:

Troubleshooting

version `GLIBCXX_3.4.29' not found

[16:31:56.680] [server] Patching glibc from /homebrew/opt/glibc/lib with /homebrew/opt/patchelf/bin/patchelf...
[16:31:56.681] [server] /homebrew/opt/patchelf/bin/patchelf: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /homebrew/opt/patchelf/bin/patchelf)
[16:31:56.681] [server] Patching linker from /homebrew/opt/glibc/lib/ld-linux-x86-64.so.2 with /homebrew/opt/patchelf/bin/patchelf...
[16:31:56.681] [server] /homebrew/opt/patchelf/bin/patchelf: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /homebrew/opt/patchelf/bin/patchelf)
[16:31:56.681] [server] Patching complete.

问题原因:patchelf 工具需要 GLIBCXX_3.4.29,但是在系统共享库 ⁠/lib64/libstdc++.so.6 中没有找到 GLIBCXX_3.4.29,因此 patchelf 执行失败。

解决方法:从源码编译 patchelf

brew reinstall -s patchelf
posted @ 2025-04-17 14:43  Undefined443  阅读(2712)  评论(0)    收藏  举报