背景
从 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/<commit_id>/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。
评论前必须登录!
注册