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

复活 CentOS 7 的 VSCode Remote - SSH

  •  2
     
  •   mikewang ·
    MikeWang000000 · 19 天前 · 2266 次点击

    vscode-server-centos7

    GitHub:
    https://github.com/MikeWang000000/vscode-server-centos7

    简介

    从 VSCode v1.99 版本开始,SSH 插件将无法在 RHEL/CentOS 7 上运行,因为它们的 glibc 、libstdc++ 已不再满足最新版本的最低要求。

    使用以下步骤即可复活:

    1. 进入 Releases 页面,下载对应的版本的压缩包,放到服务器上;

    2. 在服务器上登录你的帐户,执行以下命令:

      mkdir -p ~/.vscode-server
      tar xzf vscode-server_*.tar.gz -C ~/.vscode-server --strip-components 1
      ~/.vscode-server/code-latest --patch-now
      
    3. 使用 SSH 插件连接服务器,完成。

    特点

    1. 此 repo 使用最新版本的 glibc 、libstdc++ 编译放至 ~/.vscode-server/gnu 目录下,并修改 VSCode Server 相关 ELF 的 .interp 节,做到不升级/修改系统库,仅对 VSCode 相关二进制文件生效。

    2. 在 SSH 上远程安装的插件也会被自动链接至最新的 glibc 、libstdc++。

    升级 VSCode

    如果升级了 VSCode 版本,需要重新到 GitHub 上下载对应的版本,然后手动安装 Server 端,替换掉官方的版本。

    补充说明

    CentOS 7 是一个很旧的 Linux 发行版了,升级到最新版本的操作系统始终是最推荐的。

    然而,某些特定的场景下我们仍需使用 CentOS 7 进行开发,例如客户提出的旧版本 Linux 兼容性要求,或者基于 CentOS 7 兼容的信创系统适配等等。

    此 repo 目标在于临时解决这类问题,不过我还是希望大家都能快快升级吧。

    16 条回复    2025-04-30 19:57:38 +08:00
    nagisaushio
        1
    nagisaushio  
       19 天前 via Android
    我之前写了个更方便的,只要提供 glibc 和 patchelf 即可,不用自己魔改

    https://github.com/hsfzxjy/vscode-remote-glibc-patch
    ysc3839
        2
    ysc3839  
       19 天前
    @nagisaushio 我自己的方案是从 CentOS 8 的源下载新版 glibc 包,从 patchelf GitHub release 下载最新的预编译包,解压到 /opt 下面,然后设置 vscode 的那三个环境变量。
    hanxiV2EX
        3
    hanxiV2EX  
       19 天前 via Android   ❤️ 1
    我的方法是用 docker ,用 docker 启动一个最新的 ubuntu ,里面装好 ssh ,把 dot 目录都挂载进去,什么版本都没问题了。。。
    nagisaushio
        4
    nagisaushio  
       19 天前 via Android
    @ysc3839 CentOS 8 那个我试过好像报了 kernel too old ,索性自己编译了
    mikewang
        5
    mikewang  
    OP
       19 天前   ❤️ 1
    @nagisaushio #1

    其实原先我也是直接 patchelf 的,但是插件会有些问题。

    比如 C/C++ 这个插件,就算 SSH 插件能正常用了,但它还是没法启动 gdb 调试,因为插件里 OpenDebugAD7 这个二进制也需要最新的 glibc 。https://github.com/microsoft/vscode-cpptools/issues/13219

    所以这个还做了额外的工作,使用 inotify 监控 extensions.json ,检测到安装新插件时,自动给插件打补丁。然后还判断是否为 glibc 的二进制,排除使用 musl 的二进制(有些还是 musl 动态链接的)。
    mikewang
        6
    mikewang  
    OP
       19 天前
    @hanxiV2EX #3 因为我写 C 和 C++,还是需要旧 glibc 编译的,所以 docker 这条路就行不通了🤦‍♂️
    nagisaushio
        7
    nagisaushio  
       19 天前 via Android
    @mikewang #5 可以可以,这个没想到
    ysc3839
        8
    ysc3839  
       19 天前
    @nagisaushio 要求 glibc >= 2.28 ,CentOS 8 刚好就是 2.28 。
    @mikewang 我目前在 CentOS 7 docker 里面开发 C++,似乎没遇到什么错误。
    tt0411
        9
    tt0411  
       19 天前
    tt0411
        10
    tt0411  
       19 天前
    @hanxiV2EX 暴露 docker 容器里面的 ssh 端口给本机的 vscode 吗?
    hanxiV2EX
        11
    hanxiV2EX  
       19 天前
    @tt0411 是的,比如暴露 2222 端口,然后.ssh 目录和.vscode-server 目录都映射进去,都能复用的。
    mikewang
        12
    mikewang  
    OP
       19 天前
    @tt0411 #9 是的,我这里就是简化了所有步骤:

    - 将 patchelf 做成了 libpatchelf 静态编译进去 (libpatchelf/libpatchelf.h)
    - 自带编译好的 glibc 和 libstdc++
    - 修改了 glibc ,将系统目录改为当前目录,这样改 .interp 就行了,不用再改 rpath 。事实上这么做也更安全。(patches/glibc.patch)

    然后加上了额外的功能,就是自动处理插件。官方的方案只能让 server 能用,实测很多 native 插件还是不行的。

    做的就是一个开箱即用,不用配参数。
    tlanyan
        13
    tlanyan  
       19 天前
    印象中从 1.93 版本,server 端就不支持 CentOS 7 了
    ysc3839
        14
    ysc3839  
       9 天前 via Android
    连接远程机子 Docker 内的 CentOS 7 会报错
    [4945 ms] Command failed: /root/.vscode-server/bin/17baf841131aa23349f217ca7c570c76ee87b957/bin/code-server --log debug --force-disable-user-env --server-data-dir /root/.vscode-server --telemetry-level all --accept-server-license-terms --host 127.0.0.1 --port 0 --connection-token-file /root/.vscode-server/data/Machine/.connection-token-17baf841131aa23349f217ca7c570c76ee87b957 --extensions-download-dir /root/.vscode-server/extensionsCache --start-server --skip-requirements-check
    [4945 ms] /root/.vscode-server/bin/17baf841131aa23349f217ca7c570c76ee87b957/node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by /root/.vscode-server/bin/17baf841131aa23349f217ca7c570c76ee87b957/node)
    似乎是没修改 node ?能否修复一下?
    mikewang
        15
    mikewang  
    OP
       9 天前
    @ysc3839 #14
    不应该,可以重新执行一下:
    ~/.vscode-server/code-latest --patch-now

    上面会显示被修改的文件。比对一下就知道了。

    也可以确认下 VSCode 客户端和服务端的版本号是否匹配:
    ~/.vscode-server/code-latest --version

    不同版本的 server 路径不一样。
    ysc3839
        16
    ysc3839  
       9 天前 via Android
    @mikewang 执行过很多次了,印象中修改的文件没有 node 。客户端版本是 1.99.3 。晚点我重现一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2261 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 16:10 · PVG 00:10 · LAX 09:10 · JFK 12:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.