📋 问题背景

从 VS Code 1.99 版本(2025年3月)开始,VS Code Server 要求:

  • glibc >= 2.28
  • libstdc++ >= 3.4.25
  • kernel >= 4.18

而 CentOS 7 默认配置:

  • glibc: 2.17
  • libstdc++: 3.4.19
  • kernel: 3.10.0

直接使用 vscode ssh 连接会报错: FATAL: kernel too old


🎯 解决方案步骤

  1. 构建 glibc 2.28 的 sysroot (使用 Crosstool-ng)
  2. 安装 patchelf 工具 (>= 0.18.x)
  3. 升级系统内核到 5.4.x
  4. 配置环境变量
  5. 使用 VS Code SSH 连接服务器

PS:以下所有命令需要一个一个复制执行


🔧 步骤一:构建 Sysroot

1.1 准备 Docker 环境

# 服务器上创建工作目录
mkdir -p ~/vscode-sysroot-build/tarballs
cd ~/vscode-sysroot-build

# 创建 Dockerfile
cat > Dockerfile << 'EOF'
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

RUN wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.26.0.tar.bz2 && \
    tar -xjf crosstool-ng-1.26.0.tar.bz2 && \
    cd crosstool-ng-1.26.0 && \
    ./configure --prefix=/crosstool-ng-1.26.0/out && \
    make && make install && \
    cd .. && rm crosstool-ng-1.26.0.tar.bz2

ENV PATH=$PATH:/crosstool-ng-1.26.0/out/bin
WORKDIR /build
EOF

# 构建镜像
docker build -t crosstool-builder .

1.2 (可选)添加 Swap (如果内存 < 4GB)

重要: 在构建 sysroot 之前添加 swap,避免编译过程中内存不足

sudo dd if=/dev/zero of=/swapfile bs=1G count=4
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 验证
free -h

1.3 下载源码包

cd ~/vscode-sysroot-build/tarballs

# 下载所需的源码包(使用阿里云镜像)
wget https://mirrors.aliyun.com/gnu/gmp/gmp-6.2.1.tar.xz
wget https://mirrors.aliyun.com/gnu/gcc/gcc-8.5.0/gcc-8.5.0.tar.xz
wget https://mirrors.aliyun.com/gnu/glibc/glibc-2.28.tar.xz
wget https://mirrors.aliyun.com/gnu/binutils/binutils-2.29.1.tar.xz
wget https://mirrors.aliyun.com/linux-kernel/v3.x/linux-3.10.108.tar.xz
wget https://mirrors.aliyun.com/gnu/mpfr/mpfr-4.2.1.tar.xz
wget https://mirrors.aliyun.com/gnu/mpc/mpc-1.2.1.tar.gz
wget https://github.com/libexpat/libexpat/releases/download/R_2_5_0/expat-2.5.0.tar.xz
wget https://mirrors.aliyun.com/gnu/gettext/gettext-0.21.tar.xz
wget https://mirrors.aliyun.com/gnu/ncurses/ncurses-6.4.tar.gz
wget https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.xz
wget https://github.com/facebook/zstd/releases/download/v1.5.5/zstd-1.5.5.tar.gz
wget https://gcc.gnu.org/pub/gcc/infrastructure/isl-0.26.tar.xz
wget https://mirrors.aliyun.com/gnu/libiconv/libiconv-1.16.tar.gz
wget https://fossies.org/linux/misc/old/libelf-0.8.13.tar.gz

1.4 启动容器并构建

# 启动容器
docker run -d --name sysroot-builder \
  -v ~/vscode-sysroot-build:/output \
  crosstool-builder tail -f /dev/null

# 进入容器
docker exec -it sysroot-builder bash

# 在容器内创建非root用户
useradd -m -s /bin/bash builder
su - builder

# 设置环境
export PATH=$PATH:/crosstool-ng-1.26.0/out/bin
mkdir -p ~/build
cd ~/build

# 下载配置文件
wget -O .config https://raw.githubusercontent.com/microsoft/vscode-linux-build-agent/main/x86_64-gcc-8.5.0-glibc-2.28.config

# 修改配置以支持 CentOS 7 (kernel 3.10) 并降低内存占用
sed -i 's/CT_LINUX_VERSION="4.19.287"/CT_LINUX_VERSION="3.10.108"/' .config
sed -i 's/CT_GLIBC_MIN_KERNEL="4.19.287"/CT_GLIBC_MIN_KERNEL="3.10"/' .config
# 降低并行编译数,减少内存占用(默认可能是6,改为1)
sed -i 's/CT_PARALLEL_JOBS=.*/CT_PARALLEL_JOBS=1/' .config

# 复制源码包到容器
exit  # 退出到服务器
docker cp ~/vscode-sysroot-build/tarballs sysroot-builder:/home/builder/build/.build/
docker exec -it sysroot-builder chown -R builder:builder /home/builder/build/.build/tarballs

# 重新进入容器
docker exec -it -u builder sysroot-builder bash
cd ~/build
export PATH=$PATH:/crosstool-ng-1.26.0/out/bin

