尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

无外网 Linux 服务器离线安装 VS Code Remote-SSH 指南(新版双包机制 + commit 一致)

无外网 Linux 服务器离线安装 VS Code Remote-SSH 指南(新版双包机制 + commit 一致) 点一下转到定义等三秒。打开个文件状态栏转圈半分钟。想用 clangd 让跳转又快又准结果它压根启动不了——因为你的 VS Code 在 Windows 上跑代码却在网络盘的另一头。这是我接手一台无外网 Linux 编译服务器时遇到的真实情况。解决办法大家都说得上来上 Remote-SSH。可真到装的时候网上一堆教程照着做连不上。卡在 Setting up SSH Host... 转半天最后报个错让你怀疑人生。折腾一圈才发现新版 VS Code 离线安装要下两个包不是一个。网上老教程只讲一个对新版根本无效。这篇文章就把这台离线服务器从卡到不能用到clangd 秒跳的完整过程拆开讲清楚包括为什么这么做、踩了哪些坑、怎么排查。你的代码跳转为什么慢到怀疑人生先看问题出在哪。我们这台 Linux 编译服务器没外网但 Windows 和它之间通过 SMB 把 Linux 的一个目录映射成了 F 盘。于是 VS Code 直接打开 F 盘里的工程看起来跟本地一样。问题在于VS Code 的 C/C 扩展是作为Windows 进程在跑的。它要读的那几千个源文件、头文件全在 F 盘后面那台 Linux 上。每一次文件读取都是一次跨网络的 IO。老的 Tag Parser 方案更惨。它要扫描工程里所有文件建符号索引几千个文件一个个读每个都走网络。你点个跳转它在后台疯狂读网络盘延迟就这么累积起来的。clangd 呢更直接。它根本跑不起来。clangd 是个 Linux 二进制需要 Linux 路径、Linux 工具链。你在 Windows 端装 clangd 扩展它找不到对应的二进制或者拿到了也跑不了。这里有个判断基线我后面会反复强调做代码索引的程序必须和被索引的文件在同一台机器上。跨网络盘做索引注定慢注定别扭。Remote-SSH 的本质把索引进程搬过去理解了上面这点Remote-SSH 的解法就很自然把索引进程搬过去代码不用动。Remote-SSH 不是远程桌面那种把整个界面投过来。它把活儿拆开UI 留在你的 Windows 上你熟悉的快捷键和插件都在真正干活的进程跑在 Linux 服务器上。这个干活的进程叫 vscode-server。连上之后clangd 扩展装在远端作为 Linux 进程跑直接读本地磁盘上的源文件、compile_commands.json、头文件零网络 IO。你点跳转clangd 在本地几毫秒就响应了结果传回 Windows 端渲染。为什么这比 Tag Parser 强Tag Parser 是全盘正则扫描扫一遍建个静态索引慢且不准宏、条件编译搞不定。clangd 基于 compile_commands.json每个文件用真实的编译参数去解析宏展开、头文件路径都是准的。一个是从目录里翻一个是照着编译命令精确读根本不是一个量级。所以 Remote-SSH 不是打补丁它从根上纠正了索引进程和文件分离这个错误架构。离线安装最大的坑新版要两个包到装的时候了。有外网的话啥都好说VS Code 首次连接会自动下载 server。可我们这台没外网自动下载必失败卡在 Setting up SSH Host... 直到超时。离线安装的思路是在 Windows 下载好包传到 Linux手动解压到位。但新版 VS Code1.102需要两个包缺一不可。这是整件事最容易踩的坑。两个包分别是server 包vscode-server-linux-x64.tar.gz解压到~/.vscode-server/cli/servers/Stable-commit/server/里面是 server 本体node out/ 扩展。CLI 包vscode-cli-linux-x64.tar.gz解压成~/.vscode-server/code-commit是连接入口二进制。为什么是两个新版把连接管理和语言服务解耦了。ssh 进来先执行的是 CLI 入口code-commitCLI 再去拉起 servercli/servers/Stable-commit/server/bin/code-server。CLI 管连接server 管干活。这里还有个路径演进的坑。旧版 VS Code大约 1.86 之前server 装在~/.vscode-server/bin/commit/新版改到了~/.vscode-server/cli/servers/Stable-commit/server/。网上很多老教程写的是bin/commit/对新版完全无效。判断你装的是新版还是旧版路径看~/.vscode-server/下有没有code-commit这个文件有就是新版路径。只装 server 不装 CLI 会怎样ssh 进来找不到code-commit入口VS Code 尝试自动下载 CLI但没外网连接失败。我就这么卡过对比一位同事的ps -ef | grep vscode-server进程才发现人家有code-commit入口而我没有。commit 号不是版本号且必须三处一致下载那两个包要用到 commit 号。注意commit 号不是版本号。版本号是1.102.1这种commit 号是一串 40 位十六进制 hash在 VS Code 的Help → About里能看到类似7adae6a56e34cb64d08899664b814cf620465925。下载地址是拿 commit 号拼的https://update.code.visualstudio.com/commit:commit号/server-linux-x64/stable https://update.code.visualstudio.com/commit:commit号/cli-linux-x64/stable关键是三处 commit 必须完全一致Windows 客户端的 commit、server 包的 commit、CLI 包的 commit。差一个字符VS Code 都认为你没装重新触发下载离线环境下就是连不上。这意味着每次 VS Code 升级commit 号会变两个包都要重新下载对应版本。这是离线维护的持续成本躲不掉。所以装之前一定先查准 commit别下错版本白忙活。完整安装十步走理清原理后操作其实不复杂十步Windows 装 Remote-SSH 扩展ms-vscode-remote.remote-sshHelp → About查 commit 号40 位浏览器下两个包分别重命名为vscode-server-linux-x64.tar.gz和vscode-cli-linux-x64.tar.gz通过 F 盘或任何内网传输把两个包传到 LinuxLinux 解压两个包到位server 到cli/servers/Stable-commit/server/CLI 到~/.vscode-server/code-commit配 SSH config 并连接装 clangd 扩展到远端验证代码跳转多工程共存编译之外的代码怎么看第 5 步是重点。解压用两个脚本setup_vscode_server.sh commit号把 server 包解压到新版路径验证node、bin/code-server、out/server-main.js齐全setup_vscode_cli.sh把 CLI 包解压出code二进制复制成~/.vscode-server/code-commit。两个脚本跑完再跑自检check_vscode_server.sh8 项全[OK]才能去连server 的 node、server-main.js、CLI 入口、clangd、.clangd、settings.json、compile_commands.json、SSH 服务。哪项 FAIL 脚本会直接给修复命令。SSH key 免密的四个坑配 SSH 连接本身不难但免密登录这里坑特别多一个个说。坑一VS Code 走 ssh.exe 是非交互的。你用 SecureCRT 连服务器没配 key 它会弹窗问你密码。VS Code Remote-SSH 调的是 Windows 自带的ssh.exe非交互模式没配 key 直接Permission denied不会弹窗。所以你以为密码能连啊到 VS Code 这就连不上。坑二配了 key 还得加两行配置。生成密钥ssh-keygen -t ed25519把公钥传到服务器的~/.ssh/authorized_keys这都好理解。但光这样不够VS Code 还会要密码。得在 SSH config 里加Host nordic-server HostName 服务器IP User 你的用户名 Port 22 IdentityFile C:\Users\你的用户名\.ssh\id_ed25519 IdentitiesOnly yesIdentitiesOnly yes强制只用你指定的这个 key避免 ssh-agent 里的其他 key 干扰。VS Code 走ssh.exe非交互没这两行会回退到要密码。坑三key 认证对权限敏感到变态。服务器端~/.ssh必须 700、authorized_keys必须 600、home 目录不能让 group/other 可写。权限不对SSH 会静默拒绝你的 key直接回退到密码认证你看着像key 没生效其实是权限问题。坑四验证免密必须用 config 别名。这是最隐蔽的坑。你想测免密通没通习惯性敲ssh 你的用户名服务器IP发现不问密码以为成功了。但 VS Code 还是连不上。原因是直连 IP 时ssh-agent 可能记住了你私钥的 passphrase帮你免密了。但 VS Code 走的是 config 别名 IdentitiesOnly不走 agentpassphrase 问题就暴露了。只有ssh nordic-server用别名不问任何东西才算真免密。如果别名还问 passphrase去掉它ssh-keygen -p -f $env:USERPROFILE\.ssh\id_ed25519输旧 passphrase新 passphrase 两次回车留空。clangd 装远端别装本地连上 SSH 后装 clangd 扩展。这里容易错——clangd 必须装在 SSH 远端不是本地。VS Code 的扩展面板分两栏LOCAL本地 Windows和 SSH: nordic-server远端 Linux。在 clangd 扩展卡片上要点 Install in SSH: nordic-server。如果只装到 LOCALclangd 作为 Windows 进程跑又回到网络盘问题了。clangd 精确跳转的基石是compile_commands.json。这个文件记录了每个源文件真实的编译参数包含路径、宏定义全在里面。clangd 拿到它每个文件都按真实编译命令解析宏和头文件路径都是准的。没有它clangd 只能 fallback 用默认参数猜简单符号能跳复杂的一跳一个不准。这里还有个版本坑。我在settings.json的clangd.arguments里配了--cache-dir...结果 clangd 启动直接退出Output 里报Server process exited with code 1。折腾半天才发现clangd 18 根本没有--cache-dir这个参数--background-index-cache-dir也没有。手动跑/usr/bin/clangd 参数 --checkxxx.cstderr 会打印Unknown command line argument --cache-dir...。删掉就好了--background-index自带索引持久化clangd 自己管存储位置。教训clangd 不同版本支持的参数不一样配clangd.arguments前用clangd --help确认参数存在。远端装的 clangd 扩展版本比如 0.6.0倒不影响跳转能力它只是个前端真正干活的是/usr/bin/clangd那个二进制。如果远端装 clangd 扩展也因网络失败走 VSIX 离线Windows 浏览器从扩展市场下载.vsix传到 LinuxVS Code 里Install from VSIX。连不上按这五层逐层排查装完连不上别盲目重试。按这个顺序逐层定位每层通了再查下一层第 1 层 网络层Windows PowerShell 跑ssh 你的用户名服务器IP echo OK。打印 OK 就通进下一层。超时是网络/防火墙拒绝是 SSH 服务没开。第 2 层 SSH 认证层跑ssh nordic-server echo OK用别名。打印 OK 进下一层Permission denied是认证问题回去查 keyCould not resolve hostname是 config 没配对。注意区分ssh userIP能连但ssh nordic-server不行是 config 问题两个都不行是认证/网络问题。第 3 层 server 安装层Linux 端跑check_vscode_server.sh应全[OK]。最常见 FAIL 是 CLI 入口那项说明没装 CLI 包。手动验证 server 能否启动~/.vscode-server/cli/servers/Stable-$COMMIT/server/node ~/.vscode-server/cli/servers/Stable-$COMMIT/server/out/server-main.js --version打印版本号就正常。再确认三处 commit 完全一致。第 4 层 VS Code 状态层前三层都通还连不上通常是 VS Code 缓存了失败状态。F1 → Remote-SSH: Kill VS Code Server on Host再Developer: Reload Window重新连。远端可清残留pkill -f vscode-server、清 logs 和 lock 文件但别删cli/servers/和code-commit那是安装包。第 5 层 clangd 层连上了但跳转不对看这层。打开.c文件View → Output选 clangd 通道看日志。clangd version 18.1.3Loaded compilation database from ...就是正常的。有个实战定位手段很管用如果同事用同版本 VS Code 在同台服务器连上了对比他的~/.vscode-server/路径结构ps -ef | grep vscode-server看他的进程命令行照抄路径。我这次排查就是靠对比同事进程发现新版路径变了、需要 CLI 包的。编译之外的代码怎么看clangd 有个局限得说清楚只有编译进镜像的文件才有精确跳转。没在 compile_commands.json 里的文件clangd 没有编译参数跳转会失败或不准。哪些算编译之外prj.conf里CONFIG_XXXn的源文件、其他工程的代码、SDK 里没选用的驱动、samples 和 tests 目录。这些 clangd 都管不了。对策按推荐顺序第一用 CodeGraph如果有的话它索引整个工作区所有符号不依赖 compile_commands没编译的代码也能查几秒出结果补上 clangd 的短板。第二VS Code 全局文本搜索CtrlShiftF兜底不精确同名混但能定位文件再人工判断。第三把要看的文件纳入编译——Zephyr/NCS 在prj.conf开CONFIG_XXXy重新 buildCMake 在 CMakeLists 加源文件重新 cmake一劳永逸。第四少数文件用compile_flags.txt每行一个参数放文件所在目录。第五clangd fallback 模式自动启用但别指望它准。日常跳转用 clangd编译内的秒跳。跨工程或编译外的代码用 CodeGraph 或全局搜索。长期要看的模块开配置重新 build 纳入 clangd。六条真实踩坑记录这次安装实际遇到的问题供你排查时参考只装 server 没装 CLI→ 连接失败。根因新版需要cli-linux-x64单独的包作 ssh 入口。定位对比同事进程发现他有code-commit而我没有。server 装在旧路径bin/commit/→ VS Code 找不到。根因新版路径改到cli/servers/Stable-commit/server/。定位看同事进程命令行里的路径照抄。server 入口文件名变了→ 老脚本找bin/code-server-oss找不到。根因新版叫bin/code-server无 -oss。不影响 VS Code它按 product.json 找但自检脚本要适配。SecureCRT 能连但 VS Code 不能→ 排除网络/认证锁定 VS Code 自身。定位PowerShell 跑ssh 你的用户名服务器IP echo OK直接打印 OK说明 Windows 的 ssh.exe 没问题问题在 server 安装层。本机自连报 Permission denied→ 误判为认证问题。实际是本机没密码不代表服务器拒绝你。教训诊断命令要在客户端Windows跑不是在服务器本机跑。clangdServer process exited with code 1→ clangd 启动失败。根因clangd.arguments配了--cache-dir但 clangd 18 没这参数启动直接退出。定位手动跑/usr/bin/clangd 参数 --checkxxx.cstderr 打印Unknown command line argument。解决删掉--cache-dir。升级维护VS Code 升级后 commit 号变需重新走下载两包、解压的流程。旧 commit 目录可删rm -rf ~/.vscode-server/cli/servers/Stable-旧commit和rm -f ~/.vscode-server/code-旧commit。改了prj.conf后跳转变不准重新 build 生成新的compile_commands.jsonclangd 自动重载.clangd里配了Index.Background: Build。回到开头那个判断基线索引进程必须和文件同机。Remote-SSH 就是把这条原则在离线环境里落地。离线环境下真正的难点是新版那两个包、commit 三处一致、SSH key 的四个坑。这些理清了clangd 秒跳不难。你离线服务器上还在用网络盘硬扛代码跳转吗或者装 Remote-SSH 卡在哪一步了评论区说说有用的话点个在看让更多被网络盘折磨的工程师看到。标签VS Code · Remote-SSH · 离线安装 · clangd · 嵌入式开发
返回列表