当前位置: 首页 > news >正文

vscode新版本remotessh服务端报`GLIBC_2.28‘ not found解决方案

问题现象

通过vscode的remotessh插件连接老版本服务器(如RHEL7,Centos7)时,插件会报错,无法连接。
查看插件的错误日志可以看到类似如下的报错信息:

dc96b837cf6bb4af9cd736aa3af08cf8279f7685/node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by dc96b837cf6bb4af9cd736aa3af08cf8279f7685/node)
dc96b837cf6bb4af9cd736aa3af08cf8279f7685/node: /lib64/libc.so.6: version `GLIBC_2.25' not found (required by dc96b837cf6bb4af9cd736aa3af08cf8279f7685/node)
dc96b837cf6bb4af9cd736aa3af08cf8279f7685/node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by dc96b837cf6bb4af9cd736aa3af08cf8279f7685/node)
dc96b837cf6bb4af9cd736aa3af08cf8279f7685/node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by dc96b837cf6bb4af9cd736aa3af08cf8279f7685/node)
dc96b837cf6bb4af9cd736aa3af08cf8279f7685/node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by dc96b837cf6bb4af9cd736aa3af08cf8279f7685/node)
dc96b837cf6bb4af9cd736aa3af08cf8279f7685/node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by dc96b837cf6bb4af9cd736aa3af08cf8279f7685/node)

我们先来分析一下错误信息:

  1. 首先,node前面的一串hash实际上是vscode-server端的版本号,在vscode 1.8x某个版本的时候,微软隐性升级了捆绑的node版本;此版本的node依赖于GLIBC_2.28运行时,在老系统上不存在;
  2. 我们可以看到,捆绑的node版本依赖的有libc和libc还有libstdc++;其中libc和libm来自于glibc,libstdc++来自于gcc编译器;

解决思路

为了解决这个问题,我们需要

  1. 重新编译glibc(C运行时)和gcc(Cxx运行时);
    但是需要注意的是!编译并覆盖安装glibc会导致系统崩溃,千万不要尝试覆盖安装!!!
    但是需要注意的是!编译并覆盖安装glibc会导致系统崩溃,千万不要尝试覆盖安装!!!
    但是需要注意的是!编译并覆盖安装glibc会导致系统崩溃,千万不要尝试覆盖安装!!!
    重要的事情一定要多说几次,小白新手千万不要尝试自行编译安装glibc,否则系统崩溃就没救了。下面的步骤需要你完全看明白没有疑问才可以继续进行。
  2. 为了避免覆盖系统glibc导致系统崩溃,我们可以通过patchelf修改vscode-server端捆绑的node可执行文件,使其RPATH指向我们自行编译的glibc和libstdc++运行时路径;

编译glibc和gcc的方式在本文中不会涵盖(以免祸害小白 )。只需要记得,千万记得,configure的时候一定要指定一个prefix,千万不要覆盖系统的glibc,千万不要安装到系统PATH路径中。

pathelf给node打补丁

该命令的用法是:
patchelf --set-rpath "$ORIGIN:$ORIGIN/lib:$ORIGIN/../lib" executable

例如,我的glibc安装到了一个非常规路径(确保不会在PATH下面)
/home/wb/.local/glibc-2.38
其目录结构是:

/home/wb/.local/glibc-2.38
├── bin
├── etc
├── include
├── lib
├── libexec
├── sbin
├── share
└── var

我们需要的运行时路径在lib目录下。另外,我的gcc安装到了这个路径下面:
/opt/toolchains
其目录结构是:

/opt/toolchains/
├── bin
├── include
├── lib
├── lib64
├── libexec
└── share

我们需要的libstdc++运行时在lib64目录下。
首先,我们要进入vscode-server端的路径,通常情况下在家目录的这个位置
$HOME/.vscode-server/bin
在这个目录下我们可以看到remote-ssh插件下载的服务端程序的目录,本例中,服务端的版本号是1.89.1,对应的commitid(hash值)是:dc96b837cf6bb4af9cd736aa3af08cf8279f7685
那么我们就需要cd dc96b837cf6bb4af9cd736aa3af08cf8279f7685进入,在该目录下我们就可以看到node可执行文件。
最终,我们的pathelf命令为
(在$HOME/.vscode-server/bin/dc96b837cf6bb4af9cd736aa3af08cf8279f7685下执行):
patchelf --set-interpreter /home/wb/.local/glibc-2.38/lib/ld-linux-x86-64.so.2 --set-rpath /home/wb/.local/glibc-2.38/lib:/opt/toolchains/lib64 node

