在psn上使用VSCode Remote
-
2020.9.6: 现在VSCode没法直接下载Server了,应该是微软的服务端bug,更新解决方案
在本地的POSIX环境(例如ArchLinux,CentOS,Ubuntu等真正的Linux或者WSL,VBox等虚假的Linux或者MSYS2,Cygwin,git bash等POSIX on Windows方案)下直接使用如下脚本安装:if [ $# -lt 1 -o x$1 == x"-h" ]; then echo code-install-server.sh 用户名@主机 [-cpptools [cpptools文件名]] echo 例如: code-install-server.sh 用户名@主机 -cpptools echo 或: code-install-server.sh user@address -cpptools cpptools-linux.vsix echo 如果指定了-cpptools,则尝试同时安装C/C++插件 echo 如果对-cpptools指定了文件名,则使用对应文件,否则尝试从GitHub获取最新的C/C++插件 exit 1 fi #set -x function die { echo $1;exit 1; } TARGET=$1 if [ x$2 == x"-cpptools" ]; then CPPTOOLS=yes if [ -n "$3" ]; then CPPTOOLSFILE=$3 fi fi PORT=22 ARCH=x64 VERSION=$(code --version | awk '{if (NR==2) print}' || die "无法获取本地vscode版本") #如果bash环境不能访问code,请获取code的版本后直接把这行改成类似VERSION=e7d7e9a9348e6a8cc8c03f877d39cb72e5dfb1ff(code的commit id,可以在“帮助-关于”或者“Help-About”中查看) PATCHELF_REMOTE=/usr/sw-cluster/apps/Anaconda/anaconda3/bin/patchelf RPATH_REMOTE=/usr/sw-cluster/apps/lib/glibc-2.17/lib64/:/usr/sw-cluster/apps/Anaconda/anaconda3/lib/ INTERPRETER_REMOTE=/usr/sw-cluster/apps/lib/glibc-2.17/lib64/ld-linux-x86-64.so.2 SSH_SUCCESS=$(ssh -oPasswordAuthentication=no $TARGET echo success) if [ x$SSH_SUCCESS != x"success" ]; then echo "无法完成对$TARGET的免密连接,向远程服务器安装公钥免密登录吗?(y/n)" read yes if [ x$yes != x"y" ]; then die "此配置脚本要求免密登录" fi echo "安装公钥" ssh-copy-id $TARGET fi echo "下载vscode-server..." curl -L -C - "https://vscode.cdn.azure.cn/stable/$VERSION/vscode-server-linux-$ARCH.tar.gz" -o $VERSION-$ARCH.tar.gz || die "下载vscode-server失败" echo "Querying lastest cpptools release.." if [ x$CPPTOOLS == x"yes" -a -z $CPPTOOLSFILE ]; then echo "查询C/C++插件版本" CPPTOOLSVER=$(curl "https://github.com/microsoft/vscode-cpptools/releases/latest" | grep -o -E "tag/[^\"]+" | grep -o -E "[0-9.]+" || die "查询版本失败") echo "C/C++插件版本为$CPPTOOLSVER" echo "下载cpptools-$CPPTOOLSVER..." curl -L https://github.com/microsoft/vscode-cpptools/releases/download/$CPPTOOLSVER/cpptools-linux.vsix -o cpptools-linux-$CPPTOOLSVER.zip || die "无法下载C/C++插件" CPPTOOLSFILE=cpptools-linux-$CPPTOOLSVER.zip fi if [ -e $VERSION ]; then rm -rf $VERSION fi mkdir $VERSION echo "解压vscode-server..." tar zxf $VERSION-$ARCH.tar.gz --strip-components=1 -C $VERSION if [ x$CPPTOOLS == x"yes" ]; then echo "组合$CPPTOOLSFILE和server..." unzip -qo $CPPTOOLSFILE "extension/*" -d $VERSION/extensions/ mv $VERSION/extensions/extension $VERSION/extensions/ms-vscode.cpptools fi echo "检查远程服务器的目录" ssh $TARGET sh <<EOF if [ ! -e .vscode-server/bin ]; then echo "创建.vscode-server/bin" mkdir -p .vscode-server/bin else echo ".vscode-server/bin已存在" if [ -e .vscode-server/bin/$VERSION ]; then echo "移除莫名其妙存在的server" rm -rf .vscode-server/bin/$VERSION fi fi EOF echo "向远程服务器传输vscode-server..." tar czf - $VERSION --checkpoint=.100 | ssh $TARGET tar zxf - -C .vscode-server/bin/ ssh $TARGET sh <<EOF echo "修复Glibc依赖..." cd .vscode-server/bin/$VERSION set -x $PATCHELF_REMOTE --set-rpath $RPATH_REMOTE --set-interpreter $INTERPRETER_REMOTE ./extensions/ms-vscode.cpptools/LLVM/bin/clang-format $PATCHELF_REMOTE --set-rpath $RPATH_REMOTE --set-interpreter $INTERPRETER_REMOTE ./extensions/ms-vscode.cpptools/bin/cpptools $PATCHELF_REMOTE --set-rpath $RPATH_REMOTE --set-interpreter $INTERPRETER_REMOTE ./extensions/ms-vscode.cpptools/bin/cpptools-srv $PATCHELF_REMOTE --set-rpath $RPATH_REMOTE --set-interpreter $INTERPRETER_REMOTE ./node echo "修复执行权限..." chmod +x ./extensions/ms-vscode.cpptools/LLVM/bin/clang-format ./extensions/ms-vscode.cpptools/bin/cpptools ./extensions/ms-vscode.cpptools/bin/cpptools-srv set +x EOF
几个可能要避的雷包括:如果bash访问不到code(提示查询版本失败),处理方案见脚本注释。
如果出现连接不上的情况:- 肉身登录PSN,执行
killall node
(跟你共用账号的人的server可能被误杀),关闭本地vscode
,执行安装脚本,重启 - 如果问题持续可以尝试直接删掉服务器的
.vscode-server
文件夹(你和跟你共用账号的人的插件和数据将丢失),重复步骤1。 - 如果问题持续,重复步骤1,2
- 如果问题持续,改用EMACS
2020.3.17: 昨天找到的的glibc还是有问题,修改了路径
2020.3.17: 今天上午找到的库还不全,又修改了路径
2020.9.05: 现在clang-format也需要patch了
路径改来改去的原因是不同的人手底下的库不太一样,有人的LD_LIBRARY_PATH
里面缺足够新的libstdc++
有的缺libutil
。。。
VSCode Remote是最近很火的一个跨平台远程编辑工具,特别适合不喜欢用vim之类的东西的人。由于psn的glibc版本比较旧,所以直接使用vscode remote连接psn会失败,这里给出配置的步骤:
- 在插件栏装好Remote - SSH
- 在remote栏点+号新建一个链接,随便选一个ssh_config的位置,如果需要的话可以把私钥拷过去,不然就手动输密码。
- 尝试连接remote
因为glibc版本的原因,这个过程会失败。
4. 通过任意ssh客户端登陆psn,会发现已经有一个.vscode-server的目录:
5. .vscode-server下面会有一个bin,bin下面有个名字奇怪的文件夹,文件夹里有一个GLIBC版本不匹配的node:[swmore@psn009 ~]$ ls .vscode-server/ bin [swmore@psn009 ~]$ ls .vscode-server/bin/ 78a4c91400152c0f27ba4d363eb56d2835f9903a [swmore@psn009 ~]$ ls .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/ bin extensions LICENSE node node_modules out package.json product.json server.sh [swmore@psn009 ~]$ ldd .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node) .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node) .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.5' not found (required by .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node) .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node) .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node) .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node: /lib64/libc.so.6: version `GLIBC_2.16' not found (required by .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node) .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node) linux-vdso.so.1 => (0x00007fffc6fff000) libdl.so.2 => /lib64/libdl.so.2 (0x000000366fe00000) librt.so.1 => /lib64/librt.so.1 (0x0000003670600000) libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003675e00000) libm.so.6 => /lib64/libm.so.6 (0x0000003670200000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003673e00000) libpthread.so.0 => /lib64/libpthread.so.0 (0x000000366fa00000) libc.so.6 => /lib64/libc.so.6 (0x000000366f600000) /lib64/ld-linux-x86-64.so.2 (0x000000366ee00000) [swmore@psn009 ~]$
- 对node文件进行patch,这里用了我在psn上翻出来的新版本glibc和patchelf:
/usr/sw-cluster/apps/Anaconda/anaconda3/bin/patchelf --set-rpath /usr/sw-cluster/apps/lib/glibc-2.17/lib64/:/usr/sw-cluster/apps/Anaconda/anaconda3/lib/ --set-interpreter /usr/sw-cluster/apps/lib/glibc-2.17/lib64/ld-linux-x86-64.so.2 node
- 重新连接remote:
就可以没羞没臊地用vscode remote了。
如果想要在psn上使用C/C++插件,会遇到的两个问题是:
- C/C++插件需要联网下载相关的工具。
- C/C++插件也依赖高版本的glibc。
第一个问题的解决方案是通过VSIX安装,去 https://github.com/Microsoft/vscode-cpptools/releases 下载
cpptools-linux.vsix
在C/C++插件的VSIX版本,并上传到PSN上,然后连接VSCode Remote,在插件面板选择通过VSIX安装插件:
然后在弹出的路径选择中选择刚刚下载的vsix文件。安装完成后会爆插件服务器启动失败的问题,这时候应该去找
~/.vscode-server/extensions/ms-vscode.cpptools-<版本号>/bin
,然后使用patchelf来补一下cpptools
和cpptools-srv
。/usr/sw-cluster/apps/Anaconda/anaconda3/bin/patchelf --set-rpath /usr/sw-cluster/apps/lib/glibc-2.17/lib64/:/usr/sw-cluster/apps/Anaconda/anaconda3/lib/ --set-interpreter /usr/sw-cluster/apps/lib/glibc-2.17/lib64/ld-linux-x86-64.so.2 cpptools /usr/sw-cluster/apps/Anaconda/anaconda3/bin/patchelf --set-rpath /usr/sw-cluster/apps/lib/glibc-2.17/lib64/:/usr/sw-cluster/apps/Anaconda/anaconda3/lib/ --set-interpreter /usr/sw-cluster/apps/lib/glibc-2.17/lib64/ld-linux-x86-64.so.2 cpptools-srv /usr/sw-cluster/apps/Anaconda/anaconda3/bin/patchelf --set-rpath /usr/sw-cluster/apps/lib/glibc-2.17/lib64/:/usr/sw-cluster/apps/Anaconda/anaconda3/lib/ --set-interpreter /usr/sw-cluster/apps/lib/glibc-2.17/lib64/ld-linux-x86-64.so.2 ../LLVM/bin/clang-format
然后重新启动vscode即可远程使用C/C++插件,这对老年人编程还是相当友好的。
- 肉身登录PSN,执行
-
赞
-
@段晓辉 居然没马上想到来论坛搜一搜,感谢大佬
-
太赞了!!!感谢大佬。
-
请问我这里配置后还是会报“/usr/lib64/libstdc++.so.6”的错,我查了一下 Requires kernel >= 3.10, glibc >= 2.17, libstdc++ >= 3.4.18,也就是说libstdc++版本也是不够的,那么这个该怎么解决呢?
-
我这里已经解决了,在此记录一下:
除了patch这个node之外,
/usr/sw-cluster/apps/Anaconda/anaconda3/bin/patchelf --set-rpath /usr/sw-cluster/apps/lib/glibc-2.17/lib64/:/usr/sw-cluster/apps/Anaconda/anaconda3/lib/ --set-interpreter /usr/sw-cluster/apps/lib/glibc-2.17/lib64/ld-linux-x86-64.so.2 node
在bashrc中加入 :
export LD_PRELOAD="/usr/sw-cluster/apps/soft/gcc/8.3/lib64/libstdc++.so.6"
也就是用到/usr/lib64/libstdc++.so.6时,用这个高版本的gcc的库替换。
同理, /lib64/libc.so.6其实也可以用LD_PRELOAD来替换。
只是不知道这样会不会有什么别的问题。
-
@zombieiwndy 其实被逼到用patchelf的主要原因是ld-linux-x86-64.so.2太老了,所以要
--set-intepreter
。既然都要patch了那我就一起加上rpath算了。。。
可能是登陆节点不同的问题吧。。。
或者是你的环境变量里有什么东西改掉了rpath里面的libstdc++
-
请问一下,为什么patch这个node的时候说stat: No such file or directory呢,萌新求助
-
挖坟,直接提供本地安装脚本。
-
补充+提问:
补充:
在运行脚本与连接psn时,经常会出现
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
且删了known_hosts里面的对应内容后,依然会反复添加反复出现,暂时找到的解决方法是将known_hosts文件设置成只读提问:
@swmore 您好,我用您的脚本在配置环境的时候,还是出现了Missing GLIBC >= 2.17!的问题,如下图所示:luanzz@41.0.0.188's password: bf5285fc5193: running Missing GLIBCXX >= 3.4.18! Found versions 3.4.1 3.4.2 3.4.3 3.4.4 3.4.5 3.4.6 3.4.7 3.4.8 3.4.9 3.4.10 3.4.11 3.4.12 3.4.13 Missing GLIBC >= 2.17! Found version ldd (GNU libc) 2.12 bf5285fc5193$$1$$ Acquiring lock on /home/export/base/nsccwuxi_buaa/luanzz/.vscode-server/bin/da76f93349a72022ca4670c1b84860304616aaa2/vscode-remote-lock.luanzz.da76f93349a72022ca4670c1b84860304616aaa2 Found existing installation at /home/export/base/nsccwuxi_buaa/luanzz/.vscode-server/bin/da76f93349a72022ca4670c1b84860304616aaa2... Checking /home/export/base/nsccwuxi_buaa/luanzz/.vscode-server/.da76f93349a72022ca4670c1b84860304616aaa2.log and /home/export/base/nsccwuxi_buaa/luanzz/.vscode-server/.da76f93349a72022ca4670c1b84860304616aaa2.pid for a running server Looking for server with pid: 38728
但我看node里面链接的文件是已经被修复的状态:
[luanzz@psn003 da76f93349a72022ca4670c1b84860304616aaa2]$ ldd node linux-vdso.so.1 => (0x00007fffdc4ff000) libdl.so.2 => /usr/sw-cluster/apps/lib/glibc-2.17/lib64/libdl.so.2 (0x00002ac101807000) libstdc++.so.6 => /usr/sw-cluster/apps/Anaconda/anaconda3/lib/libstdc++.so.6 (0x00002ac101a0b000) libm.so.6 => /usr/sw-cluster/apps/lib/glibc-2.17/lib64/libm.so.6 (0x00002ac101d45000) libgcc_s.so.1 => /usr/sw-cluster/apps/Anaconda/anaconda3/lib/libgcc_s.so.1 (0x00002ac102044000) libpthread.so.0 => /usr/sw-cluster/apps/lib/glibc-2.17/lib64/libpthread.so.0 (0x00002ac102256000) libc.so.6 => /usr/sw-cluster/apps/lib/glibc-2.17/lib64/libc.so.6 (0x00002ac102473000) /usr/sw-cluster/apps/lib/glibc-2.17/lib64/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x0000003717c00000)
想问一下是我哪里操作的有问题嘛