VSCode 远程开发连接低版本 Linux 系统
写在前面
VSCode 在 1.99 版本后不再支持使用 Remote-SSH 功能连接低版本的 Linux 系统(如 CentOS 7、Ubuntu 18.04),根据官方文档 的说明,在 x64 Linux 系统上运行新版本的 VSCode Remote Server 的基本要求为 kernel >= 4.18, glibc >=2.28, libstdc++ >= 3.4.25, tar。其中 CentOS 7 的问题为 glibc 与 libstdc++ 均版本过低;Ubuntu 18.04 的问题为 glibc 本本过低。
根据官方的缓解措施,可以通过自己编译 crosstool-ng 来构建一套专用于 VSCode Remote Server 的 sysroot 环境来解决。但从头编译 crosstool-ng 较为繁琐,接着便看到了 Akkuman 的解决方案,其中建议安装 linuxbrew,然后使用 linuxbrew 自带的 glibc 作为 VSCode Remote Server 的 glibc 依赖。
但在实际使用中发现,linuxbrew 强制要求不可以安装在 root 用户下,这导致我的一大批服务器没办法直接解决。为此,在 Akkuman 旧版解决方案的基础上,采用单独编译 glibc 和 libstdc++ 的方式来解决问题,在此做个记录。
Ubuntu 18.04 LTS 系统
Ubuntu 18.04 的问题为 glibc 本本过低,因此只需要编译高版本 glibc 即可。
# 相关环境变量配置
GLIBC_VERSION="2.28"
GLIBC_DIR="$HOME/.local/src/opt/glibc-$GLIBC_VERSION"
GLIBC_TAR="$HOME/.local/src/opt/glibc-$GLIBC_VERSION.tar.gz"
GLIBC_INSTALL_DIR="$HOME/.local/opt/glibc-$GLIBC_VERSION"
# 创建相关目录
mkdir -p ~/.local/src/opt
mkdir -p ~/.local/opt
# 下载并解压 glibc 源码
cd ~/.local/src/opt
wget --no-check-certificate https://mirrors.aliyun.com/gnu/glibc/glibc-$GLIBC_VERSION.tar.gz
tar -zxvf "$GLIBC_TAR" -C ~/.local/src/opt
cd "$GLIBC_DIR"
# 安装编译依赖
sudo apt-get update
sudo apt-get install -y build-essential gawk bison
# 创建编译目录并编译安装
mkdir build && cd build
../configure --prefix="$GLIBC_INSTALL_DIR" --disable-profile --enable-add-ons --disable-werror
make -j$(nproc)
make install
编译成功后,为了让 VSCode Remote Server 使用新编译的 glibc,需要使用 patchelf 来修改 VSCode Remote Server 的依赖。打开 Releases · NixOS/patchelf 下载合适的 patchelf,并解压并放置到 /usr/local/bin/patchelf
处。
然后,为了使 VSCode Remote Server 知道要先 patchelf,需要将以下内容写入 ~/.ssh/environment
文件中:
VSCODE_SERVER_CUSTOM_GLIBC_LINKER=/home/bf/.local/opt/glibc-2.28/lib/ld-linux-x86-64.so.2
VSCODE_SERVER_CUSTOM_GLIBC_PATH=/home/bf/.local/opt/glibc-2.28/lib:/usr/lib/x86_64-linux-gnu:/lib/x86_64-linux-gnu
VSCODE_SERVER_PATCHELF_PATH=/usr/local/bin/patchelf
然后为了让 SSH 服务器允许读取 ~/.ssh/environment
文件,需要修改 /etc/ssh/sshd_config
配置:
sudo sed -i 's|#PermitUserEnvironment no|PermitUserEnvironment yes|g' /etc/ssh/sshd_config
sudo systemctl restart sshd
接着,享受 VSCode Remote-SSH 的愉快体验吧!
CentOS 7 系统
CentOS 7 的问题为 glibc 与 libstdc++ 均版本过低,因此需要编译高版本的 glibc 和 libstdc++。此外,CentOS 7 的 make 版本过低,不满足编译上述依赖库的要求,因此需要先升级 make。
wget https://mirrors.aliyun.com/gnu/make/make-4.3.tar.gz
tar -zxvf make-4.3.tar.gz
cd make-4.3
mkdir build && cd build
../configure --prefix=/usr
make -j$(nproc)
make install
编译成功后,由于 CentOS 7 的默认 GCC 版本也过低,因此也需要编译高版本的 GCC(同时也可以升级 libstdc++)。
wget https://mirrors.aliyun.com/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz
tar -zxvf gcc-9.3.0.tar.gz
cd gcc-9.3.0/
./contrib/download_prerequisites
mkdir build && cd build
../configure --enable-checking=release --enable-language=c,c++ --disable-multilib --prefix=/usr/local/gcc
make -j4
mv /usr/bin/gcc /usr/bin/gcc_4.8.5
ln -s /usr/local/gcc/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++_4.8.5
ln -s /usr/local/gcc/bin/g++ /usr/bin/g++
make install
最后,终于可以编译高版本的 glibc:
# 相关环境变量配置
GLIBC_VERSION="2.28"
GLIBC_DIR="$HOME/.local/src/opt/glibc-$GLIBC_VERSION"
GLIBC_TAR="$HOME/.local/src/opt/glibc-$GLIBC_VERSION.tar.gz"
GLIBC_INSTALL_DIR="$HOME/.local/opt/glibc-$GLIBC_VERSION"
# 创建相关目录
mkdir -p ~/.local/src/opt
mkdir -p ~/.local/opt
# 下载并解压 glibc 源码
cd ~/.local/src/opt
wget --no-check-certificate https://mirrors.aliyun.com/gnu/glibc/glibc-$GLIBC_VERSION.tar.gz
tar -zxvf "$GLIBC_TAR" -C ~/.local/src/opt
cd "$GLIBC_DIR"
# 创建编译目录并编译安装
mkdir build && cd build
../configure --prefix="$GLIBC_INSTALL_DIR" --disable-profile --enable-add-ons --disable-werror
make -j$(nproc)
make install
同样下载 patchelf 并放置到 /usr/local/bin/patchelf
处。然后,为了使 VSCode Remote Server 知道要先 patchelf,需要将以下内容写入 ~/.ssh/environment
文件中:(需要将 ~
替换为绝对路径)
VSCODE_SERVER_CUSTOM_GLIBC_LINKER=~/.local/opt/glibc-2.28/lib/ld-linux-x86-64.so.2
VSCODE_SERVER_CUSTOM_GLIBC_PATH=~/.local/opt/glibc-2.28/lib:/usr/local/gcc/lib64:/usr/lib/x86_64-linux-gnu:/lib/x86_64-linux-gnu
VSCODE_SERVER_PATCHELF_PATH=/usr/local/bin/patchelf
至此,CentOS 7 系统也可以愉快地使用 VSCode Remote-SSH 连接了。