解决VS Code Remote-SSH 在 Ubuntu 18.04 下不兼容问题(远程主机不满足运行VS Code服务器的先决条件)
背景
从 VS Code 1.99 开始,远程服务器端需要 glibc >= 2.28
和 libstdc++ >= 3.4.25
,而 Ubuntu 18.04 默认的 glibc
版本为 2.27,不满足要求,导致无法连接 VS Code Remote Server。
为了不升级系统,我们采用手动编译 glibc 2.28 并使用 patchelf
替换 VS Code Server 所需的动态链接器。
步骤总结
1. 编译 glibc 2.28 到用户目录
mkdir -p ~/tools/glibc cd ~/tools wget http://ftp.gnu.org/gnu/libc/glibc-2.28.tar.gz # 解压源码 tar -xzf glibc-2.28.tar.gz mkdir glibc-build && cd glibc-build # 配置安装路径为用户目录 ../glibc-2.28/configure --prefix=$HOME/tools/glibc --disable-werror # 注意需要关闭-Werror # 编译并安装 make -j$(nproc) make install
glibc 安装路径:~/tools/glibc/lib/
2. 确定 VS Code Server 的路径
使用 VS Code Remote-SSH 连接时,会在远程机器中生成:
~/.vscode-server/bin//node
我们需要 patch 的就是这个 node
文件。
但是我在服务器上没找到node文件,因此手动离线安装一个.vscode-server,参考:VScode连接远程服务器踩坑实战记录(新版离线vscode-server安装)服务器其它脚本之家
安装之后在:~/.vscode-server/cli/servers/Stable-*/server中是有node的,在这个目录下做修改。
3. 安装并使用 patchelf 修改 node
sudo apt install patchelf
切换到 node 所在目录并执行:
cd ~/.vscode-server/cli/servers/Stable-*/server patchelf --set-interpreter $HOME/tools/glibc/lib/ld-2.28.so node patchelf --set-rpath $HOME/tools/glibc/lib node
验证成功:
./node -v
如果输出版本号,则说明成功。
如果报错,检查ldd ./node
输出,是否所有库依赖于自定义目录,缺少什么就添加。
比如,缺少libstdc++.so.6
和libgcc_s.so.1
。
从另一台Ubuntu 20.04中拷贝:
mkdir -p ~/tmp-libs cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6* ~/tmp-libs/ cp /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 ~/tmp-libs/
复制到你的 glibc 目录
mkdir -p ~/tools/glibc/lib64 # 如果没有 lib64 目录就建一个 cp ~/tmp-libs/libstdc++.so.6* ~/tools/glibc/lib/ cp ~/tmp-libs/libgcc_s.so.1 ~/tools/glibc/lib64/
强制 node
只从自定义目录加载所有库
cd ~/.vscode-server/cli/servers/Stable-*/server/ # 把 rpath 设为 glibc/lib 和 glibc/lib64 两个目录 patchelf --set-rpath $HOME/tools/glibc/lib:/home$HOME/tools/glibc/lib64 node # 再次确认解释器也对: patchelf --set-interpreter $HOME/tools/glibc/lib/ld-2.28.so node
验证
ldd ./node
应该全部库都指向 $HOME/tools/glibc/lib{,64}
下的版本。 然后再跑:
./node -v
4. 创建环境变量以实现自动 patch
编辑 ~/.bashrc
文件,在末尾添加:
# VS Code Remote Server 自动 patch 设置 export VSCODE_SERVER_CUSTOM_GLIBC_LINKER=$HOME/tools/glibc/lib/ld-2.28.so export VSCODE_SERVER_CUSTOM_GLIBC_PATH=$HOME/tools/glibc/lib:$HOME/tools/glibc/lib64 export VSCODE_SERVER_PATCHELF_PATH=$(which patchelf)
执行以下命令使其生效:
source ~/.bashrc
问题:
若确保上述步骤成功完成,但vscode连接时扔报错,可选择跳过检查。
在你要连接的服务器上,直接建一个空文件 /tmp/vscode-skip-server-requirements-check
,VS Code Server 安装脚本就会检测到它并跳过 glibc/libstdc++ 的版本校验。
此时,应该能正确启动vscode远程连接。(至少笔者亲测可行)
结果
此方案无需升级系统,仅通过用户空间编译 glibc 与设置 patchelf,即可在 Ubuntu 18.04 上成功运行新版 VS Code Remote-SSH。