在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(提示查询版本失败),处理方案见脚本注释。
    如果出现连接不上的情况:

    1. 肉身登录PSN,执行killall node跟你共用账号的人的server可能被误杀),关闭本地vscode,执行安装脚本,重启
    2. 如果问题持续可以尝试直接删掉服务器的.vscode-server文件夹(你和跟你共用账号的人的插件和数据将丢失),重复步骤1。
    3. 如果问题持续,重复步骤1,2
    4. 如果问题持续,改用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会失败,这里给出配置的步骤:

    1. 在插件栏装好Remote - SSH
      a1b6d09b-6c12-4493-b642-641bb61613d7-image.png
    2. 在remote栏点+号新建一个链接,随便选一个ssh_config的位置,如果需要的话可以把私钥拷过去,不然就手动输密码。
      37cc9665-ec71-49dc-a35b-c61a790e7f9f-image.png
    3. 尝试连接remote
      71c76568-504b-45a2-84e0-745e030b8ce6-image.png

    fc415b02-89f0-4beb-95e5-98d955058746-image.png
    因为glibc版本的原因,这个过程会失败。
    4. 通过任意ssh客户端登陆psn,会发现已经有一个.vscode-server的目录:
    2018d916-7eb9-4539-9385-bb91adb2e61a-image.png
    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 ~]$ 
    
    1. 对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
    
    1. 重新连接remote:
      854948ea-d755-4446-a35e-d7c663be2b21-image.png
      就可以没羞没臊地用vscode remote了。

    如果想要在psn上使用C/C++插件,会遇到的两个问题是:

    1. C/C++插件需要联网下载相关的工具。
    2. C/C++插件也依赖高版本的glibc。

    第一个问题的解决方案是通过VSIX安装,去 https://github.com/Microsoft/vscode-cpptools/releases 下载cpptools-linux.vsix在C/C++插件的VSIX版本,并上传到PSN上,然后连接VSCode Remote,在插件面板选择通过VSIX安装插件:
    b5c89939-b2fb-4db1-9bc1-f255b25a7b59-image.png
    然后在弹出的路径选择中选择刚刚下载的vsix文件。

    安装完成后会爆插件服务器启动失败的问题,这时候应该去找~/.vscode-server/extensions/ms-vscode.cpptools-<版本号>/bin,然后使用patchelf来补一下cpptoolscpptools-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++插件,这对老年人编程还是相当友好的。



  • 👍👍 👍



  • @段晓辉 居然没马上想到来论坛搜一搜,感谢大佬



  • 太赞了!!!感谢大佬。



  • 请问我这里配置后还是会报“/usr/lib64/libstdc++.so.6”的错,我查了一下 Requires kernel >= 3.10, glibc >= 2.17, libstdc++ >= 3.4.18,也就是说libstdc++版本也是不够的,那么这个该怎么解决呢?



  • @zombieiwndy

    我这里已经解决了,在此记录一下:

    除了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)
    
    

    想问一下是我哪里操作的有问题嘛


登录后回复