解决: 2025年最新版本的 VS Code Server 在 低版本 CentOS 7 (glibc 2.17) 上无法运行的问题 + 升级 CentOS 内核
在构建 sysroot 之前添加 swap,避免编译过程中内存不足。
·
目录
📋 问题背景
从 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
🎯 解决方案步骤
- 构建 glibc 2.28 的 sysroot (使用 Crosstool-ng)
- 安装 patchelf 工具 (>= 0.18.x)
- 升级系统内核到 5.4.x
- 配置环境变量
- 使用 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 连接服务器
- 打开 VS Code
- 安装 Remote-SSH 扩展
- 配置 SSH 连接 (F1 → Remote-SSH: Connect to Host)
- 连接到服务器
- 首次连接会显示警告 “此连接不受支持”,但连接应该能成功
✅ 验证
连接成功后,在 VS Code 的远程终端中执行:
# 检查内核版本
uname -r
# 检查 glibc 版本
$VSCODE_SERVER_CUSTOM_GLIBC_LINKER --version
📝 注意事项
- 构建时间: Sysroot 构建需要 1-2 小时,请耐心等待
- 内存要求: 建议至少 4GB 内存,或添加 swap
- Docker 兼容性: 升级内核不影响 Docker 容器
- 备份: 升级前建议创建系统快照(如果云服务商支持)
🔗 参考资料
over, enjoy!!!
如对您有帮助,感谢投喂!
「智能机器人开发者大赛」官方平台,致力于为开发者和参赛选手提供赛事技术指导、行业标准解读及团队实战案例解析;聚焦智能机器人开发全栈技术闭环,助力开发者攻克技术瓶颈,促进软硬件集成、场景应用及商业化落地的深度研讨。 加入智能机器人开发者社区iRobot Developer,与全球极客并肩突破技术边界,定义机器人开发的未来范式!
更多推荐



所有评论(0)