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

97 天前
 LGA1150

更新完成后,原来好好的 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 吗?

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

https://github.com/microsoft/vscode/releases
exch4nge
96 天前
正好昨天遇到了,简要说就是装 musl ,装 glibc ,再用 patchelf 解决了
Chipmunker
96 天前
@exch4nge 用 patchelf 修改哪个软件的 rpath ?是 code-server 自带的 node 麽?
Sonui
96 天前
f1ynnv2
96 天前
@exch4nge 能否请写个详细说明,感谢。
f1ynnv2
96 天前
试了一下 macOS 下可以下载个最后的 1.85.2 版本,放在某个目录继续使用。只要不追求在 LaunchPad 里同时有两个图标同时出现,其实不需要任何修改。
exch4nge
96 天前
@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
96 天前
@f1ynnv2 重新试了一下,这个方法不可行。另一个新版本的 vscode 更新插件后,会影响 1.85.2 的插件导致 remote-ssh 不可用。
f1ynnv2
96 天前
@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
96 天前
如果其他人也有这需求,参考下面完整的步骤吧:


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
96 天前
同样, 我的安卓固件编译机是 ubuntu14. 升级了几个库失败了, 强制安装了新版 deb 包
系统直接干死了.
无法登录了, 现在只要输入用户名就立即提示 login incorect, 无法输入密码

已经重装了系统.

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

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

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

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

© 2021 V2EX