ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

VS Code Remote-SSH连接昇腾服务器卡住?vscode-server部署排查全解

VS Code Remote-SSH连接昇腾服务器卡住?vscode-server部署排查全解 老伙计们又是我。最近手头拿到一批昇腾AI服务器系统跑的是openEuler 24.03 LTS环境都配好了结果在VS Code这步卡得我头皮发麻——远程SSH一连上状态栏就开始转圈一直卡在“Setting up SSH Host xxxx: Copying VS Code Server to host”然后过几分钟报错退出。这问题在昇腾这种aarch64架构的服务器上出现概率极高而且坑位千奇百怪。这篇文章把我整个排查过程、背后的原理、可用方案全盘托出遇到类似问题的朋友可以少走不少弯路。先把这个现象说清楚VS Code Remote-SSH连上服务器后需要在远程端部署一个与本地VS Code版本严格对应的服务端组件官方叫VS Code Server新版叫vscode-server。这一步要下载、解压、启动服务任何一个环节出问题都会卡在“Copying VS Code Server”这个提示上。尤其是openEuler昇腾环境服务器通常在内网、外网受限、还是arm64架构踩中这个坑的概率几乎是100%。如果你是第一次用VS Code连昇腾服务器或者公司/学校的服务器是openEuler系统这篇文章基本就是为你写的过程复盘。如果你已经折腾过几次没解决里面也有几个能直接抄作业的方案。1. 先把Remote-SSH的工作机制搞明白再动手很多朋友卡住之后第一反应是“是不是我这个SSH配置有问题”“是不是防火墙问题”其实方向就偏了。先搞清楚VS Code Remote-SSH从连接成功到窗口打开中间一共干了哪几件事才能真正定位卡点。1.1 Remote-SSH连接后的完整流程拆解从你点击连接按钮开始VS Code实际上执行了这么一个链条通过本地的ssh命令连接到远程服务器这一步用的是你本机的SSH配置。在远程端执行一段初始化脚本检测系统类型、架构、是否已有VS Code Server、版本是否匹配。如果远端没有对应commit的server就会进入“Setting up SSH Host xxxx: Copying VS Code Server to host”阶段。在这个阶段VS Code通过SSH通道执行远程下载命令从微软官方地址update.code.visualstudio.com拉取对应commit、对应架构的server压缩包。压缩包拉下来之后解压到用户目录的~/.vscode-server/bin/commit_id/下。最后启动server进程本地和远端建立WebSocket通信通道窗口才真正打开。注意第4步下载动作是发生在远程服务器上的不是本地下载再传过去。也就是说下载速度取决于远程服务器访问外网的速度。这是绝大多数人卡住的核心原因——昇腾服务器在机房内网访问微软下载站极慢甚至超时。1.2 “Copying VS Code Server”到底在Copy什么这一步的完整含义其实是把VS Code Server二进制包搞到远程服务器上。VS Code Server本质上是一个Node.js捆绑包里面带了一整套和本地IDE对接的进程负责文件读写、终端、语言服务等。因为每个VS Code版本的commit id不同server版本必须严格对应否则远程端会拒绝启动。在旧版本里VS Code确实会把server压缩包从本地scp到远程所以叫“Copying”。但在新版1.60之后中默认行为变成了远程直连下载。这就是为什么很多老教程说“把本地下载好的server传到远端就行”现在反而不好使了——因为VS Code每次都会先检查commit id版本对不上就直接重下。1.3 为什么昇腾openEuler环境特别容易卡在这总结下来就三个原因每个都是硬伤第一昇腾服务器是aarch64ARM64架构VS Code Server对应的包是server-linux-arm64。这个包本身比x64的略大加上下载服务器对ARM包的托管路径偶尔会有问题下载成功率更低。第二昇腾服务器绝大多数部署在智算中心、私有云机房网络策略很严。很多情况下连外网都要走代理甚至根本没有外网权限。而VS Code默认从微软官方域名下载不配置代理基本下不动。第三openEuler系统默认安装的组件非常精简。我遇到过好几台机器连tar都有但wget、curl缺失的情况。下载工具都没有VS Code的远程脚本自然卡死。理解这三点之后后面所有排查和解决方案就都有理有据了。2. 十分钟定位问题到底出在链路哪一段不废话直接进入排查流程。整个过程建议按顺序做不要跳步。每台机器情况不同但排查思路是通用的。2.1 先确认本地VS Code版本和远程架构这步是地基很多人忽略。先看本地VS Code版本和commit idcode --version输出第一行是版本号第二行就是commit id比如92d5e1bedffd2c4d4a7c1f6f7b8d9a2a6e7f3c56这种。这个commit id非常重要后面所有手动安装方案都靠它。把它记下来。再看远程架构uname -m昇腾服务器输出通常是aarch64。如果是x86_64那说明不是昇腾架构但排查流程一样适用只是包名不同。版本和架构不匹配是导致“下载了server但启动失败”的常见隐藏原因。这一步先确认好后面就不用反复折腾。2.2 检查远程服务器的基础环境SSH登录到远程openEuler服务器执行以下几组命令which curl wget tar gzip如果curl或wget缺失那就别急着折腾VS Code了——VS Code的远程下载脚本依赖这些工具缺了必卡。openEuler用dnf装一下sudo dnf install -y curl wget tar gzip然后检查磁盘空间df -h ~ df -h /tmpVS Code Server安装包大约100MB左右解压后接近200MB加上~/.vscode-server目录本身建议确保用户目录和/tmp目录都有至少500MB以上空闲空间。再检查一下已有的server目录ls -la ~/.vscode-server/bin/ 2/dev/null || echo 目录不存在如果这个目录里已经存在某些残留文件而且commit id和本地不匹配也会导致VS Code反复尝试下载。这种情况建议直接清空rm -rf ~/.vscode-server注意清空之后你的远程扩展和用户配置也会没但这是最干净的起点。后面可以重新安装。2.3 网络连通性测试远程能不能访问微软下载源这是最关键的测试。在远程服务器上执行curl -I --connect-timeout 5 https://update.code.visualstudio.com如果超时或者curl退出码非0说明远程服务器无法访问微软下载地址。再看下具体能不能解析到域名nslookup update.code.visualstudio.com如果DNS都解析不了那就是网络策略层面彻底封了外网。如果解析正常但连接超时大概率是防火墙拦截了HTTPS流量。还有一种情况能提示更多信息直接试一下完整下载地址curl -I -L --connect-timeout 10 https://update.code.visualstudio.com/api/commits/你的commit_id/server-linux-arm64/stable如果这个地址返回403或超时那下载源确实访问不了。如果返回200说明网络通卡住的原因可能是下载速度太慢导致VS Code内部超时。2.4 从VS Code日志里找真的报错信息光看状态栏转圈不够要把日志翻出来看。在VS Code里按CtrlShiftU打开输出面板右上角下拉选择“Remote - SSH”或者“Extension Host”拉到最底部能看到具体的下载日志。日志里常见的几种报错Downloading VS Code Server failed: Error: getaddrinfo ENOTFOUND update.code.visualstudio.com说明远程DNS解析不了。Error: connect ETIMEDOUT 23.x.x.x:443说明连接超时被网络策略拦了。Error: failed to fetch VS Code Server: 内部错误这种就有点笼统了还得结合网络测试结果判断。还有一个位置可以看远程服务器上执行cat ~/.vscode-server/.logs/*/*.log 2/dev/null | tail -50VS Code的远程日志也会写到这个位置。很多时候远程日志比本地输出面板更详细。3. 五个可直接复用的解决方案网络测试做完你基本知道自己属于哪种情况了。下面五个方案按优先级排好从最省事到最保险挑一个适合你的执行。3.1 方案一改一下设置让本地先下载再传上去适用场景本地电脑能正常访问外网远程服务器不能或远程下载极慢。这个方法最简单改一个配置就行。在本地VS Code的settings.json里加一行{ remote.SSH.allowLocalServerDownload: true }改了之后重启VS Code重新连接。这时候VS Code会先在本地下载好对应commit的server压缩包然后通过SCP通道传到远程服务器再解压部署。实测下来这个方法在“本地能访问外网、远程不能”的场景下非常管用。需要注意的是本地下载路径默认是~/.vscode-server/bin目录第一次下载会花点时间但之后的版本更新只需要下载增量部分速度会快很多。另外这个方案不要求修改远程服务器的任何配置也不需要防火墙放行额外端口——因为所有流量都走SSH通道这点在受限网络里尤其舒服。3.2 方案二完全手动操作在远程手工放好VS Code Server适用场景远程完全无法访问外网且不想走本地中转或者你想彻底搞清楚server是怎么部署的。这个方案其实不难就四步。先在本地确认commit id然后把server压缩包下载到远程放到正确位置。第一步在本地执行code --version记下第二行的commit id比如92d5e1be...。第二步下载对应架构的server包。如果本地能访问外网直接在本地下载wget https://update.code.visualstudio.com/api/commits/92d5e1be/server-linux-arm64/stable -O vscode-server-linux-arm64.tar.gz注意这里架构参数昇腾用arm64普通x86服务器用x64。如果本地也不能访问外网那就得找一台能访问外网的机器下载或者走公司镜像。第三步把压缩包传到远程服务器scp vscode-server-linux-arm64.tar.gz youruseryour-server:/tmp/第四步SSH登录远程服务器在用户目录下建好目标位置并解压mkdir -p ~/.vscode-server/bin/92d5e1be cd /tmp tar -xzf vscode-server-linux-arm64.tar.gz -C ~/.vscode-server/bin/92d5e1be --strip-components1关于--strip-components1有必要说明一下server压缩包解压出来的顶层目录叫vscode-server-linux-arm64如果不用这个参数会把所有文件放到bin/92d5e1be/vscode-server-linux-arm64/下面VS Code找不到照样报错。这个是很多人手动安装失败的头号原因。最后重新连一下VS Code正常就直接进入了。3.3 方案三利用VS Code的下载源模板设置指向内网镜像适用场景公司或学校有内网镜像源可以把VS Code Server包放到自己可控的HTTP服务器上。VS Code新版提供了一个设置项remote.SSH.serverDownloadUrlTemplate允许你自定义下载地址模板。在settings.json里配置{ remote.SSH.serverDownloadUrlTemplate: http://your-company-mirror.com/vscode-server/${commit_id}/server-linux-${arch}/${quality} }模板里的占位符含义${commit_id}自动替换为当前VS Code的commit id${arch}自动替换为远程架构x64或arm64${quality}替换为stable或insider这个方案的好处是一劳永逸多人多机器都走内网镜像速度极快不依赖外网。缺点是前期需要你有一个内部HTTP服务并且每次VS Code更新版本都得把对应commit的包同步到镜像服务器上。具体同步方式可以写个定时脚本拉取官方包存到Nginx目录下但这属于运维层面的事了。如果你就一台机器其实方案二更直接。3.4 方案四给openEuler配好代理环境变量适用场景远程服务器能通过公司/学校的HTTP代理访问外网只是默认没配置代理。很多智算中心虽然管理严格但会给计算节点配一个统一的HTTP代理出口。如果你知道代理地址直接SSH登录远程编辑~/.bashrcexport HTTP_PROXYhttp://proxy.example.com:8080 export HTTPS_PROXYhttp://proxy.example.com:8080或者临时对当前会话生效export HTTPS_PROXYhttp://proxy.example.com:8080然后重新执行source ~/.bashrc再重新连接VS Code。这样远程下载server包时curl/wget会走代理速度就起来了。有个坑要提醒有些VS Code远程脚本是用node而不是curl来下载的如果node不读shell的环境变量光设置~/.bashrc可能无效。这时候可以设置VS Code本地的代理配置在settings.json里{ http.proxy: http://proxy.example.com:8080, http.proxyStrictSSL: false }但这两个配置不一定能穿透到远程下载过程。更保险的方式是把代理配置写到远程/etc/environment或/etc/profile.d/proxy.shsudo tee /etc/profile.d/proxy.sh EOF export HTTP_PROXYhttp://proxy.example.com:8080 export HTTPS_PROXYhttp://proxy.example.com:8080 EOF这样任何登录会话都会带代理覆盖更彻底。3.5 方案五彻底离线环境的一键部署思路适用场景远程完全物理隔离外网和代理都没有就是纯内网。这种情况下方案二其实就够用但如果你想省事一点可以写一个简单脚本把整个部署过程固化下来。在本地把server包准备好后写一个deploy脚本#!/bin/bash COMMIT_ID$1 ARCH$2 mkdir -p ~/.vscode-server/bin/$COMMIT_ID tar -xzf /tmp/vscode-server-linux-$ARCH.tar.gz -C ~/.vscode-server/bin/$COMMIT_ID --strip-components1 touch ~/.vscode-server/bin/$COMMIT_ID/0 echo deploy done传输时连脚本带包一起scp过去scp vscode-server-linux-arm64.tar.gz youruserserver:/tmp/ scp deploy.sh youruserserver:/tmp/然后在远程执行chmod x /tmp/deploy.sh /tmp/deploy.sh 92d5e1be arm64脚本最后touch ~/.vscode-server/bin/$COMMIT_ID/0这个动作也值得说下VS Code会在server目录下创建一个标记文件来记录安装状态有些版本缺失这个标记会以为没装好。提前touch目录下叫0的文件能避免很多诡异问题。4. 踩坑实录与避坑指南这几个坑是我在openEuler昇腾环境反复撞出来的全写出来希望能给你省点时间。4.1 架构选错arm64和x64搞混昇腾服务器是aarch64架构但很多教程一搜都是x64服务器的操作步骤下载的是server-linux-x64.tar.gz。你放到远程之后VS Code检查到架构不匹配会直接把整个bin目录删掉重新下载然后再次卡死。确认架构的命令很简单远程执行uname -m输出aarch64就代表arm64。记住这点不要再拿x64的包硬传。4.2 ~/.vscode-server/bin目录残留导致版本混乱这个坑特别隐蔽。如果你之前用不同版本VS Code连过这一台服务器~/.vscode-server/bin下可能残留很多历史commit的目录。VS Code会根据本地版本找对应commit找不到就下载。但如果目录里有一个commit id接近但不完全一致的残留目录VS Code可能判断失误启动一个旧的server进程表现就是反复卡顿、窗口打不开。处理方法很简单把整个目录清掉重来rm -rf ~/.vscode-server首次连接是慢一点但保证干净。这个做法在我实际运维中用过至少五次次次有效。4.3 openEuler系统基础工具缺失openEuler 24.03 LTS的精简安装默认不带wget有时候连curl都没有。而VS Code远程脚本在下载时优先用curl没有就wget再没有就直接报错。整个表现就是转圈半小时然后失败日志里只有一句Failed to find curl or wget。解决方式很简单登录远程后先把工具补齐sudo dnf install -y curl wget tar gzip建议后面还有这些也一起装上省得其他地方又缺sudo dnf install -y ca-certificates openssl4.4 /tmp目录空间不足导致的死循环VS Code远程下载server时会先把压缩包下载到/tmp再解压。有些昇腾服务器/tmp挂载分区非常小比如只有200MB而server包加解压后需要300MB以上空间就会下载失败然后VS Code误判为网络问题反复重试。判断方法df -h /tmp如果确实空间小可以手动配置VS Code使用其他临时目录。但更简单的是在远程执行sudo mkdir -p /opt/vscode-tmp sudo chmod 1777 /opt/vscode-tmp然后设置环境变量export TMPDIR/opt/vscode-tmp记得写进~/.bashrc让它持久化。4.5 SELinux和权限问题导致server无法启动openEuler默认可能开启了SELinux如果server目录权限不对进程会被SELinux拦截。表现是server下载没问题解压也没问题但启动后连接报错日志里出现Permission denied或者SELinux相关提示。快速验证方式查看SELinux状态getenforce如果是Enforcing而你又没有精力去配策略临时切到Permissive模式试试sudo setenforce 0注意这只是临时措施重启后会恢复。长期使用建议正确配置文件上下文而不是关掉SELinux。权限方面还有一个容易踩的点如果~/.vscode-server目录的 owner 不是当前用户也会报权限问题。检查一下ls -ld ~/.vscode-server如果不是自己用chown -R改回来。写在最后我实际踩过一遍之后最大的体会是这个问题90%的情况不是VS Code的Bug而是网络链路问题。不管卡多久先按第2章的步骤把日志翻出来看比盲目重启、清缓存有效得多。而且昇腾环境基本都是内网限制外网优先尝试remote.SSH.allowLocalServerDownload这个方案零成本改动最小成功率却最高。手动安装方案虽然看起来费事但它能让你彻底理解VS Code Server的部署机制一旦学会了以后不管什么架构、什么系统都能快速搞定。我后来帮同事处理类似问题基本都是照着第3.2节的步骤五分钟搞定。最后再分享一个小技巧如果你经常要连多台昇腾服务器第一台手动部署好之后把~/.vscode-server目录整体打包传到其他机器解压能省去每台机器重复下载的麻烦。前提是所有机器的系统架构一致用户路径一致。这个方法我在批量部署时用得非常顺手推荐试试。
返回列表