“远程主机不满足运行 VS Code 服务器的先决条件”解决
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
-
安装 glibc 和 patchelf:
brew install -s glibc patchelf
-
将下面的内容加入
~/.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"
-
屏蔽依赖检查(可选):
touch /tmp/vscode-skip-server-requirements-check
crosstool-NG
手动安装 crosstool-NG
-
从 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*
-
编译并安装:
mkdir build && cd build ../configure --prefix="$HOME/.local" make -j$(nproc) make install export PATH="$HOME/.local/bin:$PATH"
-
生成 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
或者构建 Docker 镜像
-
构建镜像:
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 .
-
生成 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
-
将构建产物
x86_64-linux-gnu
上传到 CentOS 7 的~/.local/opt
目录。rsync -aP x86_64-linux-gnu HOST:.local/opt/
-
将下面的内容加入
~/.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"
参考:
- Installing crosstool-NG | crosstool-NG Docs
- Can I run VS Code Server on older Linux distributions? | Visual Studio Code Docs
- Connect to Unsupported Older Linux servers with VS Code Remote-SSH using Custom glibc & libstdc++ | DEV Community
- Allow connecting to unsupported Linux remotes, by use of custom glibc and stdc++ libraries | GitHub
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