之后可以通过ldd node确认rpath已经修改完毕,

#	ldd nodelinux-vdso.so.1 =>  (0x00007fffcdb8d000)libdl.so.2 => /home/wb/.local/glibc-2.38/lib/libdl.so.2 (0x00007fb1250ed000)libstdc++.so.6 => /opt/toolchains/lib64/libstdc++.so.6 (0x00007fb124abc000)libm.so.6 => /home/wb/.local/glibc-2.38/lib/libm.so.6 (0x00007fb12500f000)libgcc_s.so.1 => /opt/toolchains/lib64/libgcc_s.so.1 (0x00007fb12489e000)libpthread.so.0 => /home/wb/.local/glibc-2.38/lib/libpthread.so.0 (0x00007fb125009000)libc.so.6 => /home/wb/.local/glibc-2.38/lib/libc.so.6 (0x00007fb124662000)/home/wb/.local/glibc-2.38/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fb124ed2000)

之后即可重新打开vscode客户端,使用remote-ssh连接到服务器了。

补充说明

一般情况下,缺少GLIBC_2.XX的情况,都可以用这种方式来解决。在本例的情况下,vscode-server端捆绑的node依赖的是GLIBC_2.28,那么我们只需要下载glibc 2.2.8版本即可,不需要下载太高的版本,因为更高版本依赖于高版本的make,as,ld等binutils,可能会无法顺利编译。本来系统就很老了,不需要另外瞎折腾了,能用就行。

另附上glibc和gcc的下载地址:

  1. glibc-2.28
  2. gcc (自己挑吧,一般9.3.0以上版本都可以)
http://www.lryc.cn/news/348465.html

相关文章:

  • 盘他系列——oj!!!
  • 洛谷 P2657 [SCOI2009] windy 数 题解 数位dp
  • Python爬虫入门:网络世界的宝藏猎人
  • 【NodeMCU实时天气时钟温湿度项目 6】解析天气信息JSON数据并显示在 TFT 屏幕上(心知天气版)
  • 重构四要素:目的、对象、时机和方法
  • 基于Echarts的大数据可视化模板:服务器运营监控
  • Python3 笔记:Python的常量
  • 【Linux】自动化构建工具make/Makefile和git介绍
  • C语言—关于字符串(编程实现部分函数功能)
  • picoCTF-Web Exploitation-Trickster
  • SSH 免密登录,设置好仍然需要密码登录解决方法
  • 【斑马打印机】web前端页面通过BrowserPrint API连接斑马打印机进行RFID条形码贴纸打印
  • DigitalOcean 应用托管更新:应用端到端运行时性能大幅改进
  • c/c++对于char*的理解(联合string容器)
  • Web前端三大主流框架是什么?
  • 一个基于servlet的MVC项目-登录验证
  • Windows 11 下 kafka 的安装踩坑
  • 二维数组:行列互换/求最大值及其所在位置/求各行各列的和/矩阵乘积/深入理解二维数组
  • The Onion Router-洋葱
  • 自动化工具 Ansible:playbooks 剧本编写
  • AttributeError: module ‘flask.app‘ has no attribute ‘route‘
  • 在云计算与人工智能中,7ECloud扮演着什么样的角色
  • 视频推拉流EasyDSS视频直播点播平台如何优先展示正在直播的直播间?
  • JavaEE之线程(4)——线程安全、线程安全的原因,synchronized关键字
  • Python3 笔记:分支结构
  • 《TAM》论文笔记(上)
  • 【Java的抽象类和接口】
  • 今天开发了一款软件,我竟然只用敲了一个字母(文末揭晓)
  • 【C++杂货铺】红黑树
  • css--控制滚动条的显示位置