# 创建 downloads 目录并复制文件
mkdir -p downloads
cp .build/tarballs/* downloads/

# 开始构建(需要1-2小时)
ct-ng build

1.5 打包 Sysroot

# 在容器内
cd /home/builder/build/
tar -czf ~/x86_64-sysroot-3.10.tar.gz x86_64-linux-gnu/

# 退出容器
exit

# 在服务器上复制出来
docker cp sysroot-builder:/home/builder/x86_64-sysroot-3.10.tar.gz ~/

# 解压到服务器
cd ~
tar -xzf x86_64-sysroot-3.10.tar.gz

🔧 步骤二:安装 Patchelf

cd ~
wget https://github.com/NixOS/patchelf/releases/download/0.18.0/patchelf-0.18.0-x86_64.tar.gz
tar -xzf patchelf-0.18.0-x86_64.tar.gz
mkdir -p ~/patchelf/bin
mv bin/patchelf ~/patchelf/bin/

# 验证
~/patchelf/bin/patchelf --version
# 应该显示: patchelf 0.18.0

🔧 步骤三:升级系统内核

3.1 下载并安装内核

cd /tmp

# 下载 kernel-lt 5.4.278 (LTS版本)
wget https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.278-1.el7.elrepo.x86_64.rpm
wget https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.278-1.el7.elrepo.x86_64.rpm
wget https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-headers-5.4.278-1.el7.elrepo.x86_64.rpm
wget https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-tools-5.4.278-1.el7.elrepo.x86_64.rpm
wget https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-tools-libs-5.4.278-1.el7.elrepo.x86_64.rpm

# 删除旧的 kernel-headers
yum remove -y kernel-headers kernel-tools kernel-tools-libs

# 安装依赖
yum install -y perl-Data-Dumper

# 安装内核
rpm -ivh kernel-lt-5.4.278-1.el7.elrepo.x86_64.rpm
rpm -ivh kernel-lt-headers-5.4.278-1.el7.elrepo.x86_64.rpm
rpm -ivh kernel-lt-tools-libs-5.4.278-1.el7.elrepo.x86_64.rpm
rpm -ivh kernel-lt-tools-5.4.278-1.el7.elrepo.x86_64.rpm
rpm -ivh kernel-lt-devel-5.4.278-1.el7.elrepo.x86_64.rpm

3.2 设置默认内核

# 设置新内核为默认
grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg

# 验证
grubby --default-kernel
# 应该显示: /boot/vmlinuz-5.4.278-1.el7.elrepo.x86_64

# 重启
reboot

3.3 验证内核版本

uname -r
# 应该显示: 5.4.278-1.el7.elrepo.x86_64

🔧 步骤四:配置环境变量

# 编辑 ~/.bashrc
vi ~/.bashrc

# 在文件末尾添加:
export VSCODE_SERVER_CUSTOM_GLIBC_LINKER="$HOME/x86_64-linux-gnu/x86_64-linux-gnu/sysroot/lib/ld-linux-x86-64.so.2"
export VSCODE_SERVER_CUSTOM_GLIBC_PATH="$HOME/x86_64-linux-gnu/x86_64-linux-gnu/sysroot/lib:$HOME/x86_64-linux-gnu/x86_64-linux-gnu/sysroot/usr/lib"
export VSCODE_SERVER_PATCHELF_PATH="$HOME/patchelf/bin/patchelf"

# 使配置生效
source ~/.bashrc

# 验证
echo $VSCODE_SERVER_CUSTOM_GLIBC_LINKER
echo $VSCODE_SERVER_CUSTOM_GLIBC_PATH
echo $VSCODE_SERVER_PATCHELF_PATH

🚀 步骤五:使用 VS Code SSH 连接服务器

  1. 打开 VS Code
  2. 安装 Remote-SSH 扩展
  3. 配置 SSH 连接 (F1 → Remote-SSH: Connect to Host)
  4. 连接到服务器
  5. 首次连接会显示警告 “此连接不受支持”,但连接应该能成功

✅ 验证

连接成功后,在 VS Code 的远程终端中执行:

# 检查内核版本
uname -r

# 检查 glibc 版本
$VSCODE_SERVER_CUSTOM_GLIBC_LINKER --version

📝 注意事项

  1. 构建时间: Sysroot 构建需要 1-2 小时,请耐心等待
  2. 内存要求: 建议至少 4GB 内存,或添加 swap
  3. Docker 兼容性: 升级内核不影响 Docker 容器
  4. 备份: 升级前建议创建系统快照(如果云服务商支持)

🔗 参考资料


over, enjoy!!!
如对您有帮助,感谢投喂!
微信感谢投喂版

Logo

「智能机器人开发者大赛」官方平台,致力于为开发者和参赛选手提供赛事技术指导、行业标准解读及团队实战案例解析;聚焦智能机器人开发全栈技术闭环,助力开发者攻克技术瓶颈,促进软硬件集成、场景应用及商业化落地的深度研讨。 加入智能机器人开发者社区iRobot Developer,与全球极客并肩突破技术边界,定义机器人开发的未来范式!

更多推荐