V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LGA1150
V2EX  ›  Visual Studio Code

VSCode 今天自动更新后, Remote SSH 连不上 Ubuntu Server 18.04

  •  1
     
  •   LGA1150 · 279 天前 · 4112 次点击
    这是一个创建于 279 天前的主题,其中的信息可能已经有所发展或是发生改变。

    更新完成后,原来好好的 Remote SSH 再也连不上了,提示 GLIBC 版本太低

    Warning: Missing GLIBC >= 2.28! from /lib/x86_64-linux-gnu/libc-2.27.so
    Error: Missing required dependencies. Please refer to our FAQ https://aka.ms/vsc
    code-remote/faq/old-linux for additional information.
    

    有办法降级 Remote SSH 吗?

    26 条回复    2024-02-06 22:08:12 +08:00
    lybcyd
        1
    lybcyd  
       279 天前
    看了这段信息的对应提示,官方解决办法是降级 vscode 到 1.85 版本
    LGA1150
        3
    LGA1150  
    OP
       279 天前
    @lybcyd
    @p1gd0g 好的,目前看来只能整个 VSCode 降级,没有办法单独降级 SSH 插件
    fuckshiter
        4
    fuckshiter  
       279 天前
    前几天遇到,感觉是这个 glibc2.28 版本的文件有问题,你可以去别的正常的系统搞一个这个 glibc ,备份好原来那个先,然后覆盖就没事了。我是这样解决的。你可以先看看你的 ubuntu 的 glibc 是什么版本 ldd --version.
    choah
        5
    choah  
       279 天前
    Ubuntu16.04 的 2.23 版本瑟瑟发抖
    vikaptain
        6
    vikaptain  
       279 天前
    看下插件切换到 pre-release version 能不能行,不行的话就 vscode 降级。
    seers
        7
    seers  
       279 天前 via Android
    我也是,centos7 ,准备换到 Ubuntu22.04 了,glibc 版本低了也不好
    Dogtler
        8
    Dogtler  
       279 天前
    喔,我昨晚也手贱点了更新,然后一直报 server on long log 巴拉巴拉。
    刚整好,版本回退到 1.8.5 即可,1.8.6 需要 centos 8 才有 glibc 1.28.
    Dogtler
        9
    Dogtler  
       279 天前
    vscode 在插件自动更新那一栏选择取消,以后保持不更新 openssh 。
    Charrlles
        10
    Charrlles  
       279 天前 via iPhone
    VSCode 的迭代一般都是一两个月发一个功能版本,在功能版本之间会发一到两个 recovery 版本,修复由功能版本引起的 bug 。所以我都是关掉 vscode 的自动更新,有想要的功能就等到 recovery 版本再手动检测更新,这样会比较稳定

    https://github.com/microsoft/vscode/releases
    exch4nge
        11
    exch4nge  
       279 天前 via iPhone
    正好昨天遇到了,简要说就是装 musl ,装 glibc ,再用 patchelf 解决了
    Chipmunker
        12
    Chipmunker  
       278 天前
    @exch4nge 用 patchelf 修改哪个软件的 rpath ?是 code-server 自带的 node 麽?
    f1ynnv2
        14
    f1ynnv2  
       278 天前
    @exch4nge 能否请写个详细说明,感谢。
    f1ynnv2
        15
    f1ynnv2  
       278 天前
    试了一下 macOS 下可以下载个最后的 1.85.2 版本,放在某个目录继续使用。只要不追求在 LaunchPad 里同时有两个图标同时出现,其实不需要任何修改。
    exch4nge
        16
    exch4nge  
       278 天前
    @Chipmunker 是 node
    @f1ynnv2 #14

    vscode ssh 上去的时候看 OUTPUT (输出)窗口会有详细的日志,第一步分析日志发现直接报一些系统版本有关系的错误,我的系统是 CentOS 7 所以提示的是 glibc 跟 cxx 版本过低

    找到日志里的一个路径,是 code-xxxxxxxxxxxxxxx 结尾的,上机器找到这个目录,这个文件是个 script ,打开会发现有检查 /tmp/xxxxxxxxxxxx 这个路径有文件就 skip os version check 之类的操作,手动创建这个文件

    然后一般这个目录的上一级目录有个 node 可执行文件,这个是需要 patch 的,我用了自己安装的 glibc 跟 cxx 的路径,用 patchelf 打了补丁,打完执行 ./node 检查看看能否运行

    再次尝试用 vscode ssh 上去(每次先退 vscode 再把相关进程都 kill 掉),还是会有错误,仔细看日志发现,某个可执行文件执行不了,报错里提到也没找到 musl 什么的,然后自己再安装了 musl

    然后再次尝试 vscode ssh 上去,就可以了,右下角会弹出警告框,但是功能没问题。

    如果你能直接升级操作系统的 glibc 之类的版本的话,那应该更简单,不过我没试过,也在网上看到很多升级 glibc 后遇到很多问题的事情,就没敢动,只是找个其它位置安装的。
    f1ynnv2
        17
    f1ynnv2  
       278 天前
    @f1ynnv2 重新试了一下,这个方法不可行。另一个新版本的 vscode 更新插件后,会影响 1.85.2 的插件导致 remote-ssh 不可用。
    f1ynnv2
        18
    f1ynnv2  
       278 天前   ❤️ 1
    @exch4nge 感谢,我也成功了,是参考这篇文章: https://zhuanlan.zhihu.com/p/551770477

    不过这篇文章是随便找了个 node 来演示的,实际上要按照你说的这个找到对应版本的 vscode-server 的 node 。
    我的系统是 ubuntu16.04 ,使用 vscode 1.86 macos 版本来测试成功了。用到的几个文件放在这里供大家参考吧:
    libc6_2.39-0ubuntu1_amd64.deb
    libstdc++6_13.1.0-2ubuntu2~23.04_amd64.deb

    对了,后面解压这些.deb 文件可能会报错,这样解决:
    ```
    tar -xzf patchelf-0.18.0-x86_64.tar.gz

    ar -xv libc6_2.39-0ubuntu1_amd64.deb
    tar -I zstd -xvf data.tar.zst

    ar -xv libstdc++6_13.1.0-2ubuntu2~23.04_amd64.deb
    tar -I zstd -xvf data.tar.zst
    ```
    f1ynnv2
        19
    f1ynnv2  
       278 天前
    如果其他人也有这需求,参考下面完整的步骤吧:


    1. 问题
    VSCode 自 1.86 开始,服务器端的 vscode-server 里的 node 要求 glibc >=2.28, libstdc++ >= 3.4.25, 这样导致一大批老系统无法使用 vsocde 的 SSH 开发功能。https://code.visualstudio.com/docs/remote/linux#_remote-host-container-wsl-linux-prerequisites

    2. 解决方案
    采用 patchelf ,单独修改目标机上 vscode-server 的 node 对上述两个库的依赖 参考: https://zhuanlan.zhihu.com/p/551770477


    2.1 确认 node 依赖的库版本

    根据客户机上 VScode 的版本 commit 号找到服务器上对应的目录,一般是~/.vscode-server/bin/05047486b6df5eb8d44b2ecd70ea3bdf775fd937/这类形式
    直接运行这个目录下的 node 会报错,可以获取依赖的库版本号:

    此外还可以从 https://code.visualstudio.com/docs/remote/linux#_remote-host-container-wsl-linux-prerequisites 查询开发库版本的依赖。

    2.2 下载 patchelf

    https://github.com/NixOS/patchelf

    2.3 下载 glibc

    https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/g/glibc/

    glibc 的软件包名前缀为 libc6, 本次下载文件为:libc6_2.39-0ubuntu1_amd64.deb

    2.4 下载 glibcxx

    从这里 https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html 查找需要的 gcc 版本,然后在 https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/g/gcc-<版本号>/下面找到对应的包,本次使用的是 libstdc++6_13.1.0-2ubuntu2~23.04_amd64.deb

    3. 服务器端准备
    3.1 上述三个文件都上传到服务器
    3.2 解压
    sudo apt install zstd
    tar -xzf patchelf-0.18.0-x86_64.tar.gz

    ar -xv libc6_2.39-0ubuntu1_amd64.deb
    tar -I zstd -xvf data.tar.zst

    ar -xv libstdc++6_13.1.0-2ubuntu2~23.04_amd64.deb
    tar -I zstd -xvf data.tar.zst

    3.3 归集所有 lib 库

    将解压得到的 lib/x86_64-linux-gnu/*和 usr/lib/x86_64-linux-gnu/*都复制到统一的目录下,本次放在~/libs 下:

    cp -r lib/x86_64-linux-gnu/* ~/libs/
    cp -r usr/lib/x86_64-linux-gnu/* ~/libs/

    3.4 使用 patchelf

    cd ~/libs
    ~/patchelf/bin/patchelf --set-rpath `pwd` ~/.vscode-server/bin/05047486b6df5eb8d44b2ecd70ea3bdf775fd937/node
    ~/patchelf/bin/patchelf --set-interpreter `pwd`/ld-linux-x86-64.so.2 ~/.vscode-server/bin/05047486b6df5eb8d44b2ecd70ea3bdf775fd937/node

    3.5 使用 ldd 命令确认库已替换

    ldd ~/.vscode-server/bin/05047486b6df5eb8d44b2ecd70ea3bdf775fd937/node

    3.6 检查替换后能正常工作

    ~/.vscode-server/bin/05047486b6df5eb8d44b2ecd70ea3bdf775fd937/node ,不能报错

    3.7 屏蔽服务器端库检查

    touch /tmp/vscode-skip-server-requirements-check

    4. 重新连接 vscode
    vscode 每次更新版本后,服务端都要到对应目录下找到对应的 node 执行上面的步骤。
    这次下载的 glibc 和 glibcxx 版本都很高,可以存档供以后每次 vscode 更新版本时使用,老系统可以再顶几年。
    l4ever
        20
    l4ever  
       278 天前
    同样, 我的安卓固件编译机是 ubuntu14. 升级了几个库失败了, 强制安装了新版 deb 包
    系统直接干死了.
    无法登录了, 现在只要输入用户名就立即提示 login incorect, 无法输入密码

    已经重装了系统.
    litguy
        21
    litguy  
       277 天前
    @l4ever 有点没搞懂,大家死守那么老版本的 OS 是什么原因 ?
    lx0758
        22
    lx0758  
       277 天前
    @litguy 个人用户无所谓想升级就升级, 团队和公司想升级 OS 阻力可大了去了
    f1ynnv2
        23
    f1ynnv2  
       277 天前
    @litguy 我们有一套成熟产品的嵌入式开发环境,Ti 给的 SDK 只能跑在 ubuntu16.04 上
    pzs
        24
    pzs  
       276 天前
    pzs
        25
    pzs  
       276 天前
    @pzs #24 降级 vscode 版本最简单了
    l4ever
        26
    l4ever  
       275 天前
    @litguy 我这台机器是 android 编译的机器,老到 android5.1 ,新到 android11 。不敢轻易升级。

    不过这次系统坏了正好升级了一下。搞环境搞了一天。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1150 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:47 · PVG 02:47 · LAX 10:47 · JFK 13:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.