复活 CentOS 7 的 VSCode Remote - SSH

155 天前
 mikewang

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 目标在于临时解决这类问题,不过我还是希望大家都能快快升级吧。

3767 次点击
所在节点    Visual Studio Code
16 条回复
nagisaushio
155 天前
我之前写了个更方便的,只要提供 glibc 和 patchelf 即可,不用自己魔改

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

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

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

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

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

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

做的就是一个开箱即用,不用配参数。
tlanyan
155 天前
印象中从 1.93 版本,server 端就不支持 CentOS 7 了
ysc3839
145 天前
连接远程机子 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
145 天前
@ysc3839 #14
不应该,可以重新执行一下:
~/.vscode-server/code-latest --patch-now

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

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

不同版本的 server 路径不一样。
ysc3839
145 天前
@mikewang 执行过很多次了,印象中修改的文件没有 node 。客户端版本是 1.99.3 。晚点我重现一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1126786

